写这篇文章的目的是想让大家了解如何利用现有的工具来优化脱壳后的程序。因为要让脱壳优化过的程序可以用汉化工具正常汉化的话,要求要稍微高一些,我就基于优化后的文件可正常用汉化工具汉化这样的目标来讲解。这篇文章主要是为新手服务的,所以肯定比较罗唆,高手可以略过。
这篇文章中我采用 dwing 的 WinUpack 0.39 final 讲述。采用 WinUpack 来讲解的原因主要是这款壳把 PE 头搞得很让人郁闷,修复其它脱壳后的程序不需要修复 PE 文件头,而修复 WinUpack 却要考虑修复 PE 头的问题,而且这个壳加壳后把原程序的各个区段都合并了,修复的步骤要多一些,这样也方便大家了解的更详细一点。我准备分两部分来讲述,第一部分我采用 WinUpack 0.39 final 来给我自己用 MASM 写的一个示例程序加壳,然后来进行脱壳优化,第二部分直接讲解 WinUpack 0.39 final 中的那个中文版 WinUpackC.exe 的脱壳优化。其实本来直接写 WinUpackC.exe 的脱壳优化就可以了,不过我开始的时候没准备写 WinUpack 主程序的脱壳,写到后来才发现用自己写的示例程序加壳后再谈脱壳后的优化,有点自说自话的感觉,所以临时决定加一个 WinUpack 主程序的脱壳优化。
一、示例程序的脱壳优化
1、脱壳
这里的目标程序是我用 MASM 写的一个对话框的简单例子,我采用 WinUpack 的默认选项把原程序 test.exe 加壳,加壳后的程序名为 test1.exe,大小由原来的 6.5K 变为 4.4K。因为 WinUpack 给程序加壳时修改了 PE 头的缘故,普通 OD 可能加载不了用 winUpack 加壳后的程序,所以我们换用看雪兄修改的 OllyICE 载入加壳后的 test1.exe,会出现一个“32 位可执行文件格式错误或未知”的错误对话框,不用管,点确定,又出现一个“无法在内存中分配 XXXXX 字节”的错误对话框,继续点确定,我们停在这里:
00401018 > BE B0114000 MOV ESI,test1.004011B0
0040101D AD LODS DWORD PTR DS:[ESI] ; ESI地址处的值就是OEP
0040101E 50 PUSH EAX
|
WinUpack 的壳比较好脱,F8 到上面的第二条指令时,ESI 所显示的值就是存放 OEP 的地址。我这里在信息窗口中看到的是以下内容:
DS:[ESI]=[004011B0]=00401000
|
现在我在反汇编窗口中按 CTR+G 直接来到地址 00401000 处,按 F4,就停在 OEP 处了:
00401000 6A 00 PUSH 0
00401002 E8 79010000 CALL test1.00401180 ; JMP 到 kernel32.GetModuleHandleA
00401007 A3 1C304000 MOV DWORD PTR DS:[40301C],EAX
|
现在我们用 LordPE 完全转存 test1.exe 的进程,另存为 dumped.exe,现在可以看到这个 dumped.exe 大小有 64K 了。不要关 OD,打开 ImportREC,选择进程 test1.exe,OEP 填入 1000,选“自动查找 IAT”,会有一个“发现一些信息”的对话框,点确定,再点“获取输入表”,现在我们就得到了完整的输入表了。我们先来保存一下树文件,另存为 test_tree.txt。不要关 OD 和 ImportREC,让它们都暂时开在那,先复制一份我们刚才用 LordPE 完全转存出来的 dumped.exe 备份。
2、根据对齐值分析区段中的内容
在开始之前,我们先了解一下对齐的一些概念:文件区块有两种对齐值,一种是磁盘文件中的,另一种是内存中的。PE文件被映射到内存时,区块总是至少以一个页边界为开始,在x86系统中,每个内存页的大小是4K,也就是0x1000字节,所以在x86系统中,PE文件区块的内存对齐值一般等于0x1000,每个区块按0x1000之倍数内存偏移位置开始。另一种是磁盘对齐值,这个实例磁盘对齐值是0x1000,每个区块按0x1000之倍数的文件偏移位置开始。有时为了使磁盘文件更小些,你可以用0x200对齐值。
共4页: 上一页 1 [2] [3] [4] 下一页
|