一到九月份,学生机房管理助手就直接开始窜稀式更新,连更两个版本,这使我弄不到7.3的样本,只能分析7.4了。大伙有7.3样本欢迎联系我。
7.2版本分析见最新支持7.2!用C++干掉讨厌的学生机房管理助手
此文章大致是按照我研究的思路来写的,这样写得容易些,如果阅读比较困难,请见谅,谢谢。
开始分析:
概述
7.4版本截图
先尝试运行样本,可以发现,还是jfglzs.exe和prozs.exe在运行,只是prozs.exe的随机名算法更换了。扫描prozs.exe:
脱壳
几乎没啥变化,那就丢进de4dot脱个壳吧(这里是GUI版本加上吾爱破解的de4dot)
呃,失败了。将混淆类型(-p
参数)改成.NET Reactor 4.x试看看吧:
还是有报错,但是起码保存了一半,抱着侥幸心理瞅瞅dnSpy可以反编译么:
可以看到结构与7.2相似(可看我分析文章),进入Form1_Load()
方法:
代码很长,且与我们之前看到的不同:多个switch()
和跳转语句,很明显是做了控制流混淆,而de4dot修为不够,对这个写得和OLG一样的程序无从下手!
其实我们如果就根据这些代码一个个检查、跳转,也可以大致还原出它的逻辑(我最初就是这样做的),可是太麻烦又太容易出错。
去除控制流混淆
根据Die扫描结果,此程序使用了.NET Reactor 4.8-4.9的壳,而有一个工具,NETReactorSlayer(https://github.com/SychicBoy/NETReactorSlayer),专治这类不听话的壳!!!
我们把带有控制流混淆的哪个de4dot脱到一半的程序丢进去,仅勾选去除控制流混淆(第二列第一个选项),进行处理(如果把源程序拖进去并全部勾选,会出现所有方法为空的问题,而将de4dot处理过的给它处理就没事):
非常成功啊,那么我们再拖进dnSpy看看,控制流混淆已经没啦,节省了我们很多时间!
分析代码
我们知道prozs.exe的随机名随日期不同而变化,那么在Form1_Load()
方法中找到涉及DateAndTime
的语句即可:
可以看见一系列求余操作,这告诉我们,这便是算法所在地!!
将其简化并翻译成C++代码即可。
可是这里面是不是有些问题?几个字符串加起来,没赋值给一个字符串变量,而是赋值给了num5
,这是怎么回事?往下看:
原来实际名称是string_1
,它在284行定义:
this.string_1 = num5 + Class7.smethod_11(44);
是表示那4个字符拼起来的num5
和一个奇怪方法的和,进入这个方法看看:
哦!脑壳疼,原来是给定一数字经过一堆算法处理,返回一个字符串。后面一大堆我就不放出来ex大伙了,只要知道传进的整数和返回值有唯一对应关系即可。
接下来string_1
的来历即可理解成:4个经过算法计算的字符的和(被赋给一整数)加上一个字符串常量。字符串常量的值是多少呢?我本来想打断点调试,可是应该是此脱壳后程序不完整的缘故,调试不了。那么我们就实际上机操作,揣测一下这些字符经过了怎样的处理。
插曲,反混淆时的错误
现在先注意这一点:如果你仔细观察上列“包含控制流混淆的代码”和“脱去控制流混淆的代码”,会在几个字符加起来的环节发现问题。我将代码贴过来对比(原程序代码控制流混淆已简化以方便观察):
未脱去混淆
//前面计算省略
if (num9 % 2 == 0)
{
num5 = Conversions.ToString(Strings.Chr