Vmp 静态分析: 第一步加载需要分析的代码(自己定制 PE Loader)
当你需要分析一个文件中的代码的时候,第一步就是需要打开这个文件,加载其代码到内存里面吧。当然我们这里只讨论一下 Windows 下的PE文件,其他操作系统下的执行文件请参考各自的文件说明。
如果要加载一个PE文件,首先会想到的是是什么? LoadLibrary? 奥,不,在我们这里不能使用 LoadLibrary, 因为LoadLibrary函数会执行很多代码,如果是dll 文件,就会执行dll 文件 EntryPoint 很多dll 在EntryPoint 中做了些额外的事情,可能修改执行环境。所以我们不能选择 LoadLibrary。那么带参数的 LoadLibraryEx 怎么样? LoadLibraryEx 也会试图解析 dll/exe 的 IAT,加载一些连接的 dll,有时候会给我们的分析造成麻烦。
所以,我们自己手工来加载 exe/dll 文件吧, 自己来实现 LoadLibraryEx 吧,记得,请不要加载 IAT中的任何 dll, 反正我们就只需要把 pe 文件摊开在内存中,其他的甚么都不要做,哦,重定位需要做一下的。
如何手工加载 pe文件? 这是搞安全工作的任务。请参考以下文章
1) 微软的msdn Microsoft Portable Executable and Common Object File Format Specification
2) Iczelion's PE Tutorial
3) ReactOS 对 PE文件的加载代码在 $ReactOs/trunk/reactos/dll/win32/kernel32/client/loader.c 里面实现
4) 看不懂英文? 百度呀,输入PE文件格式,手动加载 PE 文件等等,会列出千百万个相同的或者类似的搜索结果,当然注意开启防火墙,**的网络环境很厉害!!!!!!
当你加载完代码后,请分析一下,哪段代码是可以执行的,哪段地址所指的数据是不可执行的。这为以后我们的分析提供了必要的环境。Dll EntryPoint 在哪儿? 如果我要从dll 映像中读取一个dword 需要做些什么工作? 导入表,导出表的详细信息,什么地方导出什么函数,自己加载的好处就是,自己对代码数据的所知非常清楚。等等……
到此为止,我们就把PE文件,干干净净的加载到内存里面了
