
一穿马甲—木马加壳的实现
什么是加壳?
所谓加壳其实是指利用特殊的算法对EXE DLL文件里的资派进行压缩的方法这个压绷之后的文件可以独立运行解压过程完全a蔽都在内存中完成。加壳一般有两种用途:
一是大部分的程序是因为防止反跟踪防止程序被人跟踪调试,防止算法程序不思被别人静态分析。加密代码和数据保护程序效据的完枯性,不被修改或者窥说程序的像代码。
二是将一些恶愈程序包装起来进过杀雌软件的监视。从而实现自己的fl的如加壳后的木马程序。显然我们这里的加壳主要是针对第二种情况。
2加壳实战
听起来加壳是个很复杂的 *** 作但实际上我们并不循要自己去编写加壳程序来为谏程序进行加充。日蔺成热的、免费的第三方加先程序非常多如UPX WWPACK等等。使用这些程序。只需进行简单的设置就可以对自己的软件进行加壳。比方说灰鸽子的服务器端就是使用UPX加壳的。
那么是不是加了壳的水马就能够成功的躲过任何杀毒软件的监控呢事实上在没有脱壳之前。的确能够发理壳内谏代码的杀毒软件还不多但是一且加壳的木马被执行之后。完成了脱光的过程那么跟踪内存的杀毒软件会很快的发现内存中正在运行中的木马最后将之杀掉。实际上。国内很多杀毒软件已经拿握了检洲加壳恶愈程序的技术。如在从服务器中下载加壳的木马服务器端程序时就会d出如I'd所示的提示。
从图中可以粉出Setupcxe文件中包括了加壳技术已经被检侧出来了。那么恶愈程序是如何实现加光的呢木马加壳的技术实际上很简单当一个服务器劝的EXE程序生成好后111以很轻松地利用ASPACK, UPX, WWPACK等这些第三方的程序进行加壳 *** 作。下面让我们来村肴如何使用AS Pack汉化版对一个程序进行加壳,其体过程是:
第1步:下载ASPack汉化版
第2步:在“选项设it界面中在语言一列表中选择"Chinese"项使软件界面转为汉化形式如图所示。
第3步:在“打开文件一界面中将准备进行加壳的程序添加进来这哄添加的是压编程序Winter如图所示。
第4步:在完成软件的添加后将立即跳转到压缩’界面中,此时可以肴到软件的加光 *** 作己经开始。如图所示。
第5步:在完成加壳后可以单击“压缩界面中的侧试按钮侧试一下加了壳后的程序能否运行。如果出现程序界面荆表示加壳成功。如果是对恶愈程序进行加壳一般就不要点击了否"1稗后工作将会很萦琐。如图所示。
与加壳相反的过程称之为脱壳二n的是把加壳后的程序恢艾成毫无包装的可执行代码,这样未授权都可以对其进行修改。“脱壳’的过程与加壳,的探作栩似沮不同是的“加壳
软件需要使用不间的“脱壳软件。人役者必裕知进目标程序使用的是哪种加光,软件进行加壳的然后再用对应的“脱充软件进行脱壳即可。简单地来说加壳与脱壳就相当于加密和
解密的关系。
看来文件加的是UPX壳,这个壳是最好脱的啦
对于这种壳最傻瓜的脱壳方法就是利用现成的软件脱壳,建议你先下载一个叫“upx压缩和解压器”的程序,打开,把你要脱壳的文件托进去,然后点击“执行”就行啦,再用PEID查时就脱去了壳~~~
关于手工脱壳方面的知识,有的比较复杂,建议可以积累积累,看看这方面的技术文章,像常挂在嘴边的“ESP定律法”等等,都可以去学学~~~
这个提示一般是说明没有壳,只是说明这个程序可能是Microsoft Visual C# / Basic NET来编写生成的
要学脱壳,先去看看<天草教程>吧
给你个地址
>
1,call eax ,进去是 oep, 根据你的图,oep == 00401000
2,处理下 iat , molebox iat 加密很简单,magic jump 就可以了
3,如果有文件捆绑,需要解绑文件。
4,补丁程序通常有自校验
如果只是脱壳,找脚本,找工具吧。
如果学习脱壳,molebox 难点在第3点,解绑文件,但是目测你前2步都没明白
想要脱VMP的壳,首要工作当然是要找一个强OD。至于是什么版本的OD自己多试验几个,网上有很多,一般来说只要加载了你想脱的VMP加壳程序不关闭都可以。
其次,就是StrongODdll这个插件了,现在用的比较多的就是海风月影。下载回来后复制到你的OD程序所在的文件夹里面的plugin里。StrongOD的设置选项搞不懂就全部打钩。
接下来要做的工作就是搞清楚我们要脱壳的程序编程的语言了,可以用PEID或者fastscanner查看,如果在这里看不到也可以在OD载入以后通过里面的字符串判断了。例如VB的程序会出现MSVB----/VC的会出现MSVC---等等。这些都是程序运行所需要的windows链接文件。
做完这些预备工作接下来当然是用OD载入文件。文件载入后在反汇编窗口CTRL+G搜索VirtualProtect(注意V跟P要大写,至于为什么要搜索这个别问我)。一般来说搜索的结果会出现以下的类似:
7C801AE3 E8 75FFFFFF call kernel32VirtualProtectEx
我们在这里下F2断点。然后F9运行到我们下的这个断点。接下来我们就要注意观察堆栈窗口了。一般来说当我们F9运行到我们上面下的断点的时候在堆栈窗口会出现以下类似:
0012F66C 00401000 |Address = TradeCen00401000
0012F670 000280D1 |Size = 280D1 (164049)
0012F674 00000004 |NewProtect = PAGE_READWRITE
0012F678 0012FF98 \pOldProtect = 0012FF98
我们要注意观察的就是在接下来我们F9运行的时候,ADDRESS和NEWPROTECT这两行的变化。按F9-速度别太快,直到NewProtect项变为PAGE_READONLY,这时候程序就释放完毕了。
0012F66C 0042A000 |Address = TradeCen0042A000
0012F670 000069DE |Size = 69DE (27102)
0012F674 00000002 |NewProtect = PAGE_READONLY
0012F678 0012FF98 \pOldProtect = 0012FF98
现在可以取消刚才我们下的断点了。接下来就是找OEP了。找OEP的时候我个人的一个经验就是OEP一般就在接近上面的ADDRESS地址的附近。例如上面的地址是0042A000,我一般就在这个基础上减到420000搜索程序的特征段,当然我们也可以直接跳到401000开始搜索。虽然我们搜索的范围比较大,但是因为我们搜索的是命令序列,所以工作量还不是很大。
CTRL+G--上面的地址,然后CTRL+S 查找命令序列。命令序列的内容就是我们用查到的编程语言的特征段。我们可以在特征段里面选择两三句固定不变的命令查找。例如VC++60的特征段是:
0046C07B U> 55 push ebp
0046C07C 8BEC mov ebp,esp
0046C07E 6A FF push -1
0046C080 68 18064C00 push UltraSna004C0618
0046C085 68 F8364700 push UltraSna004736F8
0046C08A 64:A1 00000000 mov eax,dword ptr fs:[0]
0046C090 50 push eax
0046C091 64:8925 00000000 mov dword ptr fs:[0],esp
0046C098 83EC 58 sub esp,58
0046C09B 53 push ebx
0046C09C 56 push esi
0046C09D 57 push edi
我们可以只搜索前三条命令。找到符合前三条命令的,我们在对照接下来的命令。只要命令相符那这个地址八九不离十就是OEP了。如果在ADDRESS地址附近找不到OEP,那就只好用笨办法,从401000开始找吧。
找到OEP地址后,我们在OEP处点鼠标右键《此处为新EIP》。接下来就可以dump啦。通常选择OD的dump插件脱壳要好点,用loadpe脱壳后要么程序不运行要么干脆没脱。用OD的dump插件脱壳的时候,脱壳窗口下面的(重建输入表)项前面的勾一定要去掉。
如果使用软件脱壳的话,当然可以,但是不一定能够脱壳彻底,强烈建议手工脱壳:
从我知道的情况来看,对Asprotect加壳的程序大致可以分为三类:(这种分类方法不具有权威性,只是我自己为了区别而已)
1、这类程序只检测SICE,SIWVID,SIWDEBUG,内存中可以得到完整的import table。一次跟踪可完成脱壳。
2、这类程序检测SICE,SIWVID,SIWDEBUG和BCHK,内存中也可以得到完整的import table。一次跟踪也可完成脱壳。
3、这类程序同 2 ,只是内存中无法得到完整的import table。因此需要其他手段来辅助得到import table。可能需要几次跟踪完成脱壳。
以上三类程序脱壳方式基本相同。因此我把跟踪过程中几个关键的特征说明一下。
分析
①寻找合适的中断进入加壳程序。(我称为找进入点)
(注:在跟踪之前,最好用ICEPatch修补你的SoftICE,否则你就要手动跳过防跟踪代码了)
对于 1 类程序,一般可以用以下方式进入:
Ctrl-D中断,进入SoftICE。下指令
bpx CreateFileA do "p ret"
然后按F5返回Windows,运行加壳程序,中断在我们所设下的中断处。
以后的跟踪可以直接继续,看见不远处有 ret 语句还可以按 F12 键快速返回到上一层调用中。
对于 2 、3 两类程序,一般可以用以下方式进入( *** 作方法同上,只是设下的断点不同)。这次我们设断点
bpint 3
以后的跟踪与上有些不同,在《找Entry Point的又一方法 -----针对Asprotect v10加壳的程序》一文中我已有说明,这里简要说明一下。
中断后一般你可以看到类似如下的屏幕:
015F:004BF23C CC INT 3 <--你中断在此
015F:004BF23D EB02 JMP 004BF241
015F:004BF23F E9025DEB02 JMP 03374F46
015F:004BF244 E9FF33C05A JMP 5B0C2648
015F:004BF249 59 POP ECX
015F:004BF24A 59 POP ECX
015F:004BF24B 648910 MOV FS:[EAX],EDX
015F:004BF24E EB0A JMP 004BF25A
015F:004BF250 E91305FFFF JMP 004AF768 <--注意这个跳转语句,int 3过后就要到这里继续了。
015F:004BF255 E8AA07FFFF CALL 004AFA04
015F:004BF25A 8A1518514C00 MOV DL,[004C5118]
015F:004BF260 8B45F8 MOV EAX,[EBP-08]
把光标移到第五个Jmp语句以后,按F7键。好,以后的跟踪和上面的方法相同。
②检测CRC的地方
在按了几个 F12后,一般就到了检测CRC的代码地方,这里我们不需要做什么,只是让大家明白,如果你改到了程序某处,在这里就要关心一下了。
015F:004C6B74 EBF0 JMP 004C6B66
015F:004C6B76 8B45EC MOV EAX,[EBP-14] <--注意此处
015F:004C6B79 3B45F0 CMP EAX,[EBP-10] <--注意此处
015F:004C6B7C 7443 JZ 004C6BC1 <--如果比较的结果相同,就跳转了,否则就到下面显示File corrupted! 的框框了
015F:004C6B7E 8A155CC94C00 MOV DL,[004CC95C]
015F:004C6B84 8B45F8 MOV EAX,[EBP-08]
015F:004C6B87 E848E4FFFF CALL 004C4FD4
015F:004C6B8C 8945F4 MOV [EBP-0C],EAX
015F:004C6B8F 837DF400 CMP DWORD PTR [EBP-0C],00
015F:004C6B93 742C JZ 004C6BC1
015F:004C6B95 8D85E4FEFFFF LEA EAX,[EBP-011C]
015F:004C6B9B 8D95E9FEFFFF LEA EDX,[EBP-0117]
大家注意其中三句的特征,以后跟踪时就知道这里是比较CRC的地方就行了。对于做inline patch的朋友就要记住了。
③获得 import table 和 Entry Point
在按过几下 F12 键后,就会来到类似如下代码的地方,这里我以ARPREXE来做例子,来一段段的分析一下,许多Asprotect加壳的程序都有这样一段,熟悉了特征以后,再对Asprotect脱壳你也可以很轻松了。
015F:004C6EAB E828FAFFFF CALL 004C68D8
015F:004C6EB0 33C0 XOR EAX,EAX <--你来到此处,一般 XOR EAX,EAX 是特征
015F:004C6EB2 5A POP EDX
015F:004C6EB3 59 POP ECX
015F:004C6EB4 59 POP ECX
015F:004C6EB5 648910 MOV FS:[EAX],EDX
015F:004C6EB8 EB11 JMP 004C6ECB <--跳到下一段
015F:004C6EBA E9E900FFFF JMP 004B6FA8
015F:004C6EBF 33C0 XOR EAX,EAX
015F:004C6EC1 E89EEFFFFF CALL 004C5E64
015F:004C6EC6 E87903FFFF CALL 004B7244
以后我们重点关注几个Call调用,以后再跟踪这类Asprotect加壳的程序就有经验了。
015F:004C6ECB 33C0 XOR EAX,EAX
015F:004C6ECD 55 PUSH EBP
015F:004C6ECE 68086F4C00 PUSH 004C6F08
015F:004C6ED3 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6ED6 648920 MOV FS:[EAX],ESP
015F:004C6ED9 8B4508 MOV EAX,[EBP+08]
015F:004C6EDC 8B00 MOV EAX,[EAX]
015F:004C6EDE 50 PUSH EAX
015F:004C6EDF B804464C00 MOV EAX,004C4604
015F:004C6EE4 50 PUSH EAX
015F:004C6EE5 6A00 PUSH 00
015F:004C6EE7 8B4508 MOV EAX,[EBP+08]
015F:004C6EEA 8D4824 LEA ECX,[EAX+24]
015F:004C6EED 8B4508 MOV EAX,[EBP+08]
015F:004C6EF0 8D500C LEA EDX,[EAX+0C]
015F:004C6EF3 8B4508 MOV EAX,[EBP+08]
015F:004C6EF6 8B4008 MOV EAX,[EAX+08]
015F:004C6EF9 E842F0FFFF CALL 004C5F40 <--注意这个Call调用
015F:004C6EFE 33C0 XOR EAX,EAX
015F:004C6F00 5A POP EDX
015F:004C6F01 59 POP ECX
015F:004C6F02 59 POP ECX
015F:004C6F03 648910 MOV FS:[EAX],EDX
015F:004C6F06 EB13 JMP 004C6F1B <--跳到下一段
015F:004C6F08 E99B00FFFF JMP 004B6FA8
015F:004C6F0D 66B80B00 MOV AX,000B
015F:004C6F11 E84EEFFFFF CALL 004C5E64
015F:004C6F16 E82903FFFF CALL 004B7244
在以上要注意的Call调用处我们可以停下来,下指令
d 401000 (说明: 401000由来为 <Image Base>+<First Section RVA> )
我们可以看到在没有执行这个Call调用之前,数据窗口显示的为 。这说明这段代码还没有加载到内存中。如果按 F10键执行这个调用过后,数据窗口就会显示各种十六进制数据。这说明这个Call调用的基本功能为加载数据。
(按上段)
015F:004C6F1B 33C0 XOR EAX,EAX
015F:004C6F1D 55 PUSH EBP
015F:004C6F1E 68716F4C00 PUSH 004C6F71
015F:004C6F23 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6F26 648920 MOV FS:[EAX],ESP
015F:004C6F29 8B4508 MOV EAX,[EBP+08]
015F:004C6F2C 8B00 MOV EAX,[EAX]
015F:004C6F2E 50 PUSH EAX
015F:004C6F2F B8485E4C00 MOV EAX,004C5E48
015F:004C6F34 50 PUSH EAX
015F:004C6F35 B85C5E4C00 MOV EAX,004C5E5C
015F:004C6F3A 50 PUSH EAX
015F:004C6F3B 6A00 PUSH 00
015F:004C6F3D B8645E4C00 MOV EAX,004C5E64
015F:004C6F42 50 PUSH EAX
015F:004C6F43 B8A4894B00 MOV EAX,004B89A4
015F:004C6F48 50 PUSH EAX
015F:004C6F49 8B4508 MOV EAX,[EBP+08]
015F:004C6F4C 8B4020 MOV EAX,[EAX+20]
015F:004C6F4F 50 PUSH EAX
015F:004C6F50 8B4508 MOV EAX,[EBP+08]
015F:004C6F53 8D4824 LEA ECX,[EAX+24]
015F:004C6F56 8B4508 MOV EAX,[EBP+08]
015F:004C6F59 8B500C MOV EDX,[EAX+0C]
015F:004C6F5C 8B4508 MOV EAX,[EBP+08]
015F:004C6F5F 8B4008 MOV EAX,[EAX+08]
015F:004C6F62 E81DF1FFFF CALL 004C6084 <--注意这个Call调用
015F:004C6F67 33C0 XOR EAX,EAX
015F:004C6F69 5A POP EDX
015F:004C6F6A 59 POP ECX
015F:004C6F6B 59 POP ECX
015F:004C6F6C 648910 MOV FS:[EAX],EDX
015F:004C6F6F EB13 JMP 004C6F84 <--跳到下一段
015F:004C6F71 E93200FFFF JMP 004B6FA8
015F:004C6F76 66B80C00 MOV AX,000C
015F:004C6F7A E8E5EEFFFF CALL 004C5E64
015F:004C6F7F E8C002FFFF CALL 004B7244
我们再来关注一下上面这个要注意的Call调用。如果你用 F10 键带过这个Call调用。会发现数据窗口的内容改变了。好我们再来看看 idata Section所在位置的情况,下指令
d 418000 (注:ARPREXE的Image Base为 400000,idata Section 的 RVA 为 18000)
可以看到数据窗口显示的全是 00,向下翻页,仍然是 00,这说明这个Call调用的功能可能是解压还原代码,并且初始化 idata Section。
(接上段)
015F:004C6F84 B84B894B00 MOV EAX,004B894B
015F:004C6F89 40 INC EAX
015F:004C6F8A 890530DA4C00 MOV [004CDA30],EAX
015F:004C6F90 B82B894B00 MOV EAX,004B892B
015F:004C6F95 890534DA4C00 MOV [004CDA34],EAX
015F:004C6F9B FF0534DA4C00 INC DWORD PTR [004CDA34]
015F:004C6FA1 33C0 XOR EAX,EAX
015F:004C6FA3 55 PUSH EBP
015F:004C6FA4 6805704C00 PUSH 004C7005
015F:004C6FA9 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6FAC 648920 MOV FS:[EAX],ESP
015F:004C6FAF B8485E4C00 MOV EAX,004C5E48
015F:004C6FB4 50 PUSH EAX
015F:004C6FB5 B8AC694B00 MOV EAX,004B69AC
015F:004C6FBA 50 PUSH EAX
015F:004C6FBB A130DA4C00 MOV EAX,[004CDA30]
015F:004C6FC0 50 PUSH EAX
015F:004C6FC1 A134DA4C00 MOV EAX,[004CDA34]
015F:004C6FC6 50 PUSH EAX
015F:004C6FC7 B8645E4C00 MOV EAX,004C5E64
015F:004C6FCC 50 PUSH EAX
015F:004C6FCD B894954B00 MOV EAX,004B9594
015F:004C6FD2 50 PUSH EAX
015F:004C6FD3 B874954B00 MOV EAX,004B9574
015F:004C6FD8 50 PUSH EAX
015F:004C6FD9 B834904B00 MOV EAX,004B9034
015F:004C6FDE 50 PUSH EAX
015F:004C6FDF 8B4508 MOV EAX,[EBP+08]
015F:004C6FE2 8B4020 MOV EAX,[EAX+20]
015F:004C6FE5 50 PUSH EAX
015F:004C6FE6 B9E0944B00 MOV ECX,004B94E0
015F:004C6FEB 8B4508 MOV EAX,[EBP+08]
015F:004C6FEE 8B5014 MOV EDX,[EAX+14]
015F:004C6FF1 8B4508 MOV EAX,[EBP+08]
015F:004C6FF4 8B00 MOV EAX,[EAX]
015F:004C6FF6 E8A5F5FFFF CALL 004C65A0 <--注意这个Call调用
015F:004C6FFB 33C0 XOR EAX,EAX <--这里一般就是Dump import table的地方
015F:004C6FFD 5A POP EDX
015F:004C6FFE 59 POP ECX
015F:004C6FFF 59 POP ECX
015F:004C7000 648910 MOV FS:[EAX],EDX
015F:004C7003 EB13 JMP 004C7018 <--跳到下一段
015F:004C7005 E99EFFFEFF JMP 004B6FA8
015F:004C700A 66B80D00 MOV AX,000D
015F:004C700E E851EEFFFF CALL 004C5E64
015F:004C7013 E82C02FFFF CALL 004B7244
我们来看看上面这个要注意的Call调用有什么作用。如果你用 F10 键带过这个Call调用,再看看数据窗口的变化,
我们向下翻页看看,这次不再是 00,变成各种数据。这说明这个Call调用的功能可能是还原 idata Section,因此在该调用后的 XOR EAX,EAX就是我们Dump出 import table的地方。对于前面划分出的三类程序中前两类,都可以在此处看到完整的 import table,是Dump出 import table的时候了,可以下指令
/dump <Image Base + idata Section RVA> <idata Section Size> <FileName> (这是ICEDump 161的指令用法)
而对于第三类程序则要用其他方法。(补充说明:对于第三类程序的 import table重建问题由于我也没有找到一种统一的方法。只能不同情况不同对待。因此以后单独写文说明。)
如果你喜欢用 bpm 跟踪 idata Section的变化来做进入点。那么一般在按几个 F12键后,就在处了。
(接上段)
015F:004C7018 33C0 XOR EAX,EAX
015F:004C701A 55 PUSH EBP
015F:004C701B 6838704C00 PUSH 004C7038
015F:004C7020 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C7023 648920 MOV FS:[EAX],ESP
015F:004C7026 8B4508 MOV EAX,[EBP+08]
015F:004C7029 E8D6FCFFFF CALL 004C6D04 <--注意这个Call调用
015F:004C702E 33C0 XOR EAX,EAX
015F:004C7030 5A POP EDX
015F:004C7032 59 POP ECX
015F:004C7033 648910 MOV FS:[EAX],EDX
015F:004C7036 EB13 JMP 004C704B <--跳到下一段
015F:004C7038 E96BFFFEFF JMP 004B6FA8
015F:004C703D 66B81100 MOV AX,0011
015F:004C7041 E81EEEFFFF CALL 004C5E64
015F:004C7046 E8F901FFFF CALL 004B7244
如果我们用 F10 键带过这个Call调用,会发现数据窗口的内容又有所变化。不过这次我们看到的数据都比较大。如果你进入此调用跟踪会发现它的作用就是获取idata Section中的各个函数的指针放入此处,如果你对可执行文件的加载机制有所了解的话,那么就知道这是加壳程序在做Windows的工作,把各个Fircc转换成真正函数入口指针。因此过了此处,你再就无法获得"干净"的import table了。
(接上段)
015F:004C704B 33C0 XOR EAX,EAX
015F:004C704D 55 PUSH EBP
015F:004C704E 6884704C00 PUSH 004C7084
015F:004C7053 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C7056 648920 MOV FS:[EAX],ESP
015F:004C7059 B8645E4C00 MOV EAX,004C5E64
015F:004C705E 50 PUSH EAX
015F:004C705F 8B4508 MOV EAX,[EBP+08]
015F:004C7062 8B4810 MOV ECX,[EAX+10]
015F:004C7065 8B4508 MOV EAX,[EBP+08]
015F:004C7068 8B5004 MOV EDX,[EAX+04]
015F:004C706B 8B4508 MOV EAX,[EBP+08]
015F:004C706E 8B00 MOV EAX,[EAX]
015F:004C7070 E833F6FFFF CALL 004C66A8 <---注意此Call调用
015F:004C7075 A22CDA4C00 MOV [004CDA2C],AL
015F:004C707A 33C0 XOR EAX,EAX
015F:004C707D 59 POP ECX
015F:004C707E 59 POP ECX
015F:004C707F 648910 MOV FS:[EAX],EDX
015F:004C7082 EB13 JMP 004C7097 <--跳到下一段
015F:004C7084 E91FFFFEFF JMP 004B6FA8
015F:004C7089 66B80E00 MOV AX,000E
015F:004C708D E8D2EDFFFF CALL 004C5E64
015F:004C7092 E8AD01FFFF CALL 004B7244
对于此Call调用是什么作用,我现在还说不出来。如果你用 F10 键带来,一点事没有。但是如果你是一个好奇心太强的人,按 F8 键进入看个究竟的话,那么我恭喜你,你进入了 Asprotect 的圈套。也许你会在带过某个Call调用时程序运行了。因此你一定以为其中有 Entry Point ,于是重新来过,又进入那个Call调用看看,如此反复,也许你会某一层中发现 Entry Point,果真如此,那么我十分钦佩你的精神。我在跟踪到第四层时依然没有找到,就放弃了。至今我还没有弄明白这种圈套是怎么实现的。不过Asprotect作者一定很高兴他写的代码一行也没有浪费。
(接上段)
015F:004C7097 8B4508 MOV EAX,[EBP+08]
015F:004C709A 8D4818 LEA ECX,[EAX+18]
015F:004C709D 8B4508 MOV EAX,[EBP+08]
015F:004C70A0 8B10 MOV EDX,[EAX]
015F:004C70A2 8B4508 MOV EAX,[EBP+08]
015F:004C70A5 8B401C MOV EAX,[EAX+1C]
015F:004C70A8 E887F6FFFF CALL 004C6734 <---注意此Call调用
015F:004C70AD 5F POP EDI
015F:004C70AE 5E POP ESI
015F:004C70AF 5B POP EBX
015F:004C70B0 5D POP EBP
015F:004C70B1 C20400 RET 0004
如果你是个懒人,直接到此。那么我说你真有福气。这个Call调用一定要按 F8 键进入。其中你可以找到 Entry Point。
④获取整个内存映象
在进入Call调用后,对于前两类程序和后一类程序的情况有所不同
(注:这里以跟踪BrickShooter时截取的屏幕和跟踪ARPR时截取的屏幕做一比较)
跟踪BrickShooter的情况(代表前两类程序,以下简称 一)
015F:0056EB4A 8BC0 MOV EAX,EAX
015F:0056EB4C 55 PUSH EBP
015F:0056EB4D 8BEC MOV EBP,ESP
015F:0056EB4F 83C4F8 ADD ESP,-08
015F:0056EB52 53 PUSH EBX
015F:0056EB53 8BDA MOV EBX,EDX
015F:0056EB55 8945FC MOV [EBP-04],EAX
015F:0056EB58 8B01 MOV EAX,[ECX]
015F:0056EB5A 8945F8 MOV [EBP-08],EAX
015F:0056EB5D 6A04 PUSH 04
015F:0056EB5F B944565700 MOV ECX,00575644
015F:0056EB64 8D45F8 LEA EAX,[EBP-08]
015F:0056EB67 BA04000000 MOV EDX,00000004
015F:0056EB6C E803E7FFFF CALL 0056D274 <--Call调用
015F:0056EB71 015DF8 ADD [EBP-08],EBX
015F:0056EB74 EB01 JMP 0056EB77 <--JMP跳转语句
跟踪ARPR的情况(代表后一类程序,以下简称 二)
015F:004C6732 8BC0 MOV EAX,EAX
015F:004C6734 55 PUSH EBP
015F:004C6735 8BEC MOV EBP,ESP
015F:004C6737 83C4F0 ADD ESP,-10
015F:004C673A 53 PUSH EBX
015F:004C673B 56 PUSH ESI
015F:004C673C 57 PUSH EDI
015F:004C673D 894DF0 MOV [EBP-10],ECX
015F:004C6740 8955F4 MOV [EBP-0C],EDX
015F:004C6743 8945FC MOV [EBP-04],EAX
015F:004C6746 33C0 XOR EAX,EAX
015F:004C6748 55 PUSH EBP
015F:004C6749 6871674C00 PUSH 004C6771
015F:004C674E 64FF30 PUSH DWORD PTR FS:[EAX]
015F:004C6751 648920 MOV FS:[EAX],ESP
015F:004C6754 33C9 XOR ECX,ECX
015F:004C6756 B201 MOV DL,01
015F:004C6758 B8088A4B00 MOV EAX,004B8A08
015F:004C675D E8AE3CFFFF CALL 004BA410 <--第一个Call调用
015F:004C6762 E86D0AFFFF CALL 004B71D4 <--第二个Call调用
015F:004C6767 33C0 XOR EAX,EAX
015F:004C6769 5A POP EDX
015F:004C676A 59 POP ECX
015F:004C676B 59 POP ECX
015F:004C676C 648910 MOV FS:[EAX],EDX
015F:004C676F EB0A JMP 004C677B <--JMP跳转语句
对比我们可以发现,一 中只有一个Call调用就跟着一个JMP跳转语句。二 中有两个Call调用才跟着一个JMP跳转语句。
对于 一 在JMP跳转过后,就可以很快找到Entry Point。(当然这以后要按 F8 键跟踪为妙) 对于 二 则不同,请记住这个特征,如果有两个连续的Call调用,在跟踪时,在第二个Call调用处按 F8进入看看,如果你发现类似以下代码
015F:004B71D2 8BC0 MOV EAX,EAX
015F:004B71D4 5A POP EDX
015F:004B71D5 54 PUSH ESP
015F:004B71D6 55 PUSH EBP
015F:004B71D7 57 PUSH EDI
015F:004B71D8 56 PUSH ESI
015F:004B71D9 53 PUSH EBX
015F:004B71DA 50 PUSH EAX
015F:004B71DB 52 PUSH EDX
015F:004B71DC 54 PUSH ESP
015F:004B71DD 6A07 PUSH 07
015F:004B71DF 6A01 PUSH 01
015F:004B71E1 68CEFAED0E PUSH 0EEDFACE
015F:004B71E6 52 PUSH EDX
015F:004B71E7 E914E3FFFF JMP KERNEL32!RaiseException
015F:004B71EC C3 RET
那么这
以上就是关于什么是木马的加壳和脱壳全部的内容,包括:什么是木马的加壳和脱壳、我用PEID查了一个软件的壳,如何脱壳、VC编写的EXE程序怎么脱壳,有什么好的工具等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)