Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

栏目: Android · 发布时间: 5年前

内容简介:今天我们再来看一下最右这个app的签名算法破解详情,之前已经有三篇文章详细介绍了他的底层加密算法,本文来介绍从0开始介绍解密功能,首先我们拿到最右App之后,为了获取他的数据采用抓包:看到这这里有一个签名字段sign,然后用Jadx打开应用全局搜索:

一、逆向分析

今天我们再来看一下最右这个app的签名算法破解详情,之前已经有三篇文章详细介绍了他的底层加密算法,本文来介绍从0开始介绍解密功能,首先我们拿到最右App之后,为了获取他的数据采用抓包:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

看到这这里有一个签名字段sign,然后用Jadx打开应用全局搜索:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

搜到了这个加密函数:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

然后看到是把加密功能放到so中了,直接用IDA打开so查找加密函数:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

可惜收不到任何 Java 开头的加密函数,所以直接搜索JNI_OnLoad函数,看到这样的格式,选中变量按Y键改成JNIEnv*指针变量即可:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

然后看到注册函数没有类型,这时候右键选择Force call type即可:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

点击地址查看他的动态注册JNI方法:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

这里看到了实际地址,点击进入查看:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

这里看到很多sub开头的函数,我们可以一个一个函数查看,也可以用Frida进行hook函数的参数和返回值定位都可以,这里通过hook的方式定位到了5070函数:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

然后就是我们前面分析的四个循环加密功能了:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

看到这里的循环都是采用位操作,所以要是静态分析其实还是很困难的,所以采用动态调试分析结果

二、动态调试

第一步:运行android_server

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

第二步:转发端口和运行应用(Debug模式)

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

第三步:IDA附件进程

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

第四步:运行jdb连接调试

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

然后这里记得在设置一下Debug Option:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

然后一路往下运行F9即可,点击工程中的按钮,加载so即可:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

在模块窗口中找到so的基地址,加上我们需要调试的函数相对地址就是这个函数的绝对地址:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

这时候发现不是常规的arm指令,可以按P键进行显示:

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

到这里我们就成功的找到关键的加密函数下好断点了,后面的内容大家就去看之前的文章吧:

Android逆向之分析最右App加密算法(ARM指令恶心篇)

Android逆向之分析最右App加密算法(ARM指令喜欢篇)

Android逆向之分析最右App加密算法(ARM指令不舍篇)

三、技术总结

然后就有了解密结果,接下来就把之前的解密内容和技术总结一下:

第一、我们在分析应用加密功能的时候,如果加密功能放到so中,我们首先会通过上层的Java方法找到对应的JNI函数,如果应用采用的是动态注册方式,那么需要找JNI_Onload函数中的RegisterNative函数,找到函数映射地址即可。

第二、一般应用加密都采用位操作,无外乎就是与或非等操作,同时采用密钥库的方式进行加解密,这时候我们如何获取到密钥库就是需要动态调试留意LDR等指令,或者静态分析LDR指令也可以。

第三、对于简单的加密方式我们可以使用hook的方式批量打印数据观察结果,比如这里的第三篇的时候我们就用这种方式打印了观察找到规律加密方式了。

第四、在使用Frida进行hook未导出函数的时候,有一个简单靠谱的方式就是利用已经导出的函数推算出未导出的地址即可,详情可以参考第三篇文章。

第五、对于想要调试应用的so文件代码,有时候应用启动太慢或者时机太早没法控制,可以写个demo调用so,通过点击事件来触发so调用执行逻辑方便动态调试,如果有签名校验直接动态调试过掉即可

对于这个样本我们可以很好地了解到了ARM指令的一些常用方法:

1、位指令

AND指令进行逻辑”与”操作;

ORR指令进行逻辑”或”操作;

EOR指令进行逻辑”异或”操作;==》F = ^AB + A^B

ORN指令进行逻辑”或非”操作;==》F = ^(A+B)

BIC指令进行”RN AND NOT RM”操作

2、批量存储读取指令

LDM:(load  much)多数据加载,将地址上的值加载到寄存器上

STM:(store much)多数据存储,将寄存器的值存到地址上

主要用途:现场保护、数据复制、参数传送等,共有8种模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:

IA:每次传送后地址加4,其中的寄存器从左到右执行,例如:STMIA R0,{R1,LR} 先存R1,再存LR

IB:每次传送前地址加4,同上

DA:每次传送后地址减4,其中的寄存器从右到左执行,例如:STMDA R0,{R1,LR} 先存LR,再存R1

DB:每次传送前地址减4,同上

FD:满递减堆栈 (每次传送前地址减4)

FA:满递增堆栈 (每次传送后地址减4)

ED:空递减堆栈 (每次传送前地址加4)

EA:空递增堆栈 (每次传送后地址加4)

注意:其中在数据块的传输中是STMMDB和LDMIA对应,STMMIA和LDMDB对应,而在堆栈操作是STMFD和LDMFD对应,STMFA和LDMFA对应

3、穿插指令

这个在我们分析的过程中的确可以发现在你分析的过程中突然多了几条和前后指令没关系的指令,主要通过指令的返回值是否参与后面指令的执行结果,没有的话就是穿插指令,不要被穿插指令混淆

本文的目的只有一个就是学习逆向分析技巧,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系,本文涉及到的代码项目可以去编码美丽小密圈自取,欢迎加入小密圈一起学习探讨技术

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

四、总结

本来直接用一篇文章介绍这个样本的分析过程,结果发现一篇文章说不清楚,而且发现这个样本是个非常好的介绍ARM指令知识点的样本,所以就分为三篇内容从0开始介绍给大家,希望大家对ARM指令不要惧怕,慢慢的接受他了解他,因为后面的加密大部分都在so中,学会ARM也是必不可少的一部分!

《Android应用安全防护和逆向分析》

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)

更多内容: 点击这里

关注 微信 公众号,最新技术干货实时推送

Android逆向之旅—最右App的签名算法解析(ARM指令学习回首篇)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

架构真经

架构真经

马丁L. 阿伯特(Martin L. Abbott)、迈克尔T.费舍尔(Michael T. Fisher) / 机械工业出版社 / 2017-4 / 79

前言 感谢你对本书第2版感兴趣!作为一本入门、进修和轻量级的参考手册,本书旨在帮助工程师、架构师和管理者研发及维护可扩展的互联网产品。本书给出了一系列规则,每个规则围绕着不同的主题展开讨论。大部分的规则聚焦在技术上,少数规则涉及一些关键的思维或流程问题,每个规则对构建可扩展的产品都是至关重要的。这些规则在深度和焦点上都有所不同。有些规则是高级的,例如定义一个可以应用于几乎任何可扩展性问题的模......一起来看看 《架构真经》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具