百度软件中心算法还原记录
百度软件中心 nativeB64Encode.SO 工作文件创建时间:2017/1/25 14:41
更新时间:2017/1/25 22:00
作者:无名侠
百度软件中心下载量记录封包会用到Java_com_baidu_util_Base64Encoder_nativeB64Encode进行编码加密。
为防止某些人恶意利用,就不分享易语言源码和相关DLL,只提供C源码。
分析主函数:
Java_com_baidu_util_Base64Encoder_nativeB64Encode
参考输入输出数据:
输入: B74851AF9411771C6A91CBED98F2F9EF%7C724397360377753
输出: la2ctguSHuYnuviqguvWugiHB805iHu9YPH5ilOgHaq-uSiv_uvPtgaG2ig4uviXQSqqC
目标:用其它编程语言实现该函数的加密编码功能,就像下面这样:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image.png
当我们在逆向一个复杂算法的时候尽量不要想着要实现它里面所有算法。那么哪些算法可以不用重写,哪些算法需要重写呢? 如果一个函数运算量与加密数据完全没有关系,也就是说数据是不变的,那么这个函数可以不必逆向分析,这一类函数一般用于加密函数数据块填充、内存初始化等操作。
实际上很多加密算法的初始化算法是相当复杂的,所以完全没必要进行逆向分析,我们仅仅需要把数据块复制出来,固化在我们的编程语言中就可以了,一个简单的例子,CRC32算法生成表。事实上,我们在寻找这一类不用还原函数时有很多简单的方法,比如IDA染色法。我们首先选中加密参数相关的寄存器或内存地址,
对引用到这些寄存器或内存的地方进行标记染色,最后确定调用情况,如下图:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
已知R0是加密数据指针,MOV R8,R0,可知R8也指向该段数据染色引用。在后面的代码片段中寻找所有R8和R0的引用并染色,注意只能在这些寄存器被改变之前寻找,这个需要个人领悟了。
B6413是一个很复杂的初始化函数,在正文有比较详细的分析,但是并没有很大的还原价值,B6419的参数中传入了加密数据,所以与加密参数有关。另外一点警告,B6413虽然在此处否定了与加密数据相关,并不代表其它地方调用也与数据无关,可以用IDA的交叉引用分析解决这个问题,截图如下:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
GC03 不属于我们分析的范围,所以可以断定该函数与我们算法还原工作关系不大。
======================================================= 正文开始 ===========================================================
分析函数主要枝干:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
由图知,该函数是一个封装型函数,主要逻辑在下层函数,下层函数分别为GC01和GC02。
GC01的代码如下:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
该函数的功能应该是根据输入数据计算缓冲区长度,对于逆向算法而言该函数可以适当忽略。
GC02为加密算法主干。
GC02调用图(红色是关键函数):
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
由图可知,该函数是一个比较复杂的函数,该函数为加密算法主函数。
下层函数有:
B6419、B6413、B6414、B6412
关于GC02参数:
参数一:待加密数据指针
参数二:待加密数据长度
参数三:恒为0
以上分析结果已经通过动态调试确认。
通过IDA F5功能:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
把这些代码抄到VS里面,然后导入一下IDA的头文件。
注意有些地方要修正一下,比如v11和v12实际上是两个很大的数组,需要根据反汇编结果来计算,v12的大小为196,v11我没有计算,如果拿不准可以把数组开很大。
实际上在移植过程中会遇到很多兼容性问题,这些问题都是需要通过逆向分析去手动分析原因。有的时候静态分析可能无法解决问题,那就需要动态调试,在动态调试的时候一个函数一个函数的调,一直到确定该函数的正确性后才调试下一个函数。调试的时候可能要打印很多中间量,一定不要嫌麻烦。
这个是主加密函数,有些细节需要处理一下,其它的函数都比较容易了,递归抄写即可。
另外,有一些IDA内置函数在头文件里面是没有的,比如ROR。
ROR实际上是循环右移函数,ARM汇编中移动位数可以是寄存器,在x86中只能是立即数(如果有误欢迎指正),所以编写函数如下:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
纯算法太复杂啦,我这种数学弱鸡就投靠汇编了。
B6413分析:
file:///C:/Users/Administrator/Desktop/%E5%88%86%E6%9E%90%E6%96%87%E7%AB%A0/%E7%99%BE%E5%BA%A6%E8%BD%AF%E4%BB%B6%E4%B8%AD%E5%BF%83%20nativeB64Encode.SO%20%E5%B7%A5%E4%BD%9C%E6%96%87%E4%BB%B6_files/Image%20.png
红色为重要下层函数,黄色为重要全局数据。
该函数运算比较多,但是该函数为初始化函数,没有必要进行逆向分析。
B6413参数分析:
缓冲区大小 196
多次调用测试缓冲区初始值如下:
24 23 38 2D F0 01 BB B594 AA 42 A5 DC AD B2 B5
28 61 FE B2 1D 00 00 0000 00 00 00 74 BC BA B5
00 18 B0 B1 34 00 00 0054 05 BB B5 88 69 FE B2
2C AA 42 A5 F0 01 BB B534 AA 42 A5 34 AA 42 A5
F0 01 BB B5 5B A2 B4 B590 66 FE B2 4D 88 FA A1
90 66 FE B2 A0 66 FE B254 AA 42 A5 54 AA 42 A5
F0 01 BB B5 5B A2 B4 B588 69 FE B2 4D 88 FA A1
88 69 FE B2 98 69 FE B248 A2 2B B9 02 00 00 00
05 00 30 2A 71 6F 67 6A4F 75 43 52 4E 6B 66 69
6C 35 70 34 53 51 33 4C41 6D 78 47 4B 5A 54 64
65 73 76 42 36 7A 5F 5950 61 68 4D 49 39 74 38
30 72 4A 79 48 57 31 4445 77 46 62 63 37 6E 55
56 58 32 2D 4D 88 FA A144 54 15 B9 4A 00 00 00
98 69 FE B2 48 A2 2B B9
实际上我只是简单的介绍了一些逆向还原相关的知识,希望大家不要进入这些坑,新的一年,愿大家赚钱满满。.
源码也打包了
页:
[1]