吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 35157|回复: 218
收起左侧

[.NET逆向] .NET平台原理之调试分析【一】 By:凉游浅笔深画眉

    [复制链接]
凉游浅笔深画眉 发表于 2015-7-14 22:22
本帖最后由 凉游浅笔深画眉 于 2015-7-16 01:03 编辑

.NET运行原理之调试分析【一】 By:凉游浅笔深画眉


我在.NET平台诞生了12年后才接触到它,而国内.NET平台的逆向技术兴起于10年前。
我是不幸的,不幸的是起步比前辈们晚了10年左右,十分后悔当初把最好的学习时间奉献给了游戏。最后发现,玩再多游戏也并没什么卵用。
我也是幸运的,幸运的是前人已留下了太多对.NET平台的探索脚印。我只需要跟随着他们的脚步快速前进,而不会绕很多弯路和四处碰壁。
最后感谢那些写过文章供后人学习的前辈们,虽然很多文章都是七八年前的,但受用至今。


此文既不是破解,也不讲脱壳,只是逆向角度分析.NET程序执行原理。仅希望抛砖引玉,待各位大牛们帮我完善接下来的分析过程。


-----------------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------------------------------

调试环境:Windows XP SP3  注:调试环境请使用Win7之前的系统,Win7之后的系统有所变化。
目标对象:一个基于.NET Framework 2.0框架编写的EXE文件
所需工具:IDAOllyDbgWinDBG,CFFExplorer,Depends



1.首先我们用CFF打开一个.NET程序,找到可选头,这里有个AddressOfEntryPont域,它的值是000030CE,这是一个RVA(相对虚拟地址)。这个AddressOfEntryPont标志着加载器要运行加载PE文件时执行的第一个指令的地址。
1.png

2.我们再找到ImageBase这个域,它的值是00400000ImageBse标志着程序载入内存的理想初始地址(基地址),这里也是为什么采用XP系统来调试.NET程序的原因,有兴趣的朋友可以研究下。
2.png


3.我们可以看到AddressOfEntryPont位于.text区段上,我们来计算一下这个000030CE在文件中的物理地址是多少:

物理地址=RVA-Visual Address+Raw Address
3.png


由图可知 Visual Address=2000Raw Address = 200
所以: 物理地址=000030CE-2000+200=12CE


4.我们切换到十六进制编辑界面,找到12CE位置,下图可以看到这几个字符 FF 25 00 20 40 00
4.png


5.FF 25 00 20 40 00是什么意思,我们打开OD来看看。在OD中,我们按Ctrl+B,然后输入FF 25可以看到,FF25代表的是汇编指令中的JMP,也就是无条件跳转。后面的00 20 40 00,其实是一个内存地址00402000,所以整句代码连起来就是 jmp 00402000 (意思就是程序加载后直接跳转到00402000这里来执行)
5.jpg


6.为了验证我们刚才所分析的是否正确,我们现在需要借助WinDBG来进行分析。首先将目标程序载入WinDBG,程序会自动断下来。我们在Command窗口中可以看到如下信息,程序主模块从00400000处开始加载,也就是我们刚才在CFF中看到的ImageBase(基地址)
6.png


7.配合我们刚才的偏移地址000030CE,我们在下面的命令栏中输入指令“u 00400000+000030CE”,这条指令的意思是从地址00400000+000030CE处反编译8条机器码。
7.png


8.回车之后看到了一个让我们心动的结果,004030CE处的前6个字节反编译对应的汇编代码为 Jmp 00402000,正好验证了我们前面的分析。
8.png


9.证实了前面的分析完全正确,接下来我们我们去探索一下00402000究竟什么。下一步我们在命令栏中输入dps WindowsFormsApplication3+0x2000 也可以输入dps 00402000
9.png


10.回车之后看到如下信息mscoree!CorExeMain,可以看到00402000这个地址代表的是mscoree.dll这个模块的_CorExeMain函数,位置在79004ddb处。
10.png


11.如果WinDBG看上去并不是那么直观,那我们继续借助OD来分析吧。我们用OD中载入程序,Ctrl+G转到我们在WinDBG中看到的地址79004ddb处,然后F2在这个地址下断点。
11.png


12.重新载入并运行当前程序,程序执行到我们刚才下断点的地方就会自动断下来。这时候留心观察寄存器里EIP的值(为什么要观察EIP,因为EIP标志着程序将执行的下一句指令),我们可以很清楚地看到,程序下一句将要执行的是mscoree.dll这个模块中的_CorExeMain函数。
12.png


13.既然程序的加载需要调用到mscoree.dll中的_CorExeMain函数,那么我们很容易猜想到,_CorExeMain函数会被保存到程序的导入表中,程序运行的时候进行调用。我们在CFF中切换到到程序IAT(导入表),可以很清晰地看到,.NET程序导入了mscoree.dll_CorExeMain函数,这也是.NET程序唯一的导入函数。
13.png


14.当然我们也可以借助于别的分析工具来分析当前程序依赖的DLL

我们把目标程序用Depends载入,可以很清晰地看到该程序仅仅只依赖mscoree.dll中的_CorExeMain函数。
14.png

15.综上所述,PE Loader加载了.NET镜像文件之后,首先会执行一句JMP mscoree. _CorExeMain(这里特别指明是mscoree中的_CorExeMain是有原因的,今后有时间再讲述为什么特别指明mscoree这个模块),借助微软的mscoree.dll来启动我们的.NET托管运行环境。

_CorExeMain这个函数究竟做了哪些工作,如何一步一步启动托管运行环境的,等有时间继续写吧。



很多人问我SE+DNG壳脱壳时脱壳机报错如何修复。

以上文字如果你完全看懂了,足够用来解决SE壳+DNGuard壳脱壳时候报错,需要修复入口点的问题。




点评

原来如此,懂鸟。。  发表于 2015-7-15 12:50
画眉大牛、你这个是只针对.net的程序还是其他的也可以  发表于 2015-7-15 12:31

免费评分

参与人数 23热心值 +23 收起 理由
speedboy + 1 谢谢@Thanks!
黑的思想 + 1 鼓励转贴优秀软件安全工具和文档!
悟空不悟 + 1 热心回复!
iNIC + 1 热心回复!
jvict + 1 谢谢@Thanks!
zs851 + 1 热心回复!
Jacve + 1 我很赞同!
z1z2z3as + 1 我很赞同!
Emil + 1 期待楼主继续更新,很好!~
733777 + 1 鼓励转贴优秀软件安全工具和文档!
katkat + 1 我很赞同!
wb9353 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
无痕软件 + 1 截图工具好风骚
myqqq + 1 热心回复!
pnccm + 1 热心回复!
蚯蚓翔龙 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
lies2014 + 1 鼓励转贴优秀软件安全工具和文档!
只不过去是了 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
caleb110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
梦游枪手 + 1 热心回复!
逍遥枷锁 + 1 谢谢@Thanks!
小小小青年 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
L4Nce + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kko0008 发表于 2015-7-15 08:46
学习学习
Hmily 发表于 2015-7-14 22:39
这图接的好漂亮啊,等下细看。


细看了一下,终于明白.net程序运行时候进入微软库的过程,原来那些.net壳外层加壳都只是把进入_CorExeMain的地方给处理了?


这个0000315E是手误吧,应该是000030CE吧:
3.我们可以看到AddressOfEntryPont位于.text区段上,我们来计算一下这个0000315E在文件中的物理地址是多少:

期待这些列教程,完善后版主可加精华,我也跟着学.net。@凉游浅笔深画眉
3yu3 发表于 2015-7-14 22:33
44018723 发表于 2015-7-14 22:33
你想表达啥意思i??
zylyy12358 发表于 2015-7-14 22:37
楼主,你写的什么看不懂
凡凡之呗 发表于 2015-7-14 22:38
这个我认为不需要隐藏的
XKQ 发表于 2015-7-14 22:50
大牛教程一定要看
zisediao325 发表于 2015-7-15 00:19
学习下,和大家一起进步
头像被屏蔽
傾城 发表于 2015-7-15 03:35
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽
hsgzs 发表于 2015-7-15 07:08 来自手机
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 14:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表