__asm { push eax mov eax, dword ptr fs : [0x30] // eax = PEB的地址 mov eax, [eax + 0x0C] // eax = 指向PEB_LDR_DATA结构的指针 mov eax, [eax + 0x1C] // eax = 模块初始化链表的头指针InInitializationOrderModuleList mov eax, [eax] // eax = 列表中的第二个条目 mov eax, [eax] // eax = 列表中的第三个条目 mov eax, [eax + 0x08] // eax = 获取到的Kernel32.dll基址(Win7下第三个条目是Kernel32.dll) mov dwKernel32Addr, eax pop eax }
PEB--->LDR--->InLoadOrderModuleList
通过循环遍历LDR_DATA_TABLE_ENTRY中的BaseDllName找到Kernel32.dll
找到Dll ntdll!_LDR_DATA_TABLE_ENTRY +0x030 DllBase得到文件内存首地址
通过PE文件导入表的解析 找到MessageBox的地址
转发函数的函数名格式 <DLL name>.<function>