ESP定律到达OEP,重新分析代码块

在菜单栏中找到OllyDump插件,该插件的窗口的弹了出来,有一些选项可供我们修改,我们可以对Base of Code进行修改,这里Base of Code = 4000(RVA),该选项相当于对代码段进行了指定,不需要像上一章那样在数据窗口中的PE头中去修改。我们应该还记得ASPack加壳程序的原程序代码段并不是第一个区段,而是第三个区段,4000(RVA),即404000(VA),OEP也是404000,刚好在代码段中,所以Base of Code这一项我们不需要修改。我们可以看到下面还有一个选项Rebuild Import(重建IAT),跟IMP REC的功能类似,提供了两种方式来重建IAT,这个选项对于一些简单的壳还是有效的,大家可以试一试。

我们这里就不使用这个功能了,去掉Rebuild Import的对勾,为了保险起见,我们还是使用IMP REC来修复IAT。

单击dump按钮。

这里我们将dump出来的文件命名为dumpaspack.exe。这里我们没有修复IAT直接运行起来,看看会不会报错。

提示无效的win32程序,我们需要修复IAT,打开IMP REC,定位到UnPackMe_ASPack2.12所在的进程,当前该进程停在了OEP处。

我们回到OD中,我们需要定位IAT的起始地址以及大小,还有OEP的值。

现在OEP的值我们知道了,等于404000,IMP REC要求的是RVA(相对虚拟地址),404000(VA:虚拟地址) - 400000(映像基址) = 4000(RVA)。

接下来我们需要定位IAT的起始地址以及大小,我们随便找一个API函数的调用处,好,OEP的下面正好有一处CALL GetModuleHandleA

选中CALL GetModuleHandleA这一行,单击鼠标右键选择-Follow。

这里我们可以看到直接来到了GetModuleHandleA的入口点处,并没有间接跳转(并不是所有的程序调用API函数都是通过间接跳转来实现的,该程序就没有使用间接跳转)。

这里是通过一个间接CALL来调用API函数的。

显然,4011F4是IAT其中的一项,该内存单元中保存了GetModuleHandleA的入口地址。

我们直接搜索二进制串FF 25,看看能不能定位到跳转表。(但我搜索ff25却什么也没搜到不知道为什么这里是看教程直接跳到了该地址ORZ)

我们可以看到定位到了跳转表,接着我们在数据窗口中定位到IAT中的GetModuleHandleA地址

我们将最后一个DLL中的IAT项用绿色标注出来了,地址是768XXXXX的形式,单击工具栏中的M按钮,在区段列表窗口中看看这类地址是属于哪个DLL。

这里我们可以看到这些地址是属于kernel32.dll的代码段。

这里IAT中的最后一个元素起始地址为401214,即401218是IAT的结束位置,现在我们再来看看IAT的起始地址是多少。

每个DLL的IAT项都是以零隔开的。

这里我们可以看到这部分绿色标注出来的数值为10XX 或者 11XX的形式,明显不属于任何一个DLL,而且这些数值比当前进程空间中分配内存单元中的最小地址还要小。

所以这些数值不属于任何一个DLL,也不属于任何一个区段,有可能是壳存放的一些垃圾数据,我们继续往下拉。

这部分地址是75EXXXXX的形式,我们在区段列表窗口中看看这些地址属于哪个DLL。

属于user32.dll。

区段列表窗口中还有些其他的DLL,如:GDI32.dll,NTDLL.dll,原程序并没有用到,这几个DLL有可能是壳加载的,我们在反汇编窗口中单击鼠标右键选择-Search for-All intermodular calls看看该程序调用了哪些DLL中的API函数。

这里我们可以看到原程序总共调用了3个DLL的API函数,我们只找到了两个DLL的IAT项,NTDLL的IAT项呢?我们随便找一个NTDLL的API函数调用处。

这一项的地址为401200,它填充的77a0XXXX混在了一堆7686XXXX中间,经过检查也就是说和Kernel32.dll的IAT项混在了一起。

401210这一项也被混在了Kernel32.dll的IAT项中。(我没发现啊不太明白这里)

好,现在我们来看看IAT的起始位置在哪里,IAT的所有元素这里我们用绿色标注出来了。

IAT的起始地址为40119C,跟跳转表中的最小地址一致。

好了,现在我们有了以下三条数据:

OEP = 4000 (RVA)

IAT的起始地址 = 119C (RVA)

IAT的大小 = 401218 - 40119C = 7C。

我们将这三个值填到IMP REC中去,单击Get Imports,获取IAT项。

哇全是NO怎么办?没事这时我们需要剔除掉垃圾数据,即valid显示为NO的项(无效数据),我们单击左边的+号将其展开。

我们单击kernel32.dll(第三个加号)这条记录左边的+号,可以看到401200和401210 这两项和kernel32.dll中的IAT项混在了一起。

可以看到这里ntdll.dll中分配内存空间的两个函数用kernel32.dll中两个类似的函数HeapAlloc,HeapFree替换掉了。

这里日志信息中也提示说这两个函数跟ntdll.dll中的RtlAllocateHeap,RtlFreeHeap完成的功能类似,壳也可以对这些IAT项进行修改和混淆。

下面我们来将这些垃圾数据删除掉。

单击Show Invalid,显示无效的数据,然后单击鼠标右键选择-Cut thunk(s)(剪切掉)。结果如下图

这里这些无效数据就被剪切掉了,程序运行的时候就不会提示尝试加载不存在的API函数了。

现在,我们单击Fix Dump,选择我们之前dump出来的文件。

好了,修复完毕,我们双击运行修复完毕的程序dumpaspack_.exe。

但是到了这一步我发现打不开该程序

可能问题在于自己电脑吧

仅允许非商业转载,转载请注明出处

手脱ASPack的更多相关文章

  1. 手脱Aspack变形壳1

    1.载入PEID Aspack v2.12 -> www.aspack.com 2.载入OD,不管是看查壳信息还是看入口特征都跟我上一次发的一个手脱Aspack v2.12的帖子相同http:/ ...

  2. 手脱ASPack v2.12

    1.PEID查壳提示为: ASPack 2.12 -> Alexey Solodovnikov 2.载入OD,程序入口点是一个pushad,在他的下一行就可以进行ESP定律,下硬件访问断点然后s ...

  3. 手脱ASPack v2.12变形壳2

    1.PEID载入 ASPack v2.12 2.载入OD,跟之前帖子的入口特征相同,都是一个pushad,但是请不要怀疑这是同一个壳,绝对不是,pushad下一行ESP定律下硬件断点,然后shift+ ...

  4. 【个人笔记】ximo早期发的脱壳教程——手脱UPX壳

    [个人笔记]ximo早期发的脱壳教程--手脱UPX壳   壳分为两种:压缩壳和加密壳,UPX是一种很简单的压缩壳.   手脱UPX壳: 工具:ExeinfoPE.OD 对象:rmvbfix 方法1:单 ...

  5. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  6. 简单脱壳教程笔记(7)---手脱PECompact2.X壳

    本笔记是针对ximo早期发的脱壳基础视频教程.整理的笔记.本笔记用到的工具下载地址: http://download.csdn.net/detail/obuyiseng/9466056 简单介绍: F ...

  7. 手脱ASPack2.12壳(练习)

    俗话说柿子挑软的捏,练习脱壳还得用加密壳脱 0x01 准备 1.OD 2.ASPack加壳软件 0x02 脱壳实战 查一下壳 OD载入 第一个call,F7进去 第二个call也是F7进去 之后往下单 ...

  8. 脱壳入门----脱ASPack壳保护的DLL

    前言 结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析. 脱壳详细过程 寻找程序的OEP 先将目标DLL拖入OD,来到壳的入口处. 然后利用堆栈平衡原理在push ...

  9. 深入底层逆向分析TDC‘s keygenme(手脱压缩壳)

    系统 : Windows xp 程序 : TDC‘s keygenme 程序下载地址 :http://pan.baidu.com/s/1gdWyt6z 要求 : 脱壳 & 注册机编写 使用工具 ...

随机推荐

  1. 【LeetCode】220. Contains Duplicate III

    题目: Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  2. “HK”的日常之ARP断网攻击

    ARP断网攻击是什么?可以吃吗?如果可以吃它好吃吗? ARP断网攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响 ...

  3. 包装类、数组、string类浅析及练习

    String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2); //返回true Strin ...

  4. C#面试题记录

    最怕的就是面试,每每到找工作的时候感觉压力山大,每次都要提前刷点题目去面对.所以这里自己对以后需要了解的知识做一个记录,方便自己随时的补充和深入了解,也给现在的自己留下一点点的印记,给未来留下一点回忆 ...

  5. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  6. jmeter- Java-POST接口使用get与json格式传参

    在测试过程中发现各种接口传参形式,今天就来说说小编遇到的一种,接口请求方式为POST:URL传参以GET形式并携带JSON 可能这样诉说有不少同学不太理解. 如图: 上图所示就是一般get请求传参格式 ...

  7. 使用stackOfIntegers实现降序素数

    使用stackOfIntegers实现降序素数 代码如下: package day06; public class TestSU { public static void main(String[] ...

  8. Java 9 揭秘(12. Process API 更新)

    Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...

  9. 51nod_1264:线段相交(计算几何)

    题目链接 关于判断线段相交,具体算法见 点击打开链接 ,先进行快速排斥试验,若不能判断出两个线段不相交,再进行跨立试验. //吐槽1,long long 会溢出... //吐槽2,只进行跨立试验的虽然 ...

  10. Miller-Rabin 素性测试

    根据费马小定理,若p为素数,则必有a^(p-1) mod p=1 对和p互质的a成立. 根据二次探测定理:如果p是素数,且0<x<p,则方程x^2 mod p=1的解为1或p-1. 所以若 ...