事情原由是我一次请 曾半仙 帮我测试一个软件脱壳后汉化的非标字体情况。getcommandlinea
先是废话:
事情原由是我一次请 曾半仙 帮我测试一个软件脱壳后汉化的非标字体情况。
后来 半仙 立即提示我的那个脱壳后的程序无法运行,提到了 ImportREC 自动修复导入表时的错误问题,而后来ImportREC作者 MackT/uCF 出的修正版(经 Cao_Cong 兄提醒,是MaRKuS_TH-DJM修正了这个版本而非作者)也只是修复了一个导入表函数,我这个菜鸟在 半仙 的帮助提示下,用 Ollydbg查看 IAT 中的函数与ImportREC 实际保存的 导入表目录树 对比了一下,发现真如 半仙 所说的:ImportREC的自动修复大约有 20个左右的函数错误。而这些可能引起汉化后跨平台等问题。
这个 ImportREC 的修正版目前看似乎修正了一个函数,将 RestoreLastError替换为SetLastError,因为在 XP 下脱壳后用 ImportREC 自动修复就会使用 RestoreLastError,而xp以前的操作系统似乎没有这个函数,换为 SetLastError 后可以跨平台(9x)了。
如我上面所说:修正版的 ImportREC 自动修复时,似乎仍然有错误约 20 个左右,而 Ollydbg 查看时IAT中的函数是软件原程序真正使用到的函数,应该保持与软件用到的原始函数相同就没问题了。(当然,有些猛壳加密/破坏IAT,需要高深技术用Ollydbg来还原/修复IAT,我这个菜鸟也不懂,暂时不去说这些目前非我能及的内容)这样我们汉化脱壳后的文件应该可以避免跨平台问题。
废话结束,谈点我这菜鸟根据咱们 半仙 提示后的对比情况吧:
找一个 Win98 下的记事本程序 Notepad.exe,我用 Aspack2.12r加壳压缩(当然有自动脱壳工具,我只是举个例子),然后用 Ollydbg 手脱时到达 OEP,先用 LordPE来完全转储(DumpFull)下进程保存为 dumped.exe,然后看下图:
(这里按照“看雪学院”老大 kanxue 的〈脱壳基础知识入门〉-9 “手动确定 IAT 的地址与大小”方法来查看IAT的起始处和结尾处,以及大小)看到那个 kernel32.GetCommandLineA 函数调用,在命令栏输入 d4063e4然后回车,内存区就会转到这个函数调用地址,接着在内存区地址(Address)右键鼠标,在弹出菜单中选择 Long-Address,内存区就会以 Long 长型显示方式表达 IAT 函数列表,看图:
变成 Long 长型显示列表函数:
各 DLL 之间以四个 00 间隔,然后拉动滚动条向上翻,一直到没有出现 DLL 函数的内容,往下翻,同样直到没有DLL函数内容,从第一个 DLL 到最后一个 DLL 函数内容,把这之间的内容全选,复制保存为org.txt中以待一会儿后的对比吧。
再用 ImportREC 填入 OEP,自动搜索 IAT 并获取导入表,但暂时不要修复转储(FixDump)的dumped.exe 文件。getcommandlinea
ImportREC 中没有显示 无效 的指针,都是 yes,那么现在按 Save Tree(保存列表树) 为fix.txt吧。按图中1/2/3 的步骤保存导入表列表树文件。
对比 org.txt 和 fix.txt,发现以下几处不同:
org.txt fix.txt
kernel32._lwrite kernel32._hwrite
kernel32.lstrcmpiA kernel32.lstrcmpi
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28582-1.html
不会再拖了
用铁的事实证明了制定建造出众多鬼城的决策是多么的高瞻远瞩
虽说吨位超过了