Kiopler 发表于 2019-7-6 15:04

Win10 X86_64下EAT Hook以及其他堆积问题求助

    大家好,我是新人, 我有几个问题。
1. EAT HOOK在32位下以及运行成功,但不知为什么64位下一直失败.... 弄了好久心态都崩了... 拜托各位大神帮我调试一下,谢谢了!
#include <windows.h>
#include <cstdio>
#include <tchar.h>

BOOL EATHook(LPCTSTR szDllName, LPCTSTR szFunName, LPVOID NewFun) {
      DWORD addr = 0;
      DWORD index = 0;
      DWORD dwProtect;
      SIZE_T dwWritten = 0;
      HMODULE hMod = LoadLibrary(szDllName);
      if (NULL == hMod)
                return(FALSE);
      PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hMod;
      PIMAGE_OPTIONAL_HEADER pOptHeader = (PIMAGE_OPTIONAL_HEADER)((PBYTE)hMod + pDosHeader->e_lfanew + 24);
      PIMAGE_EXPORT_DIRECTORY pExpDes = (PIMAGE_EXPORT_DIRECTORY)((PBYTE)hMod + pOptHeader->DataDirectory.VirtualAddress);
      PULONG pAddressOfFunctions = (PULONG)((PBYTE)hMod + pExpDes->AddressOfFunctions);
      PULONG pAddressOfNames = (PULONG)((PBYTE)hMod + pExpDes->AddressOfNames);
      PUSHORT pAddressOfNameOrdinals = (PUSHORT)((PBYTE)hMod + pExpDes->AddressOfNameOrdinals);

      for (int i = 0; i < pExpDes->NumberOfNames; ++i) {
                index = pAddressOfNameOrdinals;
                LPCTSTR pFuncName = (LPTSTR)((PBYTE)hMod + pAddressOfNames);
                if (!_tcscmp((LPCTSTR)pFuncName, szFunName)) {
                        addr = pAddressOfFunctions;
                        break;
                }
      }
      VirtualProtect(&pAddressOfFunctions, 0x1000, PAGE_READWRITE, &dwProtect);
      pAddressOfFunctions = (DWORD)NewFun - (DWORD)hMod;
      WriteProcessMemory(GetCurrentProcess(), &pAddressOfFunctions, (LPCVOID)((LPDWORD)NewFun - (LPDWORD)hMod), 8, &dwWritten);
      VirtualProtect(&pAddressOfFunctions, 0x1000, dwProtect, &dwProtect);

      return(TRUE);
}

int WINAPI MyMessageBox(
      HWND    hWnd,
      LPCTSTR lpText,
      LPCTSTR lpCaption,
      UINT    uType
) {
      _tprintf("Hello, world!\n");

      return(0);
}

typedef int (WINAPI* LPFNMESSAGEBOX)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

int _tmain() {
      EATHook("USER32.dll", "MessageBoxA", MyMessageBox);
      HMODULE hDll = GetModuleHandle("USER32.dll");
      LPFNMESSAGEBOX lpMessageBox = (LPFNMESSAGEBOX)GetProcAddress(hDll, "MessageBoxA");
      if (NULL == lpMessageBox)
                return(-1);
      lpMessageBox(NULL, "Hello, EAT Hook", "Info", MB_OK);

      return(0);
}

2. 我想问一下,如果我在64位下远程线程注入,希望突破SESSION0隔离,能够注入到比如explorer.exe等系统服务进程里面该怎么办? 我用ZwCreateThreadEx注入发现要么注入成功但没反应,要么就是注入成功进程崩溃(explorer.exe的时候),要么就直接失败。(已获取Debug权限)。该怎么做呢,这到底是什么问题?

3. 远程线程注入时而成功时而失败这正常吗??

4. Windows下WDK编程有什么好的书推荐吗? 我在看<Windows驱动编程详解>,虽然WDM式驱动还用,但很老的DDK开发包现在都不用了。有什么更好一点的入门书籍吗? 谢谢。

谢谢各位的查看和帮助!!

无瑕黑心肠 发表于 2019-7-6 22:07

对于你的问题你可以参考我的回复:
1、32位进程地址范围是0x00000000 ~ 0xFFFFFFFF,而64位进程地址范围是0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF,所以你使用DWORD保存地址并不可靠(因为系统模块都是在高位地址的,你hook的时候地址被截断成DWORD类型,这必然会导致hook出错)。
2、远程线程注入是完全可行的,除非目标进程有防护或是检测。对于时而失败时而正常,第一条已经做出答复。
3、关于Windows驱动开发的中文书籍大概有那么几本(原文自encoderlee):
《Windows驱动开发技术详解》(强烈推荐先看这本)
《WindowsWDM设备驱动程序开发指南》(比较老了,2000年出版的,以win98、win2000为目标系统)
《Windows设备驱动程序WDF开发》(为数不多讲WDF的)
《Windows 7设备驱动程序开发》(为数不多讲WDF的,且比较新,这本书的英文版是2010年出版的,中文译版是2012年出版的)
《竹林蹊径:深入浅出windows驱动开发》
《寒江独钓:Windows内核安全编程》
《天书夜读:从汇编语言到Windows内核编程》
《Windows内核安全与驱动开发》(是《天书夜读》和《寒江独钓》的合订本以及升级版)
后面的这四本其实不太适合作为入门书籍,而适合作为进阶书籍,对一些基础的概念和原理的讲解没有《Windows驱动开发技术详解》那么多。

Kiopler 发表于 2019-7-7 07:51

无瑕黑心肠 发表于 2019-7-6 22:07
对于你的问题你可以参考我的回复:
1、32位进程地址范围是0x00000000 ~ 0xFFFFFFFF,而64位进程地址范围是 ...

谢谢大神!!!!我会去试一下{:1_921:}

Kiopler 发表于 2019-7-7 07:53

无瑕黑心肠 发表于 2019-7-6 22:07
对于你的问题你可以参考我的回复:
1、32位进程地址范围是0x00000000 ~ 0xFFFFFFFF,而64位进程地址范围是 ...

谢谢大神!!{:1_921:} 我会去尝试下
页: [1]
查看完整版本: Win10 X86_64下EAT Hook以及其他堆积问题求助