в который будет записан сгенерированный
unsigned char prolog_1[]={0x55h,0x89,0xE5,0x83,0xEC};
unsigned char prolog_2[]={0x55,0x89,0xE5,0x57,0x56};
// буфер в который будет записан сгенерированный код
unsigned char buf_code[1024];
// определяем адрес перехватываемой функции
p = msym(base, fnc_name);
// если в начале перехватываемой функции расположен prolog_1
// внедряем в ее начало call на prepare_prolog_1
if (!memcmp(p,prolog_1,sizeof(prolog_1))
call_r(base, fnc_name, "gets", 0);
// если в начале перехватываемой функции расположен prolog_2
// внедряем в ее начало call на prepare_prolog_2
if (!memcmp(p,prolog_1,sizeof(prolog_2))
call_r(base,fnc_name,"gets", offset prapare_prolog_2-offset prepare_prolog_1);
Листинг 10 фрагмент программы-инсталлятора, анализирующей пролог перехватываемой функции и устанавливающей обработчик с соответствующим прологом
; // заносим номер "нашего" пролога в регистр EAX,
; // чтобы перехватчик знал какой ему пролог эмулировать
; // ВНИМАНИЕ! этот код засирает EAX
и не работает на fastcall-функциях,
; // для поддержки которых регистры трогать нельзя, а номер пролога класть на стек,
; // восстанавливая его перед передачей управления оригинальной функции
prepare_prolog_1:
MOV EAX, 0x1
JMP short do_begin
prepare_prolog_2:
MOV EAX, 0x2
JMP short do_begin
prepare_prolog_n:
MOV EAX, 0x2
JMP do_begin
do_begin:
// ОСНОВНОЙ КОД ПЕРЕХВАТЧИКА
// ДЕЛАЕМ ЧТО ЗАДУМАНО
// [ESP+4]+5 содержит адрес вызванной функции
// это поможет нам отличить перехваченные функции друг от друга
…
…
…
// ПЕРЕДАЧА УПРАВЛЕНИЯ ПЕРЕХВАЧЕННОЙ ФУНКЦИИ
// С ЭМУЛЯЦИЕЙ ЕЕ "РОДНОГО" ПРОЛОГА
DEC EAX
JZ prolog_1
DEC EAX
JZ prolog_2
…
prolog_1: ; // эмулируем выполнение пролога типа PUSH EBP/MOV EBP,ESP/SUB ESP,XXX
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий