偶然翻到这帖子,为了帮助那些不理解的人,忍不住废话几句。
我想楼主的本意是讲为什么在系统DLL的API地址处断不到想断的函数。
因为Themida/WinLicense对kernel32.dll、user32.dll和advapi32.dll进行了特别处理,所以断不下来。在其他保护软件中也可以看到类似方法。
至于示例代码就不要追究了,并不严谨!说穿了就是File Offset和VA的转换问题。
楼主用了:CreateFileA, VirtualAlloc, ReadFile;而YangCoCol更是“偷懒”:VirtualAlloc, memcpy。大家最关心的问题是:重定位,IAT等都没有处理,为什么它能跑起来?
那你需要想一想“重定位”到底发生了没有、IAT到底是Thunk还是Bind,就不难理解了。
Themida/WinLicense作为一个成熟的产品,可不能这样简单处理。
它用了三个API来载入文件映像:CreateFile,CreateFileMapping和MapViewOfFile,接下来完成必须做的初始化工作。剩下的各种转换等函数借用了"
Matt Pietrek"的
PEDUMP代码。
因为GetProcAddress不能用了,那么TMD/WL是怎么取得这三个系统DLL里API的地址呢?大概象这样(借用一下楼主的原型):
FARPROC GetApiAddr(LPVOID lpFileImageBase, DWORD FuncNameHash, CHAR FuncNameFirstChar);
其中lpFileImageBase是DLL文件映像基址,在一个目标中可以断VirtualAlloc配合ImageSize得到,或者等目标跑起来后在"Memory Map"中按ImageSize很容易地找到。
FuncNameHash是它根据各API函数名计算的一个Hash,计算方法在各版本中基本相同。
FuncNameFirstChar是API函数名的第一个字符,用于限制搜索范围,缩短时间。
这样你可以自己生成一张对照表:FuncName, APIAddr, FuncNameHash 。断到你想断的任何一个API。我在以前关于WinLicense的帖子中曾经提过。