首页
社区
课程
招聘
simonzh的unpackme脱壳
发表于: 2005-5-18 16:41 8565

simonzh的unpackme脱壳

2005-5-18 16:41
8565

目标程序:http://bbs.pediy.com/showthread.php?s=&threadid=13753
工具: Driver Studio v3.2/IceExt v0.67,LoadPE,ImportRec

步骤:
   
: bpmb SetThreadContext x do "d (*(esp+8) + b8)"
: bpmb WaitForDebugEvent x

运行,断在WaitForDebugEvent,F12回程序空间(即注入winlogon的代码)

: bd 2(禁止WaitForDebugEvent)
: bpx xxxx076C do "d eax"  ; 对测试dwDebugEventCode处下断,xxxx0000为分
                           ; 配内存的基地址,offset=076C

壳代码引起的EXCEPTION_DEBUG_EVENT有3次:

1. 地址010204E4,代码为int 3
   然后SetThreadContext,eip->0102060A

2. 地址01020F88,代码为lock cmpxchg8b eax
   SetThreadContext,eip->01026583

3. 地址01027945代码int 3,这里明显在解码

可以看到,3次异常地址都在壳代码的section内。显然,原程序与
壳代码之间没有联系。

对ContinueDebugEvent下断:

: bpmb ContinueDebugEvent x

断下后:

: proc ->查calc的KTEB
: addr KTEB
: u 01027945

在int 3后的NOP下断,禁止除此之外的其他断点,F5
继续调试,断到子进程内。直接用esp定律:

: bpmb 23:6FFC0 w

断下2次后F8单步很快到这里:

01028ED8: jmp eax   ; eax=00550EED

stolen code:

   00550EED        push 00000070   
                jmp 00550EF4
        ->        push 01001606       
                jmp 00550EFE
                add dword ptr [ecx],-1b
        ->        push 00550F09        ; 变形的call的返回
                push 01012C18
                ret               

   00550F09        jmp 00550F0E
                _JUNKCODE
        ->        push 010128B1
                ret                ; 回原程序

  得到OEP为010128A5,stolen codes为:
  
  push 70
  push dumped.01001608
  call dumped.01012C18       
  
  Dump: Correct Imagesize,dump full,rebuild PE.
       
  
  修复IAT,可以直接用ImportRec手工完成,可看出真正的api(不仔细点
  容易认错),但数量多了点,还是跟一跟.

  iat开始: 01001000, 结束01001238, size=0x238

  在2次SetThreadContext后,可以看到iat中还未填入redirected api(实际
  iat内是加密api name的rva).

  :bpmb LoadLibraryA x
   
  F12返回到01027BDC,单步跟,很快会出现第1个iat项的地址: 01001020
  到这里:

  01027FFF call [ebp+40BAFB] -> 550000

  跳到GetProcAddress+0xF的地址。取到api地址,第1个为WaitForSingleObject
  patch下面的标记检测,即可得到干净的IAT。
  
             or ecx,ecx (此时=1)
  01028257   jz ....   -> Patch为jmp

建议:

1. 花指令过于单一,作用不大(是否源代码每行都用了,实在太多)
2. 对内核debugger防范不够,不用IceExt都可以跑
3. anti-debug不够,缺少自校验,可较轻松地设断,Hying的壳就难缠得多
4. IAT加密太容易被跳过了.
5. 被保护程序与壳代码联系不够,可加入replaced code.
6. stolen code温柔了点

个人意见,纯属信口开河。不喜欢用inject的壳,脱壳不好调试 :-)
(手伸得太长,有被列入病毒的危险吧)

请问simonzh:

我开始是用OD的,使代码注入到自己而不是winlogon,这样可以继续用OD调试.
但用WriteProcessMemory向子进程写入"\??\d:\windows\system32\winlogon.exe"
(用winlogon的路径替代calc)后,下一个调试事件是EXIT_PROCESS_DEBUG_EVENT,
即子进程退出了,能否解释一下?(我没有调试子进程,而且DebugActiveProcessStop
我用不来)。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 255
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持,很久没用SICE了~!
2005-5-18 16:46
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
3
或许用SoftICE对付这样的程序是比较好的选择

里面有几次GetTickCount检测时间
注入之后还有一次检测“\??\”,防止你替换winlogon.exe
2005-5-18 17:30
0
雪    币: 266
活跃值: (191)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
学习。。
2005-5-18 18:28
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

有的消化了
学习ing
2005-5-18 19:01
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
6
softworm 兄弟强.

关于 IAT 的哪个跳转都是被 MS 给害了.
calc.exe , notepad.exe 等用了
msvcrt.dll 中一些比较特殊的 API.
为了兼容, 比较了一下.

对内核调试器检测有什么好的方法?

花指令, 我是借用 cyclotron 兄弟的, 我自己只加了一组.

至于 codereplace 等, res 压缩, 限于能力和时间, 以后再说了.

至于 OD 退出, 兄弟再分析一下子进程.
2005-5-18 21:03
0
雪    币: 323
活跃值: (589)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
7
弓虽人,能用softice脱壳!
2005-5-19 12:39
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
强强强强强强强强强强强强强强强强强强强强强强!!!!!!!!!!!!
2005-5-20 13:29
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
学习
2005-5-20 14:16
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
10
我在试着使用OD来脱这个几乎是用上了所有检测OD手段的变态壳.不过由于时间关系,上次在某个地方被阴之后就没继续,好象壳在调用ZwQueryTreadInformation之后的某个地方会改写寄存器阴人.
2005-5-20 23:37
0
雪    币: 111
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
检测od也就那几个手段,ZwSetInformationThread,ZwQueryInformationProcess,GetTickCount
还有么?

偶用od最烦的还是双进程解码... 每次一碰到这个就进度减慢到原来的1/n
2005-5-21 12:09
0
游客
登录 | 注册 方可回帖
返回
//