乐易论坛-乐易网易语言培训教程火山PC视窗中文编程交流论坛

 找回密码
 立即注册

手机号登录

用手机号号登陆

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

办理VIP,定制软件,报名培训联系QQ[重磅]2024年实地培训高清培训目录火山PC版乐易模块使用教程
请牢记揰掵佲的QQ号1615457736 1615457734 其他都是骗子有了火山,易语言是否还有必要学习吗?易语言0基础入门课程
火山PC视窗0基础入门课程易语言外挂0基础入门课程火山PC视窗火山HOOK入门课程
易语言误报处理课程QQ空间POST课程2022年火山PC易语言POST系列课程
Android逆向Jeb动态调试0基础课程QQ邮箱网页POST课程WeChat个微Hook实战课程
百日Js加密分析实战课程(无密下载)QQ群POST课程h5游戏WebSocket逆向视频
JavaScript加密特训课程易语言汇编快速入门课程破解实战系列课程
[2024年]火山PC0基础x64位游戏内存辅助开发教程手游模拟器脚本0基础课程易语言加密防破解0基础入门课程
广告位招租联系QQ1615457736  
查看: 11783|回复: 0

[分析资料] 百度软件中心算法还原记录

[复制链接]

[分析资料] 百度软件中心算法还原记录

[复制链接]
已绑定手机
已实名认证
揰掵佲
等级头衔

等級:乐易运营组

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分成就
易币
贡献
主题
精华
金钱
积分
33884
注册时间
2014-8-2
最后登录
1970-1-1

勋章墙

2017-3-19 13:55:45 | 显示全部楼层 |阅读模式

据统计90%查看本帖的人,都已经注册本站了哦

您需要 登录 才可以下载或查看,没有账号?立即注册

×
百度软件中心 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染色法。我们首先选中加密参数相关的寄存器或内存地址,
对引用到这些寄存器或内存的地方进行标记染色,最后确定调用情况,如下图:
[img]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[1].png[/img]

已知R0是加密数据指针,MOV R8,R0,可知R8也指向该段数据染色引用。在后面的代码片段中寻找所有R8和R0的引用并染色,注意只能在这些寄存器被改变之前寻找,这个需要个人领悟了。
B6413是一个很复杂的初始化函数,在正文有比较详细的分析,但是并没有很大的还原价值,B6419的参数中传入了加密数据,所以与加密参数有关。另外一点警告,B6413虽然在此处否定了与加密数据相关,并不代表其它地方调用也与数据无关,可以用IDA的交叉引用分析解决这个问题,截图如下:
[img]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[2].png[/img]
GC03 不属于我们分析的范围,所以可以断定该函数与我们算法还原工作关系不大。

======================================================= 正文开始 ===========================================================
分析函数主要枝干:
[img]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[3].png[/img]
由图知,该函数是一个封装型函数,主要逻辑在下层函数,下层函数分别为GC01和GC02。

GC01的代码如下:
[img]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[4].png[/img]
该函数的功能应该是根据输入数据计算缓冲区长度,对于逆向算法而言该函数可以适当忽略。

GC02为加密算法主干。
GC02调用图(红色是关键函数):
[img]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[5].png[/img]
由图可知,该函数是一个比较复杂的函数,该函数为加密算法主函数。
下层函数有:
B6419、B6413、B6414、B6412


关于GC02参数:
参数一:待加密数据指针
参数二:待加密数据长度
参数三:恒为0
以上分析结果已经通过动态调试确认。

通过IDA F5功能:
[img]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[6].png[/img]
把这些代码抄到VS里面,然后导入一下IDA的头文件。
注意有些地方要修正一下,比如v11和v12实际上是两个很大的数组,需要根据反汇编结果来计算,v12的大小为196,v11我没有计算,如果拿不准可以把数组开很大。
实际上在移植过程中会遇到很多兼容性问题,这些问题都是需要通过逆向分析去手动分析原因。有的时候静态分析可能无法解决问题,那就需要动态调试,在动态调试的时候一个函数一个函数的调,一直到确定该函数的正确性后才调试下一个函数。调试的时候可能要打印很多中间量,一定不要嫌麻烦。
这个是主加密函数,有些细节需要处理一下,其它的函数都比较容易了,递归抄写即可。

另外,有一些IDA内置函数在头文件里面是没有的,比如ROR。
ROR实际上是循环右移函数,ARM汇编中移动位数可以是寄存器,在x86中只能是立即数(如果有误欢迎指正),所以编写函数如下:
[img]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[7].png[/img]
纯算法太复杂啦,我这种数学弱鸡就投靠汇编了。


B6413分析:
[img]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[8].png[/img]
红色为重要下层函数,黄色为重要全局数据。
该函数运算比较多,但是该函数为初始化函数,没有必要进行逆向分析。
B6413参数分析:
缓冲区大小 196
多次调用测试缓冲区初始值如下:
24 23 38 2D F0 01 BB B5  94 AA 42 A5 DC AD B2 B5
28 61 FE B2 1D 00 00 00  00 00 00 00 74 BC BA B5
00 18 B0 B1 34 00 00 00  54 05 BB B5 88 69 FE B2
2C AA 42 A5 F0 01 BB B5  34 AA 42 A5 34 AA 42 A5
F0 01 BB B5 5B A2 B4 B5  90 66 FE B2 4D 88 FA A1
90 66 FE B2 A0 66 FE B2  54 AA 42 A5 54 AA 42 A5
F0 01 BB B5 5B A2 B4 B5  88 69 FE B2 4D 88 FA A1
88 69 FE B2 98 69 FE B2  48 A2 2B B9 02 00 00 00
05 00 30 2A 71 6F 67 6A  4F 75 43 52 4E 6B 66 69
6C 35 70 34 53 51 33 4C  41 6D 78 47 4B 5A 54 64
65 73 76 42 36 7A 5F 59  50 61 68 4D 49 39 74 38
30 72 4A 79 48 57 31 44  45 77 46 62 63 37 6E 55
56 58 32 2D 4D 88 FA A1  44 54 15 B9 4A 00 00 00
98 69 FE B2 48 A2 2B B9


实际上我只是简单的介绍了一些逆向还原相关的知识,希望大家不要进入这些坑,新的一年,愿大家赚钱满满。.

源码也打包了
分析文章.zip (550.88 KB, 下载次数: 5)

回复

使用道具 举报

如果懒得打字,请选择右侧内容快捷回复 提醒:以任何方式进行『恶意灌水』的行为,进行封号处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

热点推荐上一条 /5 下一条

QQ|网站地图|手机版|小黑屋|乐易论坛-乐易网 | 湘ICP备19007035号

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表乐易立场!

娄底市乐易网络科技有限公司声明:乐易原创培训课程版权均为我公司所有,未经许可,不得擅自翻录,盗版,破解本站课课程,我们将保留法律诉讼的权利

GMT+8, 2024-5-6 16:40 , Processed in 0.051589 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表