-
-
[旧帖] [原创]菜鸟使用的脱壳方法,各位前辈请指教 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。
总结:命令后记得下断点然后无异常运行。
使用方法:
(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虚拟机自动化脱壳的方法
赞赏
他的文章
- [原创]菜鸟使用的脱壳方法,各位前辈请指教 1299
- [原创]菜鸟使用的脱壳方法,各位前辈请指教 1001
- [求助]新人入场,不知从那开始 1304
看原图
赞赏
雪币:
留言: