среда, 7 декабря 2011 г.

IDA 5.60 PICode analyzer plugin for win64

а вот например под 64битной windows есть собственный вариант position-independent code, который выглядит приблизительно так (примерчик выдран из win32k.sys):
   lea     rax, cs:0FFFFF97FFF000000h
   mov     edx, r11d
   call    qword ptr [rax+r10*8+2C59A0h] ; 0FFFFF97FFF2C59A0h


здесь адрес FFFFF97FFF000000h указывает на самое начало PE модуля, т.е. в оригинале данная инструкция скорее всего выглядела как (использован синтаксис yasm):
lea rax, qword [ImageBase wrt rip]

IDA Pro например такой код не распознает и соотв-но не показывает ни адресов, ни cross-refs, что представляет собой некоторую проблему при анализе всякого. Поскольку perl под ida64 я так и не удосужился завести, а IDC считаю адовой упячкой (практически такой же как писон), пришлось вспомнить молодость и написать очередной native plugin таки на C++

Собственно алгоритм работы прост - проходимся по всем секциям, содержащим исполнимый код, ищем загрузку в некий регистр адреса начала PE модуля, и далее ищем в некотором количестве нижеследующих инструкций те, что используют этот регистр как base register или как index register с нулевым SIB scale. Для найденных проставляем cross ref и новый вычисленный адрес в комментарии. Все происходит за один проход, поэтому работает относительно быстро (на файле размером 3.8Mb порядка 40 секунд на моей рабочей машине)

Поскольку старые добрые надежные компиляторы с IDA Pro 5.60 работать перестали, собирается все богатство на vs2008

Комментариев нет:

Отправить комментарий