All pastes #80069 Raw Edit

Miscellany

public text v1 · immutable
·published 2006-07-06 00:57 UTC
rendered paste body
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
;===============================================================================;