EditIATLocal 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 ;===============================================================================;