首页
社区
课程
招聘
[求助]穿山甲壳已经3天天了,就是不知道哪里的问题。。
发表于: 2008-9-27 00:39 7589

[求助]穿山甲壳已经3天天了,就是不知道哪里的问题。。

2008-9-27 00:39
7589
最近在学习脱穿山甲壳,可一个也没脱下来,关键是我对着教程,前面几步堆栈中的数据还能对上,但后面的,尤其是返回时机总是对不上而且执行用户代码老是是在那个地方,各步骤详细如下,我真的是要崩溃了,在百度上找了好长时间也没找到解决的办法。
00523C43 >/$  55                       PUSH EBP               //入口处      
00523C44  |.  8BEC                     MOV EBP,ESP
00523C46  |.  6A FF                     PUSH -1
00523C48  |.  68 90CF5400         PUSH Loader.0054CF90
00523C4D  |.  68 80395200         PUSH Loader.00523980                     ;  SE 处理程序安装
00523C52  |.  64:A1 0000000>   MOV EAX,DWORD PTR FS:[0]
00523C58  |.  50                          PUSH EAX
00523C59  |.  64:8925 00000>    MOV DWORD PTR FS:[0],ESP
00523C60  |.  83EC 58               SUB ESP,58
----------------------------------------------------------------------------------------
设置OD忽略所有异常,UDD文件中的文件已经全部清除。然后下断点he GetModuleHandleA+5  shift+F9到达这里。
7C80B6A6    837D 08 00        CMP DWORD PTR SS:[EBP+8],0
7C80B6AA    74 18                 JE SHORT kernel32.7C80B6C4
7C80B6AC    FF75 08             PUSH DWORD PTR SS:[EBP+8]
7C80B6AF    E8 C0290000     CALL kernel32.7C80E074
7C80B6B4    85C0                  TEST EAX,EAX
7C80B6B6    74 08                  JE SHORT kernel32.7C80B6C0
7C80B6B8    FF70 04               PUSH DWORD PTR DS:[EAX+4]
7C80B6BB    E8 7D2D0000     CALL kernel32.GetModuleHandleW
7C80B6C0    5D                      POP EBP
------------------------------------------------------------------------------------------
堆栈中的数据。
0012FF34  /0012FFC0
0012FF38  |00523D0B  返回到 Loader.<模块入口点>+0C8 来自 kernel32.GetModuleHandleA
0012FF3C  |00000000
0012FF40  |00000000

0012ED2C  /0012ED64
0012ED30  |5D175324  返回到 5D175324 来自 kernel32.GetModuleHandleA
0012ED34  |5D175370  ASCII "kernel32.dll"
0012ED38  |5D1E3AB8

0012F738  /0012F7A0
0012F73C  |0050E8F3  返回到 Loader.0050E8F3 来自 kernel32.GetModuleHandleA
0012F740  |00000000
0012F744  |0000FFFF

0012CF40  /0012E200
0012CF44  |60002347  返回到 kmon.60002347 来自 kernel32.GetModuleHandleA
0012CF48  |600603E0  ASCII "ntdll.dll"
0012CF4C  |669A12BA  inetmib1.669A12BA
其中在这里我的跳转感觉挺大的,取消断点后,在这里执行到用户代码然后就返回到这里好我调试的3个软件都是跳到这里,这个问题急需解决
003E5C56    894424 1C       MOV DWORD PTR SS:[ESP+1C],EAX
003E5C5A    61              POPAD
003E5C5B    F0:FF0D F85B3E0>LOCK DEC DWORD PTR DS:[3E5BF8]           ; LOCK 前缀
003E5C62    9D              POPFD
003E5C63    C2 1800         RETN 18
003E5C66    90              NOP
003E5C67    90              NOP
003E5C68    90              NOP
003E5C69    90              NOP
003E5C6A    90              NOP
003E5C6B    90              NOP
003E5C6C    90              NOP
003E5C6D    90              NOP
003E5C6E    90              NOP
003E5C6F    90              NOP
003E5C70    90              NOP
003E5C71    90              NOP
003E5C72    90              NOP

就成这样了,我脱了3个穿山甲的壳,都是这样,就不知道怎么回事,是不是我设置有问题

00129524  /0012EC6C
00129528  |00CD7105  返回到 00CD7105 来自 kernel32.GetModuleHandleA
0012952C  |00CEBC1C  ASCII "kernel32.dll"
00129530  |00CECEC4  ASCII "VirtualAlloc"

00129524  /0012EC6C
00129528  |00CD7122  返回到 00CD7122 来自 kernel32.GetModuleHandleA
0012952C  |00CEBC1C  ASCII "kernel32.dll"
00129530  |00CECEB8  ASCII "VirtualFree"111111111111111111111

00129288  /00129528
0012928C  |00BF5FC9  返回到 00BF5FC9 来自 kernel32.GetModuleHandleA
00129290  |001293DC  ASCII "kernel32.dll"
教程上是到这里说是返回时机,可是我在1111111111111111111处再按F9就出现了
不知道如何回避00D0166F处的命令,请尝试更改EIP,或将异常传给程序。这是一个对话框附件传不上来就只能打字了
我调试穿山甲第一步就没过去过,我完全按照教程的思想,步骤,并且用的是他们调试的程序。但就是找不到MAGIC JUMP。请看雪的高手,斑竹们帮帮我,我QQ393025074.本人不胜感激。学习中就在这块遇到问题了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 44229
活跃值: (19955)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
1.建议先用Armadillo find protected 检查一下具体信息,看看采取了Armadillo哪些保护。
2.“不知道如何回避00D0166F处的命令,请尝试更改EIP,或将异常传给程序。”直接按Shitf+F9忽略异常继续
2008-9-27 10:00
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也碰到类似的问题。。。把握不好返回时机。,求看雪老大帮忙看看~~
手头有个arm加壳的文件,用了老大说的工具查了下版本,3.78的。
he GetModuleHandleA下断时,堆栈如下:
0012FF38   004B6ED8  /CALL 到 GetModuleHandleA 来自 loginTJ2.004B6ED2
0012FF3C   00000000  \pModule = NULL
0012FF40   00000000
0012FF44   00141F1C

*******************************************
0012BB90   004ABB4B  /CALL 到 GetModuleHandleA 来自 loginTJ2.004ABB45
0012BB94   00000000  \pModule = NULL
0012BB98   0012FF2C
0012BB9C   00000000

*******************************************
0012BCB0   004A59E6  /CALL 到 GetModuleHandleA
0012BCB4   00000000  \pModule = NULL
0012BCB8   0012FF2C
0012BCBC   00000000

*******************************************
0012BB70   600043AC  /CALL 到 GetModuleHandleA 来自 kmon.600043A6
0012BB74   600603E0  \pModule = "ntdll.dll"
0012BB78   00000084

*******************************************
00129E08   7C81FD9F  /CALL 到 GetModuleHandleA 来自 kernel32.7C81FD9A
00129E0C   00000000  \pModule = NULL
00129E10   003C5FF0
00129E14   00000000
然后在4A6D8B之后连续出现3个 call GetModuleHandleA感觉很莫名,网上的教程上没提到过
004A6D83   > \6A 00         push    0                                ; /pModule = NULL
004A6D85   .  FF15 34C04C00 call    [<&KERNEL32.GetModuleHandleA>]   ; \GetModuleHandleA
004A6D8B   .  8985 1CFFFFFF mov     [ebp-E4], eax
004A6D91   .  8B85 1CFFFFFF mov     eax, [ebp-E4]
004A6D97   .  8B8D 1CFFFFFF mov     ecx, [ebp-E4]
004A6D9D   .  0348 3C       add     ecx, [eax+3C]
004A6DA0   .  898D 00FEFFFF mov     [ebp-200], ecx
004A6DA6   .  6A 00         push    0                                ; /pModule = NULL
004A6DA8   .  FF15 34C04C00 call    [<&KERNEL32.GetModuleHandleA>]   ; \GetModuleHandleA
004A6DAE   .  8B95 00FEFFFF mov     edx, [ebp-200]
004A6DB4   .  0342 28       add     eax, [edx+28]
004A6DB7   .  8945 C4       mov     [ebp-3C], eax
004A6DBA   .  6A 00         push    0                                ; /pModule = NULL
004A6DBC   .  FF15 34C04C00 call    [<&KERNEL32.GetModuleHandleA>]   ; \GetModuleHandleA

之后程序直接运行了。。。。。
一直困惑了我很久。。。不知道为什么啊
2008-9-27 10:46
0
雪    币: 107
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
一、基本知识:
该壳有如下保护:
(1)Debug-Blocker(阻止调试器)--解决方法就是忽略所有异常,隐藏好OD,如果加载时,老出错,就多换几个OD试试。
(2)CopyMem-II(双进程保护)---解决方法是:用手动或者脚本使双变单。
(3) Enable Import Table Elimination(IAT保护) –解决方法是用工具ArmaDetach再次载入加壳程序,记下子进程ID,用另一OD载入,利用断

点GetModuleHandleA,找到Magic Jump,修改Magic Jump,得到正确的IAT。
(4)Enable Strategic Code Splicing(远地址跳) ,解决方法就是用Arminline工具。
(5) Enable Nanomites Processing(简称CC),就是把一些retn代码变成CC(INT型),解决方法:用Arminline工具或Enjoy工具。
(6)Enable Memory-Patching Protections(内存保护)
二、脱此类壳常用的断点:
1、WaitForDebugEvent(用于寻找非标准OEP和做补丁用)
2、WriteProcessMemory(用于寻找非标准OEP)
3、DebugActiveProcess(找子程)
4、OpenMutexA(双进程转单进程)
5、GetSystemTime(补丁KEY)
6、VirtualProtect(用于5.x)
7、CreateFileMappingA(用于5.x)
8、GetModuleHandleA/LoadLibraryA (用于找Magic Jump)
9、CreateThread(寻找OEP)
三、种类及脱壳方法
说明:对于此壳一般要隐藏OD。如果按以下方法下断OD断不下来,出错,就多换几个OD试试,在我脱壳中,就有个情况,下断点后,老断不下

来,多换了几个OD就成功了。
(一)单线程标准方式
具体方法:2次断点法加修改Magic Jump。
1、找Magic Jump
方法有二:
方法一、下断点Bp GetModuleHandleA/he GetModuleHandleA/bp GetModuleHandleA+5/he GetModuleHandleA+5,按shift+f9运行,当经过一个

call缓冲有点大时,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree“后,再运行一次,出现"kernel32.dll",就是返回

时机,取消断点,按alt+f9执行到返回。
方法二、也可以下bp LoadLibraryA断点,当在堆栈窗口出现MSVBVM60.Dll函数时,返回时机,在kernel32.LoadLibraryA下面有一个跳转,一

般情况下,这个跳转比较大的话,就改为jmp,而跳转比较小的话,就改nop)。[注:下此断点的目的是找到Magic Jump,修改Magic Jump目的

是避开的IAT的加密。]
2、找OEP
下断点bp GetCurrentThreadId/bp CreateThread,shift+f9运行,中断后,取消断点,Alt+F9返回,单步执行,看到一个call edi之类的。F7

进入,即到oep。OD不要关!打开import--选择进程--OEP输入va--自动搜索IAT--获取输入表--显示无效函数--CUT!
(二) 双线程的标准壳
总体步骤:1、要双变单;2、处理IAT,修改Magic Jump;3、寻找OEP;4、修复
1、双变单,方法有三。
方法一:PATCH代码法
下断bp OpenMutexA,断下后,ctrl+g到00401000,将空数据改为如下代码:
00401000      60               pushad
00401001      9C               pushfd
00401002 68 A0FD1200 push xxxx  (注:此处的  xxxx为断下后mutex name前的数值。)  
00401007      33C0             xor eax,eax
00401009      50               push eax
0040100A      50               push eax
0040100B      E8 E694A677      call KERNEL32.CreateMutexA
00401010      9D               popfd
00401011      61               popad
00401012    - E9 8F9FA777      jmp KERNEL32.OpenMutexA
点右键选择重建eip,f9运行,断下后,取消断点, ctrl+g到00401000,恢复修改。
方法二,下断点:bp OpenMutexA,SHIFT+F9,断下后, ALT+F9返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9,

断下后,ALT+F9返回,再次将返回代码下面的第一个跳转改为相反跳转。然后再一次SHIFT+F9,取消断点,至此,同样,双进程转单进程完毕!
方法三、除了用双变单的脚本外,还可以用一个工具ARMADETACH,将带壳的程序拖入,记下子进程的ID。
2、处理IAT,修改Magic Jump。
用OD附加该子进程,加载后,ALT+F9返回,修改前两个字节为加壳程序载入时的前两个字节。
下断点bp  GetModuleHandleA, Shift+F9运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree“后,再运行一次,出现

"kernel32.dll",就是返回时机,中断后alt+f9返回,在KERNEL32.LoadLibraryA下面找到Magic Jump!修改为jmp。再下断点bp

GetCurrentThreadId/bp CreateThread(或往下拉找到两个salc,在其上面的jmp上下断,Shift+F9,断下!如果文件有校验,则要撤消Magic

Jump处的修改!打开内存镜像,在00401000段下断。运行,中断后,删除断点,alt+f9返回),F8单步走,到第一个CALL ECX之类的东西时,

F7进入。到oep。
注:(对于有些OD有一个字符串溢出漏洞,尽量用一些修正些错误的OD,有些程序需要处理Anti,方法如下:下断点he OutputDebugStringA
断下后,选中%s%之类的字符,在数据窗口跟随,点右键->二进制->使用00填充,中断2次!都如上修改,删除此断点!)
3、修复。
(三)CopyMem-ll +Debug-Blocke保护方式
1、先找OEP,两个断点。(1)断点bp WaitForDebugEvent,运行,中断后看堆栈,在一行有“pDebugEvent”字样的那一行右键点击“数据窗口

跟随”,取消断点。(2)bp WriteProcessMemory,运行,中断后,在数据窗口(要地址显示)发现oep。
2、patch代码,解码。方法:重新载入,bp WaitForDebugEvent,运行,中断,取消断点,alt+f9返回,CTRL+F搜索命令:or eax,0FFFFFFF8

,找到后,先往上看,可以看到两个CMP,一个是“cmp dword ptr ss:[XXXX],0”在这里下硬件执行断点,Shift+F9运行,中断后取消断点。

这时看信息窗口:SS[XXXXX]=00000000,如果这个值不为0的话,需要将其清0,如果为0就不用了。第二个CMP,cmp ecx,dword ptr ds:[XXXX]

,下面开始解码。在这里要记下几个地址:(1)cmp dword ptr ss:[XXXX],0前的地址和[]内的值。(2)第二个CMP中[]中的值。接着or eax

,0FFFFFFF8处往下,可以找到一处为and eax,0FF的代码,从这里开始Patch,代码如下:
inc dword ptr ds:[] //第一个CMP内的值
mov dword ptr ds:[XXXX+4],1  //XXXX为第二个CMP[]内的值
jmp XXXX  //第一个CMP前的地址
修改好后,去掉所有断点,向下找到第一个CMP下面的跳转所跳到的地址,来到这个地址,下硬件执行断点,Shift+F9运行,此时代码解压完毕

,可以脱壳。
3、脱壳。运行LordPE,将子进程dump出来,这里的子进程就是LordPE第2个进程(有2个同名进程)。Dump后用LordPE修改入口点为在第一步中查

到的OEP。
4、修复输入表、IAT的寻找
脱壳后不要急着去修复输入表,得先把RVA数据获取,用OD载入Dump出来的程序,右键搜索二进制字符串,输入FF25,找到一个函数,在数据窗

口跟随,在数据窗口向上找到全是0的地方,记下地址,再向下找到全是0的地方,记下地址。
5、加载子程序。
(1)找子程序pid的方法有二:
方法一:用OD载入原程序(脱壳前的程序),下断点:bp DebugActiveProcess,中断后看堆栈,记下Processid后面的值(这个值不是每次都

相同的)。OD不要关。
第二种方法就是用工具ArmaDetach,将加壳程序拖入。记下子程序的pid和前两个字节。
(2)另开一个OD,附加Processid后面的值进程或用工具ArmaDetach所记下的进程id,附加后,ALT+F9返回程序,将前两个字节改为原程序载

入时的前两个字节。
6、下面的做法就和标准壳的一样了,在附加的OD中:
双变单:方法有二。其一:patch法。其二修改跳转法。
方法一:下断点BP OpenMutexA(双变单),F9运行,断下后,ctrl+g到00401000,将空数据改为如下代码:
00401000      60               pushad
00401001      9C               pushfd
00401002 68 A0FD1200 push xxxx  (注:此处的  xxxx为断下后name前的数值。)  
00401007      33C0             xor eax,eax
00401009      50               push eax
0040100A      50               push eax
0040100B      E8 E694A677      call KERNEL32.CreateMutexA
00401010      9D               popfd
00401011      61               popad
00401012    - E9 8F9FA777      jmp KERNEL32.OpenMutexA
点右键选择重建eip,f9运行,断下后,取消断点, ctrl+g到00401000,恢复修改。
方法二:下断点BP OpenMutexA,SHIFT+F9运行,断下后,ALT+F9返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9

,断下后,ALT+F9返回,再次将返回代码下面的第一个跳转改为相反跳转。然后再一次SHIFT+F9,取消断点,至此,同样,双进程转单进程完毕!
此法相对简单,另外适用于00401000空数据不能修改的程序。
(2)修改Magic Jump 。
下断BP GetModuleHandleA+5,运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree后,再运行一次,就是返回时机,中

断后alt+f9返回,在KERNEL32.LoadLibraryA下面找到Magic Jump!修改为jmp。清除所有断点,再直接按F9运行,出现暂停。这时大功告成。
(3)用Imprec1.6f选择进程附加的那个进程,填入OEP地址,填第4步所记下的RAV,SIZE=1000,不要按自动搜索IAT,直接按获取输入表,再

按显示无效地址,剪掉修复抓取文件就OK了。
(四)全保护脱壳脱壳方法
1、双变单可以用以下方法,也可以用脚本,目的是双变单。记下程序加载时的前两个字节。运行脚本后,记下OEP的前两个字节,OEP地址和子

进程ID。
2、用OD附加子进程,加载后,ALT+F9返回,修改前两个字节为脚本记载的OEP的前两个字节。
3、处理IATL输入表
方法:(1)用工具ARMADETACH,将带壳的程序拖入,记下子进程的ID。(2)另开一OD,附加该子进程,加载后,ALT+F9返回,修改前两个字

节为加壳程序载入时的前两个字节。(3)修改Magic Jump ,CTRL+G,输入GetModuleHandleA,在其下面的第一个跳转下硬件执行断点,

Shift+F9运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree后,再运行一次,就是返回时机,中断后alt+f9返回,在

KERNEL32.LoadLibraryA下面找到Magic Jump!修改为jmp。往下拉找到两个salc,在其上面的jmp上下断,Shift+F9,断下!撤消Magic Jump处

的修改!CTRL+G,输入GetCurrentThreadId/ CreateThread,下断,运行,中断后,删除断点,alt+f9返回,F8单步走,到第一个CALL ECX之

类的东西时,F7进入。(此时的OEP是伪OEP,但此时的IAT是正确的。先开的OEP是对的,但IAT是错误的)。(4)打开先前的OD,CTRL+B,搜

索FF25,在数据窗口跟随,找到函数的起始位置,选定1-3个,二进制复制,打开后面所开的OD,打开内存镜像,在此界面中点一下,二进制搜

索,将刚才复制的粘贴,找到后,在转存窗口,找到函数的起始地址,选定到末尾,将选定的函数复制到先前开的OD的数据窗口,要对整齐(

起点要一样),这时,后开的OD的任务完成(目的就是将未加密的IAT找到)。
4、用AMINLINE工具修复,选择第一个OD所用的子进程,在Code Splicing中开始Code的地址自动给填好了,但长度需要设置一下,大一些,

20000左右就可以了,修复。在IAT的长度要根据实际情况,一般选1000即可,依次进行修复,修复后,在OD中修复的地方都变成红色。
5、用Imprec修复,无效指针CUT。
6、如果有类似自校验的,则用AMINLINE工具中的nanomites选项修复。
2008-9-27 11:17
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
thanks~,试试看
2008-9-27 11:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢大家的帮助,我试试看,还有坛主那个更改EIP是弹出个windows错误对话框啊,按shift+F9不管用的。
2008-9-27 12:17
0
雪    币: 889
活跃值: (4027)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
7
4楼的请教下    全保护  在找到magic JUMP  后下个断点 CreateThread   返回不了程序领空

而是红色的代码  一单步  程序终止   是OD没隐藏好么    谢谢   请指教  
2008-10-14 14:31
0
雪    币: 319
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
怎么样才算隐藏好了,我脱这个的时候也经常会自动关闭。郁闷了好久了。。。。。。。。。。。。。。。。。
2008-10-14 15:41
0
雪    币: 302
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
出现这种异常后,直接点击选项--高度设置--异常。。增加最近的异常,然后把忽略的那个选项勾选上~~~调这个壳出现这种异常是很很很正常的~~~~~你可以试下~~
2011-4-28 19:20
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
红色的代码,表示程序解码完毕
2011-5-20 22:09
0
游客
登录 | 注册 方可回帖
返回
//