调试原理-逆向pe-脱壳

这几天都没怎么写博客了,主要是因为在写文件系统过滤的时候老是 蓝屏,感觉心力交瘁,根本一点都不想再看内核代码,就逆向分析了一下peid的原理,前辈们关于这一块的分析的文章也很多,这里只是按照我个人的思路对peid进行逆向分析,大体弄清楚peid怎么对一个pe文件进行分析的。

工具:

逆向工具:ollydbg,peid
脱壳工具:lordpe,importREC,ollydump
分析对象:peid v0.94

分析过程:

收集信息

首先用peid分析peid 好奇怪的样子,得知加过壳,壳的版本为PECompact 2.x -> Jeremy Collake,不算是强壳,直接od载入程序,先脱壳再说

oep不完美脱壳

单步一步发现只有eax和eip变化,不管,在尝试单步一次,发现只有esp和eip变化,不多说,直接右键esp数据窗口跟随,然后下硬件访问断点,shift+F9忽略异常运行,中断在系统领空

77B8B5BB    3B45 F8         cmp eax,dword ptr ss:[ebp-0x8]
77B8B5BE    72 09           jb Xntdll_1A.77B8B5C9
77B8B5C0    3B45 F4         cmp eax,dword ptr ss:[ebp-0xC]
77B8B5C3    0F82 1DAE0100   jb ntdll_1A.77BA63E6
77B8B5C9    FF75 F0         push dword ptr ss:[ebp-0x10]
77B8B5CC    FF73 04         push dword ptr ds:[ebx+0x4]
77B8B5CF    E8 15FEFFFF     call ntdll_1A.77B8B3E9

再次shift+F9,到上一步的call中,再次shift+f9,两次后,返回程序领空

0047A497    53              push ebx
0047A498    51              push ecx
0047A499    57              push edi
0047A49A    56              push esi
0047A49B    52              push edx
0047A49C    8D98 04129300   lea ebx,dword ptr ds:[eax+0x931204]
0047A4A2    8B53 18         mov edx,dword ptr ds:[ebx+0x18]

可以发现,这个地方仍然不是OEP,仍然在壳中对程序进行处理,我们再一次shitf+f9,来到关键跳转

0047A525    5D              pop ebp
0047A526  - FFE0            jmp eax           ; PEiD.0045A8CC
0047A528    CC              int3
0047A529    A8 45           test al,0x45
0047A52B    0000            add byte ptr ds:[eax],al

毫无疑问,跳转过去就应该是oep了

0045A8CC   .  6A 60         push 0x60
0045A8CE   .  68 10CF4200   push PEiD.0042CF10
0045A8D3   ?  E8 B4180000   call PEiD.0045C18C
0045A8D8   .  BF 94000000   mov edi,0x94
0045A8DD   ?  8BC7          mov eax,edi
0045A8DF   ?  E8 5CFDFFFF   call PEiD.0045A640

很经典的vc的开头,那么直接脱壳吧
lordpe先纠正一下镜像大小后完整转存
调试原理-逆向pe-脱壳_第1张图片
后用ollydump记录一下oep后,用importREC修复一下转存文件
调试原理-逆向pe-脱壳_第2张图片
发现这个地方有3个无效函数,这里直接cut掉,并不会影响程序的运行,然后修复一下转存文件,双击发现可以正常运行
调试原理-逆向pe-脱壳_第3张图片
用peid在查一下dumped_发现脱壳完成
调试原理-逆向pe-脱壳_第4张图片
这里算是不完美脱壳,因为有几个函数直接被删掉了,如果想要完美脱壳,需要手动修复IAT表

完美脱壳

前面一模一样,在importREC检查到有无效函数的时候,在oep下硬件执行断点,然后在数据窗口找到这个RVA,下硬件访问断点
调试原理-逆向pe-脱壳_第5张图片
执行到OEP,然后在反汇编窗口查看rva
调试原理-逆向pe-脱壳_第6张图片
在用importREC修复
调试原理-逆向pe-脱壳_第7张图片
完美修复

今天只是将peid的壳脱了,其实脱PECompact的方法很多,因为是一款比较经典的压缩壳, 所以其实bp VirtualAlloc和bp VirtualFree配合使用也是可以脱壳的。
比较晚了,准备睡了,之后另外一部分逆向peid的内容明天再写吧,晚安!

你可能感兴趣的:(逆向分析)