首页
社区
课程
招聘
attach法脱壳
发表于: 2004-5-12 10:27 14316

attach法脱壳

2004-5-12 10:27
14316

attach法脱壳
kongfoo/2004.5.10-12

  现在的壳anti都不弱,如果从壳入口一步步跟到OEP的话会很累,这里介绍
一种比较舒服的方法,不过有小小要求:掌握壳的一般知识,如IAT加密,stolen
code等。掌握PE文件知识,如一般地址表会放在什么地方,各种编译器生成的代码
入口点一般在什么地方等。掌握汇编语言的编写,因为我们面对的是加密后的IAT,
修复时通常都要写程序修复。
  快速脱壳方法有很多种,Memory Map断点法(我最先见到是二哥/David的文章
介绍这种方法),ESP定律法(fly大侠总结出来的方法)等。
  现在这种方法姑且叫attach法吧,当然这个方法不是我首创的,我只是总结一下。
相信很多大侠都用过这种方法脱壳:)这种方法有局限性:目标有anti attach的话就
很麻烦了,比如双进程,进程逃逸等。

  DFCG上Volx大侠提供的asp1.4壳目标程序。用这个程序做attach法脱壳例子不很
合适,因为这个程序在OD下可以运行起来,而attach法脱壳比较适用于对付在OD下不
能直接运行起来的壳。不管了:) 这里只介绍有这样一种办法,当然只靠这个方法
是不行的,几种方法结合起来才有效率。
壳入口:(OD设置:忽略全部异常,IsDebuggerPresent Hide)

00401000 >  68 01D07300     PUSH dskchkr.0073D001
00401005    E8 01000000     CALL dskchkr.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
00CDCA18    33C0            XOR EAX,EAX
00CDCA1A    50              PUSH EAX
00CDCA1B    50              PUSH EAX
00CDCA1C    50              PUSH EAX
00CDCA1D    FF7424 10       PUSH DWORD PTR SS:[ESP+10]
00CDCA21    50              PUSH EAX
00CDCA22    F2:             PREFIX REPNE:                            ; Superfluous prefix
00CDCA23    EB 01           JMP SHORT 00CDCA26
00CDCA25    90              NOP  ==处理过花指令
00CDCA26    68 BF20C477     PUSH 77C420BF  ==根据这个地址很容易就找出原API地址了
00C815CE    85C0            TEST EAX,EAX

00C815DE    81FE 5024CA00   CMP ESI,0CA2450  ==本来想去ca2450看看的,眼花了看成是ca4250,去到一看,乖乖,是正确的API地址表!
00402676    FF15 6034CD00   CALL DWORD PTR DS:[672B6EAE]  ==在402678下内存写断

00C95755    8906            MOV DWORD PTR DS:[ESI],EAX  ==断下来,知道处理代码的地址就好办了。
                            ==重来,bp VirtualAlloc原程序解码后去c95755写修复代码就行了
00CA3650    50              PUSH EAX
00CA3651    B8 00044000     MOV EAX,500000
00CA3656    3B28            CMP EBP,DWORD PTR DS:[EAX]
00CA3658    74 0C           JE SHORT 00CA3666
00CA365A    83C0 04         ADD EAX,4
00CA365D    3D 04064000     CMP EAX,500204
00CA3662    77 0F           JA SHORT 00CA3673
00CA3664  ^ EB F0           JMP SHORT 00CA3656
00CA3666    8906            MOV DWORD PTR DS:[ESI],EAX
00CA3668    58              POP EAX
00CA3669    0FB74424 04     MOVZX EAX,WORD PTR SS:[ESP+4]
00CA366E  ^\E9 E920FFFF     JMP 00C9575C
00CA3673    8928            MOV DWORD PTR DS:[EAX],EBP
00CA3675    8305 5E36CA00 04    ADD DWORD PTR DS:[CA365E],4
00CA367C  ^ EB E8               JMP SHORT 00CA3666
00401268    E8 8FA18D00     CALL 00CDCB18  ==地址是动态的。跟去分析一下,原来是把FF15的CALL变成E8的CALL,
                      ==最后一字节随机,在修复API地址前在401268下内存写断,用代码修复。

00C9369A    C603 E8         MOV BYTE PTR DS:[EBX],0E8  ==这里断下,ebp是原API地址
00CA3700    50              PUSH EAX
00CA3701    B8 00044000     MOV EAX,500000
00CA3706    3B28            CMP EBP,DWORD PTR DS:[EAX]
00CA3708    74 0C           JE SHORT 00CA3716
00CA370A    83C0 04         ADD EAX,4
00CA370D    3D 04064000     CMP EAX,500204
00CA3712    77 0F           JA SHORT 00CA3723
00CA3714  ^ EB F0           JMP SHORT 00CA3706
00CA3716    66:C703 FF15    MOV WORD PTR DS:[EBX],15FF
00CA371B    8906            MOV DWORD PTR DS:[ESI],EAX
00CA371D    58              POP EAX
00CA371E  ^ E9 7DFFFEFF     JMP 00C936A0
00CA3723    8928            MOV DWORD PTR DS:[EAX],EBP
00CA3725    8305 5E36CA00 0>ADD DWORD PTR DS:[CA365E],4
00CA372C    8305 0E37CA00 0>ADD DWORD PTR DS:[CA370E],4
00CA3733  ^ EB E1           JMP SHORT 00CA3716
00C93F94    E8 6717FFFF     CALL 00C85700                            ; JMP to kernel32.GetProcAddress
00C85700  - FF25 7042CA00   JMP DWORD PTR DS:[CA4270]                ; kernel32.GetProcAddress
00C85706    8BC0            MOV EAX,EAX

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

收藏
免费 10
支持
分享
最新回复 (34)
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
2
顺便放上新版的API地址专家。萸僻??ㄩ蜇璃ㄐ 点击下载:附件!
2004-5-12 10:42
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
3
Thanks
2004-5-12 11:12
0
雪    币: 229
活跃值: (50)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
Good!
2004-5-12 12:22
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
5
学习

第一篇公开的asp1.4脱壳笔记

2004-5-12 12:36
0
雪    币: 260
活跃值: (86)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
我认为attach的方法在某些时候脱出来的程序会发生莫名其妙的问题如果是在attach以后dump出来的程序,很多全局变量都是被初始化过了的,这就是为什么提倡在eop的时候dump(其实也不一定要在eop的时候dump,只要在壳解码完毕后dump都可以),很佩服
作者的运气..竟然能瞎撞到iat...我怎么就从来没有这么好的运气呢
.
2004-5-12 12:58
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
其实不要那个“碰到”的IAT也可以呀。fly那篇1.3的就是一个借鉴。
2004-5-12 13:05
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
8
用attach上的程序和壳比较一下就可以发现,壳的代码在程序运行后换成原程序的代码了。
我们要做的是恢复一份IAT。在进程空间bpx j,观察一下函数调用情况,都CALL到动态申请的空间了,有部分API没有处理。
  看看一个地址项目:
call [cdca0c] cdca0c的内容是cdca18,去cdca18分析一下代码就可以找出原API地址。
(伪API代码cdca18紧接着cdca0c后面)

代码:--------------------------------------------------------------------------------
00CDCA18    33C0            XOR EAX,EAX
00CDCA1A    50              PUSH EAX
00CDCA1B    50              PUSH EAX
00CDCA1C    50              PUSH EAX
00CDCA1D    FF7424 10       PUSH DWORD PTR SS:[ESP+10]
00CDCA21    50              PUSH EAX
00CDCA22    F2:             PREFIX REPNE:                            ; Superfluous prefix
00CDCA23    EB 01           JMP SHORT 00CDCA26
00CDCA25    90              NOP  ==处理过花指令
00CDCA26    68 BF20C477     PUSH 77C420BF  ==根据这个地址很容易就找出原API地址了
--------------------------------------------------------------------------------

有一个最苯的办法, 但却是最简单的办法,
把每一个调用都跟踪一遍, 就可确定 IAT.

100多个API, 半天时间. hehe
不用分析壳代码,自己分析也要半天时间吧.
当然要偷壳技术的例外.
2004-5-12 13:49
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
9
多谢pll621老大的提醒:D

StudentII大侠说的也对:)

to simonzh2000兄弟:好耐性:D :D
2004-5-12 14:38
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
文章不错,konfoo老兄你的那个软件通过api找地址好像并不好用。
2004-5-12 15:00
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
11
。。。没有到其它平台测试过:p
什么现象?
2004-5-12 15:05
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
win2000sp4

2004-5-12 15:21
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
13
找API名是用API地址找API名,比如输入77e7b65b就会找出是哪个API:D
2004-5-12 15:33
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
14
呵呵,搞错
2004-5-12 15:48
0
雪    币: 267
活跃值: (285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
呵呵........
好文章啊,不过看不懂啊!
菜啊!
买了本第二版的《加密与解密》,看了才一点呢。
恩,回家好好学了。
2004-5-12 15:56
0
雪    币: 266
活跃值: (191)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
好!
2004-5-12 16:47
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
17
这个方法直接dump然后dasm就……:D
不过还是支持。
2004-5-12 19:35
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
18
最初由 forgot 发布
这个方法直接dump然后dasm就……:D


详细点。。。不明白呢:(
2004-5-12 19:59
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
19
最初由 kongfoo 发布


详细点。。。不明白呢:(

呵呵,开玩笑,不是说aspr1.4,像后来的样板弱壳直接dump用w32dasm找到iat嘛...
2004-5-12 20:04
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
20
oh i c :D
2004-5-12 21:49
0
雪    币: 303
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 simonzh2000 发布
用attach上的程序和壳比较一下就可以发现,壳的代码在程序运行后换成原程序的代码了。
我们要做的是恢复一份IAT。在进程空间bpx j,观察一下函数调用情况,都CALL到动态申请的空间了,有部分API没有处理。
  看看一个地址项目:
call [cdca0c] cdca0c的内容是cdca18,去cdca18分析一下代码就可以找出原API地址。
(伪API代码cdca18紧接着cdca0c后面)

代码:--------------------------------------------------------------------------------
00CDCA18 33C0 XOR EAX,EAX
00CDCA1A 50 PUSH EAX
00CDCA1B 50 PUSH EAX
00CDCA1C 50 PUSH EAX
00CDCA1D FF7424 10 PUSH DWORD PTR SS:[ESP+10]
00CDCA21 50 PUSH EAX
00CDCA22 F2: PREFIX REPNE: ; Superfluous prefix
00CDCA23 EB 01 JMP SHORT 00CDCA26
00CDCA25 90 NOP ==处理过花指令
00CDCA26 68 BF20C477 PUSH 77C420BF ==根据这个地址很容易就找出原API地址了
--------------------------------------------------------------------------------




有一个最苯的办法, 但却是最简单的办法,
把每一个调用都跟踪一遍, 就可确定 IAT.

100多个API, 半天时间. hehe
不用分析壳代码,自己分析也要半天时间吧.
当然要偷壳技术的例外.


把每一个调用都跟踪一遍,遇到这种情况怎么办?给点提示?
http://bbs.pediy.com/showthread.php?s=&threadid=947
2004-5-16 21:54
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
22
最初由 liuyilin 发布


把每一个调用都跟踪一遍,遇到这种情况怎么办?给点提示?
http://bbs.pediy.com/showthread.php?s=&threadid=947


你被干扰啦:D
壳把API偷了过来,原API:(比较一下就可以发现怎样找原API了吧)
77D172EC >  A1 60D0D677     MOV EAX,DWORD PTR DS:[77D6D060]
77D172F1    F640 02 04      TEST BYTE PTR DS:[EAX+2],4
77D172F5    56              PUSH ESI
77D172F6    8B7424 08       MOV ESI,DWORD PTR SS:[ESP+8]
77D172FA    0F85 6EE00200   JNZ USER32.77D4536E
77D17300    803E 00         CMP BYTE PTR DS:[ESI],0
77D17303    74 01           JE SHORT USER32.77D17306
77D17305    46              INC ESI
77D17306    8BC6            MOV EAX,ESI
77D17308    5E              POP ESI
77D17309    C2 0400         RETN 4
2004-5-17 10:36
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我用od attack上某程序,然后按错了某fx建,od和程序同归于今了!^_^!
2004-5-17 21:51
0
雪    币: 303
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
最初由 kongfoo 发布


你被干扰啦:D
壳把API偷了过来,原API:(比较一下就可以发现怎样找原API了吧)

77D172EC > A1 60D0D677 MOV EAX,DWORD PTR DS:[77D6D060]
77D172F1 F640 02 04 TEST BYTE PTR DS:[EAX+2],4
77D172F5 56 PUSH ESI
77D172F6 8B7424 08 MOV ESI,DWORD PTR SS:[ESP+8]
77D172FA 0F85 6EE00200 JNZ USER32.77D4536E
77D17300 803E 00 CMP BYTE PTR DS:[ESI],0
77D17303 74 01 JE SHORT USER32.77D17306
77D17305 46 INC ESI
77D17306 8BC6 MOV EAX,ESI
77D17308 5E POP ESI
77D17309 C2 0400 RETN 4

多谢kongfoo
麻烦你再看看这个API怎么跟??一直没有头绪???
0040467C    FF15 A44B9A00   CALL DWORD PTR DS:[9A4BA4]
多谢
点击下载:附件!
2004-5-18 18:21
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
25
看到有MOV ECX,DWORD PTR DS:[77D6D060],77d6是user32的地址啦,
在user32中找这个命令,几次就可以找到了:
77D16349 >  8B0D 60D0D677   MOV ECX,DWORD PTR DS:[77D6D060]
77D1634F    8B91 F8080000   MOV EDX,DWORD PTR DS:[ECX+8F8]
77D16355    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
77D16359    8910            MOV DWORD PTR DS:[EAX],EDX
77D1635B    8B89 FC080000   MOV ECX,DWORD PTR DS:[ECX+8FC]
77D16361    8948 04         MOV DWORD PTR DS:[EAX+4],ECX
77D16364    33C0            XOR EAX,EAX
77D16366    40              INC EAX
77D16367    C2 0400         RETN 4

9a4ba8里面前面的几个指令只是干扰,没有作用的。
2004-5-18 20:13
0
游客
登录 | 注册 方可回帖
返回
//