• INLINE HOOK 简单实现


    为什么会有INLNE HOOK呢?

    它比起IAT HOOK会比较隐蔽

    需要注意的事项:

    1、在进行INLINE HOOK的时候一定要注意堆栈的平衡

    2、整个过程要有来回,CALL OR JMP跳过去之后还需要RETN OR JMP跳回来

    3、了解 E8 E9 跳转的计算公式

    4、发现无法修改可以尝试用VirtualProtect对物理页进行修改

    #include<Windows.h>
    #include<cstdio>
    
    typedef struct _Register{
    	DWORD eax;
    	DWORD ecx;
    	DWORD edx;
    	DWORD ebx;
    	DWORD esp;
    	DWORD ebp;
    	DWORD esi;
    	DWORD edi;
    }Register;
    
    _Register reg = { 0 };
    DWORD dwPlusFunctionAddr;
    DWORD dwPlusFunctionHookAfterAddr;
    PBYTE pEditedAddr;
    DWORD dwX;
    DWORD dwY;
    
    extern "C" _declspec(naked)void HookProc(){
    	__asm{
    		pushad;
    		pushfd;
    	}
    
    	__asm{
    		mov reg.eax, eax;
    		mov reg.ecx, ecx;
    		mov reg.edx, edx;
    		mov reg.ebx, ebx;
    		mov reg.esp, esp;
    		mov reg.ebp, ebp;
    		mov reg.esi, esi;
    		mov reg.edi, edi;
    
    		mov eax, DWORD ptr SS : [esp + 0x28];
    		mov dwX, eax;
    		mov eax, DWORD ptr SS : [esp + 0x2C];
    		mov dwY, eax;
    	}
    
    	printf("%x %x %x %x %x %x %x %x
    ", reg.eax, reg.ecx, reg.edx, reg.ebx, reg.esp, reg.ebp, reg.esi, reg.edi);
    	
    	printf("dwX: %d, dwY: %d 
    ", dwX, dwY);
    	MessageBox(NULL, TEXT("it's my inline HoOk"), 0, MB_OK);
    
    
    	__asm{
    		popfd;
    		popad;
    	}
    
    	__asm{
    		push ebp;
    		mov ebp, esp;
    		sub esp, 40h;
    	}
    
    	__asm{
    		jmp dwPlusFunctionHookAfterAddr;
    	}
    
    }
    
    void InstallInlineHook(DWORD dwPlusFunctionAddr, DWORD dwHookLength){
    
    	//保存原有的dwHookLength个字节
    	pEditedAddr = (PBYTE)malloc(dwHookLength);
    
    	memcpy(pEditedAddr, (LPVOID)dwPlusFunctionAddr, dwHookLength);
    
    	DWORD dwOldProtect;
    	BOOL ret = VirtualProtect((LPVOID)dwPlusFunctionAddr, dwHookLength, PAGE_EXECUTE_READWRITE, &dwOldProtect);
    	if (!ret){
    		printf("VirtualProtect Failed, the error is %d 
    ", GetLastError());
    		return;
    	}
    
    	//获取HOOK的地址
    	DWORD dwHookProc = (DWORD)HookProc;
    
    	//计算JMP之后的地址
    	DWORD dwJmpAddr = dwHookProc - (dwPlusFunctionAddr + 5);
    
    	//初始化0x90数据
    	memset((PBYTE)dwPlusFunctionAddr, 0x90, dwHookLength);
    
    	//进行替换跳转的硬编码
    	*(PCHAR)dwPlusFunctionAddr = 0xE9;
    	*(PDWORD)((PCHAR)dwPlusFunctionAddr + 1) = dwJmpAddr;
    
    }
    
    void UninstallInlineHook(DWORD dwPlusFunctionAddr, DWORD dwHookLength){
    	DWORD dwOldProtect;
    	BOOL ret = VirtualProtect((LPVOID)dwPlusFunctionAddr, dwHookLength, PAGE_EXECUTE_READWRITE, &dwOldProtect);
    	if (!ret){
    		printf("VirtualProtect Failed, the error is %d 
    ", GetLastError());
    		return;
    	}
    	memcpy((PVOID)dwPlusFunctionAddr, pEditedAddr, dwHookLength);
    	free(pEditedAddr);
    	pEditedAddr = NULL;
    }
    
    int plus(int x, int y)
    {
    	return x + y;
    }
    
    int main(int argc, char* argv[]){
    	dwPlusFunctionAddr = (DWORD)0X004116C0;
    	dwPlusFunctionHookAfterAddr = dwPlusFunctionAddr + 6;
    	InstallInlineHook(dwPlusFunctionAddr, 6);
    	plus(2, 3);
    	UninstallInlineHook(dwPlusFunctionAddr, 6);
    	plus(3, 4);
    	
    	return 0;
    
    }
    

  • 相关阅读:
    Matrix-tree 定理的一些整理
    多项式
    多项式
    vijos 1641 Vs Snowy
    noip 提高组 2010
    军训有感
    我的将军啊
    洛谷 P3302 [SDOI2013]森林
    关于线段树
    关于KMP
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/13382773.html
Copyright © 2020-2023  润新知