YLLEN

要去看埃菲尔铁塔的顶

欢迎关注本人微博: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


https://github.com/black4yl/PeShell




评论

© YLLEN | Powered by LOFTER