某md5魔改样本学习
在吾爱破解上看到个合适的案例,学习一下
初始化
先搭一个 unidbg 的架子
| |
直接运行就可以出结果,当然,我是来学习算法分析的
分析
接着打开 ida,改一下类型,这样好看一点
首先通过 GetStringUTFChars 得到 java 层的字符串,转成 c 语言字符串,得到输入的值给 v4
接着分配内存空间,给 v6,将 v4 传给 sub_A3C 加密后给 v6,最后返回 v6 的值
所以,毫无疑问, sub_A3C 就是加密函数
进来之后,就看到了 md5 的模数值,但是得到的结果并不是标准 md5 加密的结果,说明被魔改了,接下来就来看看是哪儿进行了魔改
首先需要直到一个 md5 函数可能魔改哪些地方?
- 初始化常量
- K 表
- 非线性函数
- 常量转换 首先看一下初始化常量,正常的初始化常量是:
由上图可知,初始化常量它并没有改,那就只能看其他的部分了
第一轮魔改
首先先来看第一轮运算,我把变量名改了一下,这样我看得清楚一点
可以很清楚的看到非线性函数改了,第一轮应该是 FF 函数,他的非线性函数是: (b & c) | ((~b) & d) 被修改成了 (d & c) | ((~d) & b),但是这样不太好看,我选择在 unidbg 中打印寄存器的值
经过分析汇编,我知道了:
A对应着W26寄存器B对应着W25寄存器C对应着W24寄存器D对应着W23寄存器 在 unidbg 中对日志进行打印
| |
得到结果如下:
在上面我已经知道非线性函数给改了,我也跟着他改一下,发现结果并不对
那应该是其他地方也改了,比如说,K 表
v14 看到上面赋值是在 0x12D8 的位置,第一次取需要 v14-4 即 0x12D8-0x10=0x12C8 的位置
从 0x12C8 的位置,开始找,k 表果然被魔改了
最后撸下来的 k 表就是这个:
| |
k 表替换之后,结果就正确了
但是并没有完全对,第一轮对了
第二轮魔改
首先看一下第二轮的代码
一来就看见非线性函数给改了
标准的非线性函数是: (B & D) | (C & ~D),而这儿魔改之后就变成了 (D & B) | (C & ~B)
看一下魔改非线性函数之后得到的结果

接着,我去 unidbg 打印一下魔改之后的 A,B,C,D 的值
| |
打印结果:
一致,接着看第三轮运算的魔改
第三轮魔改
先来看一下在 ida 中第三轮魔改的代码
发现并没有魔改非线性函数,他左移的位数(常量转换)也是对的,貌似值魔改了 k 表对应的值
到 unidbg 中打印一下:
| |
得到的值:
到标准算法改了过后的算法中打印一下
一致,接着就需要看第四轮魔改算法了
第四轮魔改
看一下魔改的代码呢
发现他是魔改了非线性函数的逻辑,左移位数也是对的
原来的逻辑是: C ^ (B | ~D) 经过修改之后变成: (D | ~B) ^ C
替换进去
正常魔改的结果是:
经过我算法魔改之后的结果:
刚好一致,unidbg 都不用验证了