Примеры скриптов для IDA Pro

Материал из Wiki.

 

Если вы оказались здесь по ошибке, просто нажмите кнопку назад вашего браузера.

Для облегчения разборки и для общего развития можно привести пару - тройку скриптов для IDA Pro. Текст скриптов следует скопировать во вновь созданный файл и обозвать его как-нибудь, дав расширение .idc. Запускать когда вся прошивка (original.bin и awardext.bin) уже загружены в Иду
[list] [*]Скрипт разработан под IDA Pro Version 4.5.1.770 [*]Никакой оптимизации скриптов не проводилось! Работает - и ладно. [/list]

Пример первый. Скрипт для нахождения (скажем так) таблицы вызовов подпрограмм POST.

static main()
{
auto fbase, ebase, f, e, ea, adr, i, tab1; // определение переменных
fbase=0xF000;
ebase=0xE000;
f=fbase<<4; // определение базы сегмента F
e=ebase<<4; // определение базы сегмента Е
i=1;

MakeName(f+0xF80D,"Main_BIOS_Entry_Point"); // даем имя
MakeCode(f+0xF80D);Wait(); // создаем инструкцию
Message(">%x\n",Rfirst(f+0xF80D)); // проверяем куда указывает переход
ea=Rfirst(f+0xF80D); // загоняем адрес перехода в переменную
Jump(ea); // переход
MakeName(ea,"Begin_Main_BIOS"); // даем имя
MakeCode(ea);Wait();
adr=FindBinary(ea,1,"68 00 E0"); // находим адрес инструкции push E000
Message(">%x\n",adr-3); // как раз перед ней находим нужное число
Jump(adr-3);
ea=(adr-3)-0xf0000;
Message(">%x\n",e+GetOperandValue(f+ea,1)); // проверяем, его ли мы нашли
OpOff(f+ea,1,e); // делаем из числа смещение
adr=e+GetOperandValue(f+ea,1); // загоняем число в переменную
Jump(adr); // переход
MakeName(adr,"exec_POST_TBL"); // имя
MakeCode(adr);Wait();
ea=FindBinary(adr,1,"BF"); // находим адрес mov di, TBL
OpOff(ea,1,e); // делаем офсет
adr=GetOperandValue(ea,1);
MakeName(e+adr,"POST_TBL");
// Нумерация таблицы ПОСТ-кодов
ea=adr;
MakeWord(e+ea);
while (Word(e+ea)!=0x0)
{
adr=e+Word(e+ea);
Message(">%x\n",adr);
MakeName(adr,"Post_"+form("%x",i));
MakeUnkn(adr,1);Wait(); // Перед созданием кода стираем старые данные (на всякий)
MakeCode(adr); Wait();
OpOff(e+ea,0,e);
ea=ea+2;
MakeWord(e+ea);
i=i+1;
};
}


Пример второй. Скрипт для нахождения всех (ну или почти всех) межсегментных переходов.

static main()
{
auto fbase,ebase,a_base,f,e,ea,adr,a,fs; // определение переменных
fbase=0xF000;
ebase=0xE000;
a_base=0x1000;
f=fbase<<4;
e=ebase<<4;
a=a_base<<4;

Message(">Ищем межсегментные переходы F000:EC30h\n");
ea=a; //начинаем поиск с 1000:0000h
do
{
adr=FindBinary(ea,1,"EA 30 EC 00 F0"); // adr адрес jmp $F
adr=adr-0x9; //
MakeCode(adr);Wait();Wait();
Message(">%x\n",adr+6); // вывод на печать найденного адреса
ea=GetOperandValue(adr+6,0); // в еа значение смещения
MakeUnkn(f+ea,1);Wait(); // для устранения непоняток делаем кирдык старому коду
MakeCode(f+ea); Wait(); // делаем новый код
OpOff(adr,0,SegStart(adr));
OpOff(adr+6,0,f);
Jump(f+ea);
ea=adr+0xF; // отходим от старого места
}
while ((SegStart(adr)==e)|(SegStart(adr)==a));


Message(">Ищем межсегментные переходы E000:8000h\n");
ea=a; //начинаем поиск с 1000:0000h
do
{
adr=FindBinary(ea,1,"EA 00 80 00 E0"); // adr адрес jmp $F
adr=adr-7; //
MakeCode(adr);Wait();
Message(">%x\n",adr+4); // вывод на печать найденного адреса
ea=GetOperandValue(adr+4,0); // в еа значение смещения
MakeUnkn(f+ea,1);Wait(); // для устранения непоняток делаем кирдык старому коду
MakeCode(f+ea); Wait(); // делаем новый код
OpOff(adr+1,0,SegStart(adr));
OpOff(adr+4,0,f);
Jump(f+ea);
ea=adr+0xB; // отходим от старого места
}
while ((SegStart(adr)==e)|(SegStart(adr)==a));


Message(">Ищем межсегментные переходы в сегмент 1000:ххххh\n");
fs="53 54 44 5F 48 45"; //STD_HLPR
ea=a; //начинаем поиск с 1000:0000h
adr=FindBinary(ea,1,fs);
Message(">%x\n",adr);
if (adr==0x10020) fs="EA 09 00 00 10";
else fs="EA 02 00 00 10";
do
{
adr=FindBinary(ea,1,fs); // adr адрес jmp $1000
adr=adr-7; //
MakeCode(adr);Wait();
Message(">%x\n",adr+4); // вывод на печать найденного адреса
ea=GetOperandValue(adr+4,0); // в еа значение смещения
MakeUnkn(a+ea,1);Wait(); // для устранения непоняток делаем кирдык старому коду
MakeCode(a+ea); Wait(); // делаем новый код
OpOff(adr+1,0,SegStart(adr));
OpOff(adr+4,0,a);
Jump(a+ea);
ea=adr+0xB; // отходим от старого места
}
while ((SegStart(adr)==e)|(SegStart(adr)==f)|(SegStart(adr)==a));
}