TES286 发表于 2021-7-24 18:05

.NET删除验证与破解通讯协议

本帖最后由 TES286 于 2021-7-28 20:34 编辑

最近发现了一个程序, .net编写, 存在网络验证, 于是一时兴起, 想破解一下

0x01 查壳,脱壳



跑一边de4net



再次查壳



完美

0x02 反编译

拖入dnspy后



注意:要使用对应架构的程序版本调试(例如这个是x86的程序,就只能用x86的dnspy)

看到这里有一个版本验证,直接删掉





0x03 分析

由于程序可信任,则直接调试运行

当然,如果是个不可信任的程序,就不能这样随意,至少得在虚拟机中运行

一步步单步执行,过程就不放了,有兴趣可以找一个样品试试

分别是最大启动,使用启动,最大地址



授权码生成



(这授权码生成的也太草率了吧...)

所以我们的思路是将已使用启动数量设置为0

跟进



额, get;set;什么玩意,c#里还有这么高深的语句...

查下官方文档https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/get



(虽然我可能没有评价这文档的能力,但我个人认为上面那句描述简直不是人话)

结合这里的实际,肯定还有一个地方为其赋值,搜索usedsetup


发现都是在这个文件里,没有任何有价值信息

没办法,分析,找到ns0.FormSetup.method_0中存在使用



可以猜测图中红框函数(MySoft.smethod_9)为网络访问,先放哪,一会分析

另外还有个ns0.FormSetup.methob_5



直接改usedsetup为0(已使用启动数量)

此处算是成功



0x04 通讯协议

记得前面的method_0吗,这是一个网络请求函数



很明显,网络请求是在MySoft.smethod_9中

其中MySoft.softlocal.apiurl



smethod_9的代码,敏感部分已使用xxx代替

public static string smethod_9(string string_7, string string_8)
                {
                        string mycomputerhash = MySoft.mycomputerhash;
                        Config.debugprint("同步xxxPost请求 " + string_7);
                        NewWebClient newWebClient = new NewWebClient(10000);//初始化网络请求
                        newWebClient.Headers.Add("sn", mycomputerhash); //计算机哈希
                        newWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                        string text = "";
                        try
                        {
                              text = newWebClient.UploadString(string_7, "POST", string_8); //上传字符串, 详见https://docs.microsoft.com/zh-cn/dotnet/api/system.net.webclient.uploadstring#System_Net_WebClient_UploadString_System_String_System_String_System_String_
                              text = AESHelper.Decrypt(text); //顾名思义,解密函数
                        }
                        catch
                        {
                              Config.debugprint("同步xxxpost请求发生错误 " + string_7);
                        }
                        return text;
                }

这个函数告诉我们请求由HTTP完成,并且存在加密

而且,按照习惯,服务端加密和本地加密应该是一致的,所以找到解密函数后就可以双方解密(还有的应用就不是这样,当然也是极少数)

解密函数



其中AESHelper.key是6x57chhbkg9rsI2mua6PcGMZB4FLSJJt    AESHelper.iv是WW1RFPd9htGQ46Qb




可以得知这是由cbc加密,并且密文以base64传输,填充

所以我们直接把代码抠出来,结果:



当然,同文件的加密函数也不能忘掉



可以正常运行

那么,我们就可以把这里对接到外界自己的程序中,实现肆无忌惮的修改数据了

其他

文章中使用到的一些资源:

dnspy :https://down.52pojie.cn/Tools/NET/dnSpy.zip
de4dot :https://down.52pojie.cn/Tools/NET/de4dot.zip
exepeinfo :https://down.52pojie.cn/Tools/PEtools/ExeinfoPe.zip
微软的C#文档 :https://docs.microsoft.com/zh-cn/dotnet/

另外,一般不要因为程序的编写语言自己不会就望而却步,比如我,在之前看都没看过c#,但依旧完成了这个逆向过程

第一次玩破解,肯定有很多疏忽与漏洞,还请各位大佬指出,有好的想法,也欢迎提出

论坛不然放成品,就不放了

TES286 发表于 2021-7-26 16:23

yasenhacker 发表于 2021-7-26 11:25
你运气真好,程序用smart assembly 6.xx加密,如果用smart assembly 8.xx加密的话,de4dot也脱不了。你有没 ...

没有,论坛上也没找到什么挺好的方法,就无脑跑了一遍de4net(话说直接导入也可以带壳反编译,只不过有些地方可读性太差)

TES286 发表于 2021-7-28 20:39

Hmily 发表于 2021-7-28 18:00
@TES286 图片为什么不上传论坛本地啊,你这个图床好卡啊。

已改,谢谢提醒

(提个建议,论坛上传图片能否加入直接从剪贴板粘贴,要不然还有先存在本地在上传,有些不方便,所以这里之前使用第三方图床)

stevejobs111 发表于 2021-7-25 18:28

拿走学习了感谢博主,,,,,,

Tamluo 发表于 2021-7-25 20:12

{:1_921:}
这个给力哈,楼主牛啊{:1_913:}{:1_893:}

xixicoco 发表于 2021-7-26 01:19

不错,这么干的,牛逼

bjxiaoyao 发表于 2021-7-26 01:55

内容精彩,感谢分享。

t171 发表于 2021-7-26 08:45

这个看起来好厉害啊,学起来

Wits 发表于 2021-7-26 09:32

yasenhacker 发表于 2021-7-26 11:25

你运气真好,程序用smart assembly 6.xx加密,如果用smart assembly 8.xx加密的话,de4dot也脱不了。你有没有对smart assembly8.xx有过研究???主要是脱壳

Tamluo 发表于 2021-7-26 18:25

不明觉厉。希望以后会接触到,学习到
页: [1] 2 3
查看完整版本: .NET删除验证与破解通讯协议