首页
社区
课程
招聘
[求助]EncryptPE V2.2006.10.05脱壳遇的问题!
发表于: 2006-10-7 00:56 13208

[求助]EncryptPE V2.2006.10.05脱壳遇的问题!

2006-10-7 00:56
13208
我先是跟到了EPE里面,用OD对当前进程脱壳..脱壳后是1.14MB..
F8跟到了
010131CD    6A 00           PUSH 0
010131CF    68 80000000     PUSH 80
010131D4    6A 04           PUSH 4
010131D6    6A 00           PUSH 0
010131D8    6A 00           PUSH 0
010131DA    68 000000C0     PUSH C0000000
010131DF    89E8            MOV EAX,EBP
010131E1    83C0 4C         ADD EAX,4C
010131E4    50              PUSH EAX
010131E5    89E8            MOV EAX,EBP
010131E7    83C0 2C         ADD EAX,2C
010131EA    FF10            CALL DWORD PTR DS:[EAX]   ;在这里动态创建了.EPE文件
010131EC    83F8 FF         CMP EAX,-1
010131EF    0F84 86000000   JE Notepad.0101327B

然后是多次跟踪知道是在:
CALL EBX的地方进入EPE

并且用..PEID查到是是UPX的壳..好难过....
E:\unpack\V22006105.EPE
UPX 0.80 - 1.24 DLL -> Markus & Laszlo

好不容易把UPX的壳也给扒了..

我还跟到了这里全是API..就用IMPREC把它给修好保存了下来..
7112729A    8BC0            MOV EAX,EAX
7112729C  - FF25 68942171   JMP DWORD PTR DS:[71219468]              ; kernel32.GetCommandLineA

再用IMPREC把这个IAT表修复到了EPE文件..原来EPE文件是个DLL文件.
我现在把它放到了
C:\Documents and Settings\new\Local Settings\Temp
这个目录下.
因为在这个版本里把WINDOWS\SYSTEM32这样的目录换到了这个临时地方..

经过改名..发现..我修改的EPE脱壳程序正常...并没有提示错误!
可是由于原文件是临时在内存中创建的,对加壳后的文件不解压缩.
从我跟来看加壳文件和运行文件为不同进程..当加壳文件把运行文件释放到内存后就退出进程.所以和以前的壳来说这次老王把最毒的一招放了出来!
根本就跟不到OEP....全都是动态生成的!

而我把程序DUMP出来后.是不知道怎么修复了..
程序DUMP出来是560KB..原文件是430KB...

把我跟踪的临时记录写在下面大家看看了,乱七八遭的...
-------------------------------------------------------------
//OD进入在这里...
//WINXP的记事本为0000739D

01013000 >  60              PUSHAD
01013001    9C              PUSHFD
01013002    64:FF35 0000000>PUSH DWORD PTR FS:[0]
01013009    E8 73010000     CALL Notepad.01013181

//保留INT3,其他都忽略...
BP IsDebuggerPresent
BP GetProcAddress
//无论怎么样都不会再像以前一样断下了....直接就运行了,有难度...不喜欢!
比以前厉害多了下什么断点都 不会再断下...

//我选择了F8..直接跟到这里...
0101329F    83F8 00         CMP EAX,0
010132A2    74 18           JE SHORT Notepad.010132BC
010132A4    89C3            MOV EBX,EAX
010132A6    89E8            MOV EAX,EBP
010132A8    05 6A010000     ADD EAX,16A
010132AD    8B08            MOV ECX,DWORD PTR DS:[EAX]
010132AF    8B50 04         MOV EDX,DWORD PTR DS:[EAX+4]
010132B2    83C0 09         ADD EAX,9
010132B5    01D0            ADD EAX,EDX
010132B7    01C8            ADD EAX,ECX
010132B9    50              PUSH EAX
010132BA    FFD3            CALL EBX    //程序运行...
010132BC    6A 00           PUSH 0
010132BE    89E8            MOV EAX,EBP
010132C0    83C0 48         ADD EAX,48
010132C3    FF10            CALL DWORD PTR DS:[EAX]

//重来...

下断 BP GetProcAddress

N....多后又运行....实在是抓不住重点...

//第一次:
7C80AC28 >  8BFF            MOV EDI,EDI                              ; V2200610.7123600F
7C80AC2A    55              PUSH EBP
7C80AC2B    8BEC            MOV EBP,ESP
7C80AC2D    51              PUSH ECX
7C80AC2E    51              PUSH ECX

0007F854   7123F375  /CALL 到 GetProcAddress 来自 V2200610.7123F36F
0007F858   7C800000  |hModule = 7C800000 (kernel32)
0007F85C   71236009  \ProcNameOrOrdinal = "Sleep"

//N....次后出现这个..^_^有点希望..

0007FF90   0101329F  /CALL 到 GetProcAddress 来自 Notepad.0101329D
0007FF94   71120000  |hModule = 71120000 (V2200610)
0007FF98   01013169  \ProcNameOrOrdinal = "EncryptPE_Init"

//窗口跟随到这里...
01013286    FF10            CALL DWORD PTR DS:[EAX]
01013288    83F8 00         CMP EAX,0
0101328B    74 2F           JE SHORT Notepad.010132BC
0101328D    89C3            MOV EBX,EAX
0101328F    89E8            MOV EAX,EBP
01013291    05 5B010000     ADD EAX,15B
01013296    50              PUSH EAX
01013297    53              PUSH EBX
01013298    89E8            MOV EAX,EBP
0101329A    83C0 44         ADD EAX,44
0101329D    FF10            CALL DWORD PTR DS:[EAX]
0101329F    83F8 00         CMP EAX,0
010132A2    74 18           JE SHORT Notepad.010132BC
010132A4    89C3            MOV EBX,EAX
010132A6    89E8            MOV EAX,EBP
010132A8    05 6A010000     ADD EAX,16A
010132AD    8B08            MOV ECX,DWORD PTR DS:[EAX]
010132AF    8B50 04         MOV EDX,DWORD PTR DS:[EAX+4]
010132B2    83C0 09         ADD EAX,9
010132B5    01D0            ADD EAX,EDX
010132B7    01C8            ADD EAX,ECX
010132B9    50              PUSH EAX  
010132BA    FFD3            CALL EBX  ;在这里会程序运行..

//到了EPE1的代码里..
711EB50C >  55              PUSH EBP                                 ; Notepad.0101300E
711EB50D    8BEC            MOV EBP,ESP
711EB50F    51              PUSH ECX
711EB510    E8 01000000     CALL V2200610.711EB516                   ;这里程序就运行了

//继续看了....我们F8直接跟到这里....

0101327B    89E8            MOV EAX,EBP                              ; Notepad.0101300E
0101327D    83C0 4C         ADD EAX,4C
01013280    50              PUSH EAX
01013281    89E8            MOV EAX,EBP
01013283    83C0 40         ADD EAX,40
01013286    FF10            CALL DWORD PTR DS:[EAX]
01013288    83F8 00         CMP EAX,0

//往下就是..
010132B7    01C8            ADD EAX,ECX
010132B9    50              PUSH EAX
010132BA    FFD3            CALL EBX      ;程序运行...
010132BC    6A 00           PUSH 0
010132BE    89E8            MOV EAX,EBP

//我们看到了受保护的IAT..
711EB7B3    53              PUSH EBX                                 ; V2200610.EncryptPE_Init

//如果我没猜错的话,IAT表要从这里破..
711EB7EC    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]            ; Notepad.01080EC5
711EB7EF    8B00            MOV EAX,DWORD PTR DS:[EAX]

//我们在这里看到了API..
71124B9B    E8 E8FEFFFF     CALL V2200610.71124A88
71124BA0    893B            MOV DWORD PTR DS:[EBX],EDI
71124BA2    5F              POP EDI
71124BA3    5E              POP ESI
71124BA4    5B              POP EBX
71124BA5    C3              RETN

//让我猜对了API表都在这里....嘿嘿...找到IMPREC把IAT列表保存起来..
7112729A    8BC0            MOV EAX,EAX
7112729C  - FF25 68942171   JMP DWORD PTR DS:[71219468]              ; kernel32.GetCommandLineA

//跟到这里程序运行...
//可怜估计是文件不会解压缩的,只是动态创建..郁闷了!
711EBAEB    E8 E4C3F3FF     CALL V2200610.71127ED4                   ; JMP 到 USER32.SendMessageA

//发现这个...
EBX=0101305A (Notepad.0101305A), ASCII "C:\DOCUME~1\new\LOCALS~1\Temp\"

010131CD    6A 00           PUSH 0
010131CF    68 80000000     PUSH 80
010131D4    6A 04           PUSH 4
010131D6    6A 00           PUSH 0
010131D8    6A 00           PUSH 0
010131DA    68 000000C0     PUSH C0000000
010131DF    89E8            MOV EAX,EBP
010131E1    83C0 4C         ADD EAX,4C
010131E4    50              PUSH EAX
010131E5    89E8            MOV EAX,EBP
010131E7    83C0 2C         ADD EAX,2C
010131EA    FF10            CALL DWORD PTR DS:[EAX]   ;在这里动态创建了.EPE文件
010131EC    83F8 FF         CMP EAX,-1
010131EF    0F84 86000000   JE Notepad.0101327B

我把它按路径复制了下来...
并且用..PEID查到是是UPX的壳..好难过....
E:\unpack\V22006105.EPE
UPX 0.80 - 1.24 DLL -> Markus & Laszlo

看来我是跟本搞不定了看大大们帮忙了..太菜了!!
我们先来看看怎么脱这个文件吧...

每次都到这里就运行了..!_!
711EBAE8    8B00            MOV EAX,DWORD PTR DS:[EAX]
711EBAEA    50              PUSH EAX
711EBAEB    E8 E4C3F3FF     CALL V2200610.71127ED4                   ; JMP 到 USER32.SendMessageA

71124495    64:8902         MOV DWORD PTR FS:[EDX],EAX
71124498    FFD1            CALL ECX                                 ; V2200610.71122325
7112449A    C2 0C00         RETN 0C
7112449D    C3              RETN

脱的太垃圾了....EPE的UPX壳让我给扒了..不知道为什么只有深度扫描才出来..是普通程序...真的很晕哦.

EPE的壳是UPX..我不知道为什么..我扒的很垃圾了...但是,程序却运行正常...

711249B2    E8 A1FEFFFF     CALL V2200610.71124858  就在这里了.....程序关键的地方...

最后请大大们说说怎么可以脱掉程序....怎么才能找到OEP.....

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (32)
雪    币: 439
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用JJ脱呀
2006-10-7 01:47
0
雪    币: 89
活跃值: (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是呀SHOOO大侠的GG很好用,现在已经公用
2006-10-7 11:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xlh
4
暂时有点难度
2006-10-7 19:15
0
雪    币: 218
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不明白 SHOOO大侠的GG在那里下 可以给个链接吗?
方便研究啊
2006-10-8 17:31
0
雪    币: 218
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
知道的高手提示下!不知道全称,在论坛找了N久还是找不到!谢谢!明天继续关注中・!
2006-10-8 18:34
0
雪    币: 1667
活跃值: (286)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
如果直接拿脱壳机脱了..那还学习什么手脱壳...
2006-10-8 22:47
0
雪    币: 7
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
8
最初由 menting 发布
如果直接拿脱壳机脱了..那还学习什么手脱壳...

支持
2006-10-8 22:49
0
雪    币: 506
活跃值: (388)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
这个V2.2006.10.05的机机也公布了??不会吧。
2006-10-9 08:59
0
雪    币: 218
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
还是没有答案。不知道 JJ  是什么东西
2006-10-10 11:30
0
雪    币: 218
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看雪真的没人知道 还是这个问题太无聊啊!
2006-10-22 23:49
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
12
JJ不支持最新版
2006-10-23 01:04
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不是说现在壳都自己实现GetProcAddress么?
老王怎么还是那么落伍?
2006-10-25 14:28
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
发现楼主真的好认真,
新版的老王壳我没研究过,估计你玩的是老王的非s方式的程序,非s模式是种特殊的双进程壳,在explorer中解码,这样脱是不行的
你用server方式加个记事本,练练手,我估计你应该可以解决
PS:不知道新版有没有s,非s这种概念.
2006-10-25 15:13
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
V2006105.epe脱了也能正常运行?好像还要检验吧?不解.
2006-10-27 16:20
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
进程逃逸,注入解码。
2006-10-27 20:22
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
那个SendMessage是发送一个消息到explorer的Pragman窗口,消息ID为0xC130,后面的参数自己看看就知道了.因为已经利用SetWindowsHookEx安装了消息处理钩子,所以注入到explorer中的V2模块会处理这个消息,这个消息处理中会用DEBUG_ONLY_THIS_PROCESS方式重新启动目标进程.在目标进程中,应该会对父进程以及父进程所对应的文件进行检测,如果不是explorer,那么前面所做的事情会重做一遍.如果是,接下来就是释放目标进程的真实代码了并运行了.但是在释放以及运行过程中,EPE壳的SDK好象提供代码保护功能,能够利用一些异常(好象大部分是INT3,INT1)来隐蔽的调用受保护代码.因为之前是以DEBUG_ONLY_THIS_PROCESS方式启动的进程,所以在SEH处理异常之前,伪调试器会收到DEBUG_EVENT,这样,在DEBUG_EVENT中执行受保护代码就相对安全.因为是以DEBUG_ONLY_THIS_PROCESS方式创建,所以一般的ATTACH方法无法ATTACH目标进程(OD,VC等都不行),就算你找到某种方法,可以使在explorer的V2模块中CreateProcess创建进程的时候不用DEBUG_ONLY_THIS_PROCESS方式启动目标进程,并且在进程一启动起来,你就把PEB中的DEBUG_FLAG置位,但是你还是没办法ATTACH,因为,一旦你ATTACH了某个调试器,那么进程所产生的DEBUG_EVENT会被你的调试器所接收到,一不小心就不会传递到EXPLORER了,这样那些受保护的关键代码将不能运行.所以,要完全脱掉1005以后的版本很困难(至少我觉得比较困难).我反正已经晕了,哪位大大给点提示啊?怎么样才能用OD Attach目标进程啊?
2006-11-11 17:05
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
不需要attach,完全可以脱的,你可以写个小程序伪造explorer.exe,欺骗过那个dll让它规规矩矩的在这个"explorer.exe"中解码,你调试这个父进程就可以了,注意绕开IAT加密,最后父进程会调用一个setThreadContext方法来改变子进程的regEip到真正的OEP处,此时dump子进程和修复IAT就行了。
2006-11-11 17:55
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 skylly 发布
不需要attach,完全可以脱的,你可以写个小程序伪造explorer.exe,欺骗过那个dll让它规规矩矩的在这个"explorer.exe"中解码,你调试这个父进程就可以了,注意绕开IAT加密,最后父进程会调用一个setThreadContext方法来改变子进程的regEip到真正的OEP处,此时dump子进程和修复IAT就行了。

子进程无法dump啊.这种方法我也试过了,的确可以让子进程起起来.小程序只需要名字叫explorer.exe,并且窗口类名为Progman就可以.但是子进程仍然无法dump.
2006-11-12 12:36
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
可以dump的,你hook setthreadcontext时,如果它调用时设置regEip的值在代码段中,这时你可以show一个messagebox,这时程序就停在这里了,就是dump的最好时机,类似那个半完美脱壳机
2006-11-12 12:40
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 skylly 发布
可以dump的,你hook setthreadcontext时,如果它调用时设置regEip的值在代码段中,这时你可以show一个messagebox,这时程序就停在这里了,就是dump的最好时机,类似那个半完美脱壳机

恩,有道理,准备明天试一下.但是我还是有两个疑问:首先,这个壳看似SDK可以保护代码,如果他在子程序中抛出调试事件,而在父进程的waitfordebugevent线程中替子进程执行操作,这样的话,我们脱出来的文件也没有办法直接运行啊.因为就算我们以调试状态起目标进程,但是我们没有把V2模块注入到progman窗口对应的进程中,调试事件无法得到正确的处理.除非他的SDK不是利用调试事件来保护代码.(不过这个的确有可能,因为听某位大大说,对不同的目标文件加壳以后生成的EPE文件都是样的.)
其次,如果我仅仅是想attach上目标进程,而不是希望把他完全脱壳呢?难道就没有更简单的方法吗?
2006-11-12 23:40
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
22
最初由 stupidass 发布
如果他在子程序中抛出调试事件,而在父进程的waitfordebugevent线程中替子进程执行操作,这样的话,我们脱出来的文件也没有办法直接运行啊.

我说的方法很多人都会,已经算比较简单的方法了,我只是说怎么dump,在OEP处dump可以得到大部分代码,SDK要自己想办法还原的

下面这个东西是forgot写的,我只是在他的基础上加了几条垃圾代码
2006-11-13 22:04
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
最初由 skylly 发布
我说的方法很多人都会,已经算比较简单的方法了,我只是说怎么dump,在OEP处dump可以得到大部分代码,SDK要自己想办法还原的

下面这个东西是forgot写的,我只是在他的基础上加了几条垃圾代码

感谢了。不过好象对最新的EPE加壳的记事本无效。
2006-11-14 13:09
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
还有一个问题,用了上面的那个explorer,如果启动非S模式加壳的目标进程,进程的主线程会被挂起。其原因就是因为EPE模块被注入了这个假的explorer模块。这和我自己写的一个加的explorer的实验效果是一样的。我的窗口类名也是Progman。我想是不是在壳里面还比较了explorer进程的宿主文件的绝对路径和系统路径之间的差别的啊?
2006-11-14 13:14
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
25
自动多试试就知道了,
老王的壳有什么好研究的,没挑战性。
国产壳还是要顶的。研究Themida吧,
2006-11-14 13:24
0
游客
登录 | 注册 方可回帖
返回
//