计算机系统应用教程网站

网站首页 > 技术文章 正文

「.NET逆向」使用x64dbg脱非托管壳(TMD,SE,EVB)

btikc 2024-08-30 13:17:18 技术文章 15 ℃ 0 评论

以下转自吾爱破解wwh1004大神:

文章中用到的工具:

AssemblyRebuilder by wwh1004:https://github.com/wwh1004/AssemblyRebuilder

ExtremeDumper by wwh1004:https://github.com/wwh1004/ExtremeDumper

Universal Fixer by CodeCracker:https://www93.zippyshare.com/v/wyCquy7N/file.html

这个文件被包含在上面这个压缩包里(路径ToolsArchive_Part1.zip\PC_CONTENTS\MY_NET_TOOLS\Unpackers\Universal_Fixer.exe)。压缩包里有CodeCracker大神无偿分享的各种工具,.NET逆向必备神器级工具包

x64dbg:https://github.com/x64dbg/x64dbg/releases

注意装上插件SharpOD并按SharpOD的推荐设置设置好

dnSpy by 0xd4d:https://github.com/0xd4d/dnSpy/releases

下载附件 保存到相册

2018-7-8 17:16 上传

先用ConfuserEx加一层壳,只是演示如何脱非托管壳,所以ConfuserEx只设置加anti dump

然后开始演示Themida:

Themida保护全开

配置好x64dbg

调试加壳后文件,添加dll断点,clr.dll(这一步可以看视频是怎么添加的),等断下来后,转到符号窗口

点击clr.dll(右键加载符号文件,我的已经下载过了,没下载过的可能要等10分钟+),搜索SystemDomain::ExecuteMainMethod,在这里下断点

成功断下

接下来没x64dbg什么事情了,是不是非常简单,完全只需要用工具

把ExtremeDumper的转储方式设置为MegaDumper(用MegaDumper也可以,只不过觉得那个界面太难看了,而且还很卡...)

右键,查看模块,Dump主模块

使用Universal Fixer修复,一般把我选中的这些勾上,别的都不选就可以了

运行正常,反编译也正常:

原理:

在SystemDomain::ExecuteMainMethod处下断点,是一个非常折中的方案,不会过于深入clr内部,也不会随随便便被hook住

运行到这里的时候主程序集已经被这些非托管壳还原到对应位置

为什么这说,请看下图

这是主线程的调用堆栈(我在主线程里运行了消息泵,所以暂停住了)

可以看到底端是不知名的地址,应该是TMD之类的壳生成的

再向上看,有个clr._CorExeMain和clr._CorExeMainInternal,clr._CorExeMain是导出函数

有被hook的风险,所以在这里下断点不适合,clr._CorExeMainInternal其实也可以,但是感觉不太好(没测试过)

然后是

······

clr.RunMain

clr.Assembly::ExecuteMainMethod

clr.SystemDomain::ExecuteMainMethod

clr.ExecuteEXE

······

这4个应该都可以,都是比较安全的,几乎不可能被hook住,直接dump下这时的主模块就没啥问题了

不过我只测试了clr.SystemDomain::ExecuteMainMethod,测试了3个壳(2个强壳,1个打包器),都是可以的

Shielden:

Dump前操作一样,只不过Dump之后要用CFF Explorer手动清理导入表。或者也可以使用AssemblyRebuilder,重建程序集,程序体积完全恢复正常。


以visual studio 2017为参照,讲解如何像用vs调试.NET程序集一样使用x64dbg调试本机代码

x64dbg下载地址:https://github.com/x64dbg/x64dbg/releases


x64dbg入门操作:

1.设置符号文件保存路径:

Q:符号文件是什么?A:*.pdb文件,还不知道就百度吧。。。Q:为什么要设置?

A:符号文件通常很大,不然x64dbg默认保存到自身目录下,导致升级x64dbg,迁移x64dbg到其它位置极为不便

这样就设置好了

2.使用符号文件:

很多情况下,x64dbg不会自动加载符号文件(不知道为什么,可能是防止调试时太卡吧,vs加载过多符号文件就会卡顿)

这时候就需要我们手动加载了

x64dbg没有加载选项,可以点"下载此模块的符号信息"(要加载所有符号文件可以点"下载所有模块的符号信息")

如果符号文件缓存文件夹中已经有了这个符号文件,x64dbg直接从本地加载,否则从符号文件服务器上下载并加载

右边显示了dll自身导出的函数和符号文件导出的函数,左键单击这里的函数,按下F2,是可以下断点的

3.安装插件:

对于.NET逆向,一般只要装一个反调试器检测的插件就行了

我在用@xjun 的SharpOD:https://www.52pojie.cn/thread-628837-1-1.html

不是打广告,是这个插件真的很好用,调试体验极佳(用作者的推荐设置)

不扯了,说下怎么安装

把压缩包里面的*.dp*文件拖入对应的文件夹(其实这些*.dp*也是*.dll文件,只不过改了个后缀名让x64dbg知道这里有个插件)

比如装32位x64dbg的插件,就将*.dp32拖入x64dbg\x32\plugins

x64dbg实际操作:

1.查看函数调用时的参数:

首先你需要明白什么是调用约定,这些需要百度

现在我使用32位x64dbg调试一个unpackme,在mscorwks.dll的AssemblyNative::LoadImage处下了断点,按下F9,x64dbg在此函数入口处断下了

在符号窗口可以看到这个函数的调用约定是fastcall

我们回到CPU,把调用约定改成fastcall

这里的1,2,3就是代表了第1,2,3个参数

我们刚才已经看到了,这个函数第一个参数是"Array<unsigned char> *",表示指向了一个字节数组,这里的"unsigned char"等同于C#/VB.NET中的"byte",而不是C#/VB.NET中的"char"

2.转储内存到文件:

我们在内存窗口中按下Ctrl+G,输入0312BBAC

成功跳转到了一个内存区域,储存了"Array<unsigned char>"

我们点一下4D或者M

再将右边滚动条滚到底部,按住Shift,在左键单机一下最后一个字节

右键,二进制编辑->保存到文件

这样,你就把一个.NET程序集人工Dump下来了

dnSpy打开看看,是个没啥用的程序集(这个仅仅是演示,AssemblyNative::LoadImage断点有时是很有用的)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表