johnick 发表于 2021-7-18 23:54

.Net注册码迷宫

本帖最后由 johnick 于 2021-7-19 13:06 编辑

在尝试研究一款商业软件,未加壳,也无混淆(谢大伙纠正,注册部分有混淆),本以为很轻松,谁知。。。先上图吧

https://attach.52pojie.cn//forum/202107/18/234525ncnddrtc7trwrtct.png?l

静态分析:
其他所有的函数都命名正常清晰,维度涉及注册码的部分,由小写a()和大写A()类封装,其中子方法、子函数、子属性的命名,也是a-zA-Z,然后再是子子,子子孙孙无穷尽也。。。
这个层数超过了人工识别追踪的限度。

这样一来,静态分析的路被堵死了。

动态分析:
其次,它是一个全局变量,比如其中一个子项,调用时写作global::A.d.D(),(当然D里面的实现,又用到了d.A().K(),AK分别又链到别的)
这就带来了一个问题,我搜遍全网也没找到如何让dnspy查看全局变量(global),调试时下方窗口也只有局部变量列表。

动态分析也无从下手。

不知道如何继续下去了。。。这种迷宫调用(自己命名的,不知道有没有官方叫法)真的有点厉害,暂时没有头绪了。

lml0126 发表于 2021-7-19 12:37

学会了,从入门到放弃

johnick 发表于 2021-7-19 11:28

本帖最后由 johnick 于 2021-7-19 13:00 编辑

细说一下吧,多图预警。
比如说,下面是个关键跳转:

https://attach.52pojie.cn//forum/202107/19/111533lyigk2lgc722ywwx.png?l

我刚开始想的是,把这个跳转IL掉,不就好了吗。后来才发现,这个软件有十几个收费功能, 而且不同的注册权限,能用的功能还不一样。一个个修可能也行,但优雅的方法还是找到注册码对象的核心,把它改了。一方面也能逼自己学点东西。

接下来分析,smethod_11是什么,它由smethod_0和method_19组成:

https://attach.52pojie.cn//forum/202107/19/111816n33vdmjajy14px4v.png?l

smethod0调用了gclass3_0,是个变量。

https://attach.52pojie.cn//forum/202107/19/111818jlhtzk9c7nkxnqoq.png?l

而这个gclass3_0是GClass2底下的一个类变量。我也不知道图2在Gclass2里面调用自己的变量,会是个什么值。。。先不管这个吧。继续说别的

刚才还有个method19,这是个啥呢

https://attach.52pojie.cn//forum/202107/19/111820yg4gzeqteafahftt.png?l

它由method1、smethod1和method4、smethod4构成。

https://attach.52pojie.cn//forum/202107/19/111822s5mmjoo9mo0vny99.png?l

再看method1,返回一个单变量,

https://attach.52pojie.cn//forum/202107/19/111824bzdv9wiv22i2vkii.png?l

smethod1,由interface1_0的变量判断构成。后面这个date或许是到期时间吧。



看一下interface1_0是啥,也就是个存数据的类。

https://attach.52pojie.cn//forum/202107/19/112635mn9storrskzmbx69.png?l



分析到这里,当然可以继续下去,但估计也就走了万里长征第一步,人工分析遇到了瓶颈。不知道我这个分析法对不对,有没有更好的思路或者工具之类的。

涛之雨 发表于 2021-7-19 00:00

这就像webpack打包的吧。。。
混淆改调用

SoftCracker 发表于 2021-7-19 00:15

> 未加壳,也无混淆
这不叫混淆,这叫什么?

gagmeng 发表于 2021-7-19 08:50

这混淆得连作者老妈都不认识了吧

zhanglei1371 发表于 2021-7-19 09:22

并非所有的混淆都是变成乱码,这,就是混淆!

johnick 发表于 2021-7-19 10:03

谢谢大家的热心回复,原来这种也叫混淆。

它只混了注册码部分的调用。补充一下,最外层除了a()和A(),也有bcdBCE等,内层更多。

和大家汇报一下,我试了,直接拖de4dot没用,可能单字母也是合法字符,用正则筛选,可以了。

然鹅。。。上图

25个爷爷命名空间,329个儿子类,1000多孙子类。。。de4dot相当于帮忙去除了同名同姓,对于静态分析的帮助,还是比较有限。

对于这样的核心代码结构,不知道有没有好的下手思路。



johnick 发表于 2021-7-19 13:47

似乎追到了它的某个重要变量:gclass3_0的赋值,位于smethod_1()内



而这个赋值smethod_1()的调用,是在一个叫LoadAsync()的函数内。顾名思义,这应该是一个异步函数。。。




瞬间懵逼了,这函数里面也没显式调用smethod_1()啊,这该怎么追下去呢,如何知道哪个实参被传给了smethod_1()呢?

johnick 发表于 2021-7-20 08:19

发现了一个问题,dnspy对async的支持是不行的,换ilspy,这一段LoadAsync函数可以正常显示了



那么随之而来一个问题:
ilspy是无法调试的。
dnspy可以调试,但代码无法正确显示,也就是说,上面这段在dnspy调试时都整合在下面最后一句return里,一撸而过。



无法动态调试,也就无法看这个关键的gClass变量的示例值,更无从对其更改。。。

目前就卡在这里了。
页: [1] 2
查看完整版本: .Net注册码迷宫