首页
社区
课程
招聘
笨方法解决UPX+VMProtect
发表于: 2007-3-10 00:39 5055

笨方法解决UPX+VMProtect

2007-3-10 00:39
5055
在http://bbs.pediy.com/showthread.php?s=&threadid=40770
中我用VMProtect把UPX转入口点的一小段加密了, 然后会发现用正常的方式很难停在入口点.

加密前:
010143D4 58                      pop eax
010143D5 50                      push eax
010143D6 54                      push esp
010143D7 50                      push eax
010143D8 53                      push ebx
010143D9 57                      push edi
010143DA FFD5                    call ebp
010143DC 58                      pop eax
010143DD 61                      popad
010143DE 8D442480                lea eax, [esp-80]
010143E2 6A00                    push 00
010143E4 39C4                    cmp esp, eax
010143E6 75FA                    jnz 010143E2
010143E8 83EC80                  sub esp, -80
010143EB E9B52FFFFF              jmp 010073A5  ; UPX经典的Jmp, 入口地方一直往下拉就可以来到这里.

加密后, 代码变成这样了:
010143D4    68 E5E45EBC     push    BC5EE4E5
010143D9  - E9 81990000     jmp     0101DD5F
010143DE    80E0 3C         and     al, 3C
010143E1    8F0407          pop     dword ptr [edi+eax]
010143E4  - E9 8D920000     jmp     0101D676
010143E9    5C              pop     esp
010143EA  - E9 87920000     jmp     0101D676
010143EF    54              push    esp

我们发现可爱的Jmp不见了, 对于我们这些菜鸟来说, 面对上万的循环着实无能为力. 但是我们可以对其进行RUN跟踪, 总结一些规律.

在已知Notepad的入口点为010073A5的情况下, 我们设置跟踪条件为EIP位于范围内 :010073A4-010073A6
然后跟踪步入.运行一段时间以后, 程序顺利停
在入口点. 察看RUN记录发现在此之间程序运行了1.6W条指令(曾经在论坛上看过有人要用VM加密整个程序的同志......这个数字转换是在令人吃惊) 把记录拉到最下面, 可以看到VMProtect在POP恢复了寄存器之后(随机顺序)RETN到了入口点.

嘿嘿, 想到了什么吗? 我们加密之前程序段中没有RETN! 我们可以用"执行到返回 CTRL+F9"快速定位到这个JMP中:

010143C7    8D87 07020000   lea     eax, dword ptr [edi+207]
010143CD    8020 7F         and     byte ptr [eax], 7F
010143D0    8060 28 7F      and     byte ptr [eax+28], 7F  ;停在这里
010143D4    68 E5E45EBC     push    BC5EE4E5
010143D9  - E9 81990000     jmp     0101DD5F
010143DE    80E0 3C         and     al, 3C
010143E1    8F0407          pop     dword ptr [edi+eax]
010143E4  - E9 8D920000     jmp     0101D676
010143E9    5C              pop     esp
010143EA  - E9 87920000     jmp     0101D676
010143EF    54              push    esp

首先停在010143D0处, 然后摁4次CTRL+F9 顺利到达入口点.

以上是一个超笨的方法, 首先我们已经知道代码加密前的情况, 并且我还不知道这是否有通用性. 如果加密者稍微摆动一下, 这些诡计就可能失效了. (我猜测, 如果加密段最后一个语句是JMP, 而不是retn, 我们可以用此方法快速步过Vmprotect加密的段, 到达想去的地方).

VM让整个世界变复杂了...

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
某些时机
试试在第二区段设置内存访问断点看看
2007-3-10 00:48
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 fly 发布
某些时机
试试在第二区段设置内存访问断点看看

谢谢fly老大, 一语中的啊! 对壳的了解还太少, 继续学习去
2007-3-10 00:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
关于PE-AMOROR加密压缩的的程序解说好象很少哦~我用了ROMRA2感觉上FINISH了 可是再进去看的时候还是和原来一样 不知道为什么哦~用OLLYDBG又找不到OEP 唉~有高手可以帮帮忙么?QQ:27016440哦~绝对不是广告啊 真心求教
2007-3-10 13:44
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
挺有想法的,不错

内存断点仍然是比较好的方法

对于壳,其实我们对壳的代码不关心,可以猜出口代码的。
2007-3-10 14:08
0
游客
登录 | 注册 方可回帖
返回
//