要去看埃菲尔铁塔的顶
欢迎关注本人微博:t.cn/RGSLVUk
本次来处理程序动态获取其所需API地址,思路很多,可以去正常程序的IAT中找,也可以自己直接去DLL中找。
大概步骤,获取到Kernel32.dll模块,从模块导出表中搜索函数地址(从名称表获取序号,更具序号在IAT中找到对应项)。
那么如何获取Kernel32.dll模块了,可以利用PEB
_asm
{
mov eax,fs:[30h] //;PEB的地址
mov eax, [eax + 0ch] //;Ldr的地址
mov esi, [eax + 01ch] //;Flink地址
lodsd
mov eax, [eax + 08h] //;eax就是kernel32.dll的地址
ret
}
PEB是与进程相关的,其偏移 +0CH处是 _PEB_LDR_DATA 结构
+0x000 Length : Uint4B
+0x004 Initialized : UChar
+0x008 SsHandle : Ptr32 Void
+0x00c InLoadOrderModuleList : _LIST_ENTRY
+0x014 InMemoryOrderModuleList : _LIST_ENTRY
+0x01c InInitializationOrderModuleList : _LIST_ENTRY
+0x024 EntryInProgress : Ptr32 Void
+0x028 ShutdownInProgress : UChar
+0x02c ShutdownThreadId : Ptr32 Void
其InInitializationOrderModuleList 字段指向程序导入模块链,是个双向链表
_LIST_ENTRY 结构,每一项都是 LDR_DATA_TABLE_ENTRY 结构
获取到FLINK后 +8 指向ModuleHandle 就是模块基地址,然后以PE文件解析就可以得到这个
导出表,有了导出表 然后 获取 GetModuleHandle LoadLibrary ,GetProcAddress就可
获取所有API地址。
利用内存搜索也可以获取Kernel32.dll ,根据导出表 name字段 进行匹配在 0x7ff0000一直向上搜索0x10000范围也可以搜索到,主要是在获取导出表时 需要自己实现ProbReadMerroy函数,也就是判断这个内存是不是有读取权限 。。。
可以给任意PE文件 加壳
会有简单的文件校验,入口点检测,其他功能以后再加。
代码已经托管到github