在我的上一篇帖子查找进程API内存地址的小程序中写了一个小工具,枚举进程的输入表函数地址,有朋友要我公布源代码,很惭愧,那个程序代码有待优化,就不公布了,这个帖子公布源代码,那个工具中用到的代码和这篇类似,可以作为相互参考。
看到老罗写的一篇“暴力搜索内存获取API地址”的帖子,很受启发,现在有些程序有保护,用我那个查找进程API内存地址的小程序可能读不了其进程,从而也就无法获取他们的API地址了。老罗的方法可以直接获取用户系统中的API地址,因为它不需要读取其他程序内存地址。按老罗的方法,查找API地址必须首先找到系统Dll的基址,老罗用的方法就是现在网上流行的3种之一,这里我用一种和网上流行的不一样的方法获取系统Dll基址,并将老罗未完成的搜索内存获取API地址未写的代码写出来。
思路:
1、学习过PE文件格式的童鞋应该知道,PE的头文件中就包含了PE文件的基址,那么我们直接读取Dll的PE中的基址不就可以轻松的得到Dll的基址了么,OK,go on
2、要得到Dll文件,首先要知道其地址,一般都放在C:\WINDOWS\system32文件夹中,有的童鞋马上会扔鞋子过来,我丫系统没装C盘呢,我丫系统不是XP呢
3、威武的Windos API来了,GetWindowsDirectory就可以得到系统目录,再在系统目录后加个\system32\xxx.dll就完美解决了
4、OK,找到系统Dll了,载入,读取其基址,读取其输出表RVA
5、然后根据输出表RVA和基址取输出表的FAT,FNT
6、再然后就是暴力男人狂搜FNT说指向的API名称,并和我们想要的API名称进行对比,找到后返回FAT找其地址
是不是很简单呢,同时聪明的童鞋们还可以发现,我们载入了系统Dll,那么直接在Dll中就可以找到我们想要的API地址,具体方法和内存中暴搜一样的,只是把基址换成我们读取的Dll文件在内存中的地址就行了
说了这么多废话,我们以查找开始“OpenFileMapping”这个函数地址为例,上代码:
invokeFAA_FindKernel32Path, addr szKernel32Pa