首页
社区
课程
招聘
[旧帖] [原创]菜鸟使用的脱壳方法,各位前辈请指教 0.00雪花
发表于: 2012-8-6 22:43 1000

[旧帖] [原创]菜鸟使用的脱壳方法,各位前辈请指教 0.00雪花

2012-8-6 22:43
1000
UPX 0.89.6 - 1.02 / 1.05 - 1.24

使用方法:
(1)单步跟踪法
(2)ESP定律法
(3)内存镜像法
(4)一步到达OEP法
(5)其它方法尝试后补充

先用PEiD查壳

有壳,为 UPX 0.89.6 - 1.02 / 1.05 - 1.24

单步跟踪法
用OD载入,来到界面

分析这里的数据,
0040E8C0 >  60              pushad //一开始在这里,单步过
0040E8C1    BE 15B04000     mov esi,UPX.0040B015
0040E8C6    8DBE EB5FFFFF   lea edi,dword ptr ds:[esi+FFFF5FEB]
0040E8CC    57              push edi
0040E8CD    83CD FF         or ebp,FFFFFFFF
0040E8D0  ˇEB 10           jmp short UPX.0040E8E2 //单步到了这里,这是实现了的跳转,我们单步跳转
0040E8D2    90              nop
0040E8D3    90              nop
0040E8D4    90              nop
0040E8D5    90              nop
0040E8D6    90              nop
0040E8D7    90              nop
0040E8D8    8A06            mov al,byte ptr ds:[esi]
0040E8DA    46              inc esi
0040E8DB    8807            mov byte ptr ds:[edi],al
0040E8DD    47              inc edi
0040E8DE    01DB            add ebx,ebx
0040E8E0  ˇ75 07           jnz short UPX.0040E8E9
0040E8E2    8B1E            mov ebx,dword ptr ds:[esi]//跳到这里,继续单步
0040E8E4    83EE FC         sub esi,-4
0040E8E4    83EE FC         sub esi,-4
0040E8E7    11DB            adc ebx,ebx
0040E8E9  ^ 72 ED           jb short UPX.0040E8D8//这里有个回跳实现了的,在它下一句下断
0040E8EB    B8 01000000     mov eax,1//运行到选定位置(F4),继续单步往下看
0040E8F0    01DB            add ebx,ebx
0040E8F2  ˇ75 07           jnz short UPX.0040E8FB//这个是实现的下跳,单步
0040E8F4    8B1E            mov ebx,dword ptr ds:[esi]
0040E8F6    83EE FC         sub esi,-4
0040E8F9    11DB            adc ebx,ebx
0040E8FB    11C0            adc eax,eax//来到这里,继续单步
0040E8FD    01DB            add ebx,ebx
0040E8FF  ^ 73 EF           jnb short UPX.0040E8F0//没实现的回跳,不管,单步
0040E901  ˇ75 09           jnz short UPX.0040E90C//实现的下跳,单步
0040E903    8B1E            mov ebx,dword ptr ds:[esi]
0040E905    83EE FC         sub esi,-4
0040E908    11DB            adc ebx,ebx
0040E90A  ^ 73 E4           jnb short UPX.0040E8F0
0040E90C    31C9            xor ecx,ecx//跳到这,继续单步
0040E90E    83E8 03         sub eax,3
0040E911  ˇ72 0D           jb short UPX.0040E920//实现了的下跳,单步
0040E913    C1E0 08         shl eax,8
0040E916    8A06            mov al,byte ptr ds:[esi]
0040E918    46              inc esi
0040E919    83F0 FF         xor eax,FFFFFFFF
0040E91C  ˇ74 74           je short UPX.0040E992
0040E91E    89C5            mov ebp,eax
0040E920    01DB            add ebx,ebx//跳到这,单步
0040E922  ˇ75 07           jnz short UPX.0040E92B//实现的下跳,单步
0040E924    8B1E            mov ebx,dword ptr ds:[esi]
0040E926    83EE FC         sub esi,-4
0040E929    11DB            adc ebx,ebx
0040E92B    11C9            adc ecx,ecx//到这,单步
0040E92D    01DB            add ebx,ebx
0040E92F  ˇ75 07           jnz short UPX.0040E938//实现的下跳,单步
0040E931    8B1E            mov ebx,dword ptr ds:[esi]
0040E933    83EE FC         sub esi,-4
0040E936    11DB            adc ebx,ebx
0040E938    11C9            adc ecx,ecx//到这,单步
0040E93A  ˇ75 20           jnz short UPX.0040E95C//实现的下跳,单步
0040E93C    41              inc ecx
0040E93D    01DB            add ebx,ebx
0040E93F  ˇ75 07           jnz short UPX.0040E948
0040E941    8B1E            mov ebx,dword ptr ds:[esi]
0040E943    83EE FC         sub esi,-4
0040E946    11DB            adc ebx,ebx
0040E948    11C9            adc ecx,ecx
0040E94A    01DB            add ebx,ebx
0040E94C  ^ 73 EF           jnb short UPX.0040E93D
0040E94E  ˇ75 09           jnz short UPX.0040E959
0040E950    8B1E            mov ebx,dword ptr ds:[esi]
0040E952    83EE FC         sub esi,-4
0040E955    11DB            adc ebx,ebx
0040E957  ^ 73 E4           jnb short UPX.0040E93D
0040E959    83C1 02         add ecx,2
0040E95C    81FD 00F3FFFF   cmp ebp,-0D00//跳到这,单步
0040E962    83D1 01         adc ecx,1
0040E965    8D142F          lea edx,dword ptr ds:[edi+ebp]
0040E968    83FD FC         cmp ebp,-4
0040E96B  ˇ76 0F           jbe short UPX.0040E97C//没实现的跳,单步
0040E96D    8A02            mov al,byte ptr ds:[edx]
0040E96F    42              inc edx
0040E970    8807            mov byte ptr ds:[edi],al
0040E972    47              inc edi
0040E973    49              dec ecx
0040E974  ^ 75 F7           jnz short UPX.0040E96D//实现的回跳,下面的那个也是,nop是空数据,可能会造成程序跑飞,所以在nop下一句运行到选定位置(F4)
0040E976  ^ E9 63FFFFFF     jmp UPX.0040E8DE
0040E97B    90              nop
0040E97C    8B02            mov eax,dword ptr ds:[edx]//运行到选定位置(F4),单步
0040E97E    83C2 04         add edx,4
0040E981    8907            mov dword ptr ds:[edi],eax
0040E983    83C7 04         add edi,4
0040E986    83E9 04         sub ecx,4
0040E989  ^ 77 F1           ja short UPX.0040E97C//没实现,单步
0040E98B    01CF            add edi,ecx
0040E98D  ^ E9 4CFFFFFF     jmp UPX.0040E8DE//实现,看下一句
0040E992    5E              pop esi//运行到选定位置(F4),单步
0040E993    89F7            mov edi,esi
0040E995    B9 DD000000     mov ecx,0DD
0040E99A    8A07            mov al,byte ptr ds:[edi]
0040E99C    47              inc edi
0040E99D    2C E8           sub al,0E8
0040E99F    3C 01           cmp al,1
0040E9A1  ^ 77 F7           ja short UPX.0040E99A//实现,看下一句
0040E9A3    803F 00         cmp byte ptr ds:[edi],0//运行到选定位置(F4),单步
0040E9A6  ^ 75 F2           jnz short UPX.0040E99A//实现,看下一句
0040E9A8    8B07            mov eax,dword ptr ds:[edi]//运行到选定位置(F4),单步
0040E9AA    8A5F 04         mov bl,byte ptr ds:[edi+4]
0040E9AD    66:C1E8 08      shr ax,8
0040E9B1    C1C0 10         rol eax,10
0040E9B4    86C4            xchg ah,al
0040E9B6    29F8            sub eax,edi
0040E9B8    80EB E8         sub bl,0E8
0040E9BB    01F0            add eax,esi
0040E9BD    8907            mov dword ptr ds:[edi],eax
0040E9BF    83C7 05         add edi,5
0040E9C2    89D8            mov eax,ebx
0040E9C4  ^ E2 D9           loopd short UPX.0040E99F//实现,看下一句
0040E9C6    8DBE 00C00000   lea edi,dword ptr ds:[esi+C000]//运行到选定位置(F4),单步
0040E9CC    8B07            mov eax,dword ptr ds:[edi]
0040E9CE    09C0            or eax,eax
0040E9D0  ˇ74 3C           je short UPX.0040EA0E//没实现,单步
0040E9D2    8B5F 04         mov ebx,dword ptr ds:[edi+4]
0040E9D5    8D8430 14EC0000 lea eax,dword ptr ds:[eax+esi+EC14]
0040E9DC    01F3            add ebx,esi
0040E9DE    50              push eax
0040E9DF    83C7 08         add edi,8
0040E9E2    FF96 A0EC0000   call dword ptr ds:[esi+ECA0]
0040E9E8    95              xchg eax,ebp
0040E9E9    8A07            mov al,byte ptr ds:[edi]
0040E9EB    47              inc edi
0040E9EC    08C0            or al,al
0040E9EE  ^ 74 DC           je short UPX.0040E9CC//没实现,单步
0040E9F0    89F9            mov ecx,edi
0040E9F2    57              push edi
0040E9F3    48              dec eax
0040E9F4    F2:AE           repne scas byte ptr es:[edi]
0040E9F6    55              push ebp
0040E9F7    FF96 A4EC0000   call dword ptr ds:[esi+ECA4]
0040E9FD    09C0            or eax,eax
0040E9FF  ˇ74 07           je short UPX.0040EA08//没实现,单步
0040EA01    8903            mov dword ptr ds:[ebx],eax
0040EA03    83C3 04         add ebx,4
0040EA06  ^ EB E1           jmp short UPX.0040E9E9//实现,这是不是在下一句下断,因为看到了两个关键点,popad和一个jmp大区段跳转,所以,我们直接在popad运行到选定位置(F4)
0040EA08    FF96 A8EC0000   call dword ptr ds:[esi+ECA8]
0040EA0E    61              popad//运行到选定位置(F4),单步
0040EA0F  - E9 B826FFFF     jmp UPX.004010CC//单步
来到了目的地
004010CC    55              push ebp
004010CD    8BEC            mov ebp,esp
004010CF    83EC 44         sub esp,44
004010D2    56              push esi
这样我们就找到了OEP=10CC
总结:
  一开始因为操作错误,我在这些东西那里转了三、四圈,不断的循环,简直倒霉死了,所以,下次操作要注意,不要多也不要少了,不然是很浪费时间和精力的。脱壳修复就不做了,这个壳比较简单。
  

ESP定律法
看到这个界面

找到关键词pushad,然后一般要注意的就是它的下一句,看看它的ESP值有没突显

有,那么就要跟随或用命令行dd XXXXXXXX

到了数据窗口,选中对应数值,然后硬件访问断点word,再无异常运行(Shift+F9)

看到大区段跳转,很开心,说明要到ESP了,但是要先删除刚刚设的断点,然后单步就可到达

OEP=10CC
总结:
  这种方法很快找到OEP,最主要的是要抓好关键词的下一句ESP的突显,以及要记住,设断后要删除。
  
  
内存镜像法
首先要设置好忽略所有异常,然后OD重载,再进入内存镜像,找到程序.rsrc处,下断

运行

再进入内存镜像,找到地址为00401000,下断

运行

没直接到OEP,但是很快了,因为下面有个跨区段的大跳转和popad

我们单步,在到达跨区段的大跳转前有一回转,我们要在下两句popad处下断,然后就安全的到达跨区段的大跳转了,再单步,看到

OEP=10CC
总结:
  用这种方法关键是开头的忽略所有异常再重载,然后要记住在两处下断,分别是.rsrc和00401000。
  
  
一步到达OEP法
   这种方法不是所有壳都适用,只能用在少数,一般适合UPX和ASPACK
   一开始Ctrl+F调出查找命令窗口,输入popad,不选“整个段块”,因为一个段可能包含了好多个popad

查找,看到popad

这个UPX比较简单,一下子就看到跨区段大跳转,我们先下断,然后无异常运行到这,再单步到大跳转,最后到达。
OEP=10CC。
    总结:命令后记得下断点然后无异常运行。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//