rendered paste bodyEditIATLocal proc ModName:DWORD, Orig:DWORD, New:DWORD, ModHandle:DWORD
LOCAL OldProtect:DWORD
;Получаем адрес таблицы директорий
mov eax,ModHandle
assume eax:ptr IMAGE_DOS_HEADER
add eax,[eax].e_lfanew
add eax,4
add eax,sizeof IMAGE_FILE_HEADER
mov edi,eax
assume edi:ptr IMAGE_OPTIONAL_HEADER
lea edi,[edi].DataDirectory
mov eax,edi
;Получаем адрес таблицы импорта
assume eax:ptr IMAGE_DATA_DIRECTORY
lea eax,[eax+(sizeof IMAGE_DATA_DIRECTORY)*IMAGE_DIRECTORY_ENTRY_IMPORT]
.IF dword ptr [eax]==0
move ax,FALSE
ret;Нет таблицы импорта
.ENDIF
mov esi,ModHandle
add esi,dword ptr [eax];В esi - адрес таблицы импорта
assume esi:PTR IMAGE_IMPORT_DESCRIPTOR
NextDLL:;очередная запись в таблице импорта
.IF [esi].Name1==NULL;Конец таблицы импорта?
mov eax,FALSE
ret
.ENDIF
mov ecx,[esi].Name1
add ecx,ModHandle
invoke lstrcmpi,ModName,ecx;тот ли это модуль?
.IF EAX!=0
add esi,sizeof IMAGE_IMPORT_DESCRIPTOR
jmp NextDLL
.ENDIF
;Если дошли до сюда, то нашли имя модуля
mov edi,ModHandle
add edi,[esi].FirstThunk;В EDI - IAT
assume edi:PTR IMAGE_THUNK_DATA
NextFunction:;перебираем все импортируемые функции
.IF [edi].u1.Function==0;IAT закончилась
add esi,sizeof IMAGE_IMPORT_DESCRIPTOR
jmp NextDLL
.ENDIF
mov eax,[edi].u1.Function
.IF Orig==eax;Нашли!!!
;Разрешим запись на нужную страницу
invoke VirtualProtect,edi,4,PAGE_EXECUTE_READWRITE,ADDR OldProtect
call GetCurrentProcess
mov ecx,eax
lea eax,New
;Сменим адрес функции на адрес обработчика
invoke WriteProcessMemory,ecx,edi,eax,4,NULL
;Воостановим прежние аттрибуты
invoke VirtualProtect,edi,4,OldProtect,ADDR OldProtect
mov eax,TRUE
ret
.ENDIF
add edi,sizeof IMAGE_THUNK_DATA
jmp NextFunction
EditIATLocal endp
EditIATGlobal proc ModName:DWORD, Orig:DWORD, New:DWORD
LOCAL Current:DWORD
LOCAL hSnap:DWORD
push offset NextMod
call GetBase
mov Current,eax;Получили хэндл своего модуля
mov ecx,eax
invoke CreateToolhelp32Snapshot,TH32CS_SNAPMODULE,NULL
mov hSnap,eax
mov ModEntry.dwSize,sizeof MODULEENTRY32
invoke Module32First,hSnap,offset ModEntry
NextMod:
mov eax,Current
.IF eax!=ModEntry.hModule;В своем модуле не будем перехватывать!
push ModEntry.hModule
push New
push Orig
push ModName
call EditIATLocal;Перехватываем в этом модуле
.ENDIF
invoke Module32Next,hSnap,offset ModEntry;Следующий модуль
.IF eax!=0
jmp NextMod
.ENDIF
invoke CloseHandle,hSnap
mov eax,1
ret
EditIATGlobal endp
;===============================================================================;