YuriSizuku / win-MemoryModule

A flexible PE loader, loading module in memory. Most of the functions can be inline, compatible for shellcode.
MIT License
172 stars 66 forks source link

GetProcAddress 32位报错 #10

Closed 793359277 closed 1 month ago

793359277 commented 1 month ago

作者您好, 我这边测试将DLL附加到区段, 64位EXE没有问题, 但是32DLL附加32EXE虽然写出成功, 但运行会崩溃, x32dbg调试看堆栈发现是在调用GetProcAddress时, 参数2 序号不正常导致的

0019FF08 77130000 ws2_32.77130000 0019FF0C 8040B076 //这不是序号的格式, 也不是可访问的函数名字符串地址

用studyPE查看导入表中的WS2_32: IAT ThunkFoa ThunkVal Hint Function Name 0004C420 0005EE78 80000074 - 00000074
序号应该是0x74 调试器中手动将8040B076改为0x74, 运行正常, g_membindiat_code32该更新了

32bug

还有这里判断最高位写错了, 应该判断_addr image winpe_membindiat 32bug_1

YuriSizuku commented 1 month ago

多谢指出问题。有没有可以复现的example? 调用哪个dll的哪个函数, 我测试一下。

793359277 commented 1 month ago

多谢指出问题。有没有可以复现的example? 调用哪个dll的哪个函数, 我测试一下。

就普通的32位DLL, 只要是序号导出的都会报错

// dllmain.cpp : 定义 DLL 应用程序的入口点。

include "winsock2.h"

pragma comment(lib, "WS2_32.lib")

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBoxA(NULL, "DLL_PROCESS_ATTACH", "DLL", MB_ICONASTERISK); htons((USHORT)0x1234); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }

793359277 commented 1 month ago

内存加载DLL的话, 改这里就行, 绑区段那种方式就得改g_membindiat_code32了

2222

YuriSizuku commented 1 month ago

我修复了这个bug, 重新生成了shellcode, 理论上应该可以了

793359277 commented 1 month ago

我修复了这个bug, 重新生成了shellcode, 理论上应该可以了

测试正常了, 非常感谢!