Android逆向之旅---破解某应用加密算法(动态调试so和frida hook so代码)

本文通过一个Android应用的样本,详细介绍了如何破解加解密方法位于so文件中的加密算法。首先进行了静态分析,找到了JNI_OnLoad中的动态注册和解密函数。接着,通过修改so文件中的指令,绕过了检测并成功调用解密函数。然后,使用动态调试获取解密算法的关键参数,并通过Java代码实现了解密。此外,还探讨了使用Frida Hook获取解密算法的便捷性。最后总结了逆向分析过程中学到的技术和思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、样本静态分析

最近有位同学发了一个样本给我,主要是有一个解密方法,把字符串加密了,加解密方法都放在so中,所以之前也没怎么去给大家介绍arm指令和解密算法等知识,正好借助这个样本给大家介绍一些so加密方法的破解,首先我们直接在Java层看到加密信息,这个是这位同学直接告诉我这个类,我没怎么去搜了:

这个应用不知道干嘛的,但是他的防护做的还挺厉害的,之前我们介绍过小黄车应用内部也用了这种中文混淆变量和方法等操作,这里就不多解释了,这里主要看那个加密算法:

看到这里有一个加解密方法,传入字符串字节,返回加解密之后的字节数据,我们直接用IDA打开这个libwechat.so文件:

这里可惜没有收到Java_xxx这样的函数,说明他可能用了动态注册,所以就去搜JNI_OnLoad函数,所以这里注意大家以后如果打开so之后发现没有Java_xxx这样的函数开头一般都是在JNI_OnLoad中采用了动态注册方式,所以只需要找到JNI_OnLoad函数,然后找到RegisterNatives函数即可,不过在这个过程中我们需要转换JNIEnv指针信息:

这里大家如果看到类似于vXX+YY这样的,选中vXX变量,然后按Y按键,然后替换成JNIEnv*即可,我们如果手动注册过Native方法,都知道RegisterNatives函数的三个参数含义:

jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, jint nMethods)

第一个参数:需要注册native函数的上层Java类

第二个参数:注册的方法结构体信息

第三个参数:需要注册的方法个数

这里当然是重点看第二个参数,这里当然也需要知道方法结构体信息:

typedef struct {
const char* name;
const char* signature;
void*       fnPtr;
} JNINativeMethod;

结构体包含三部分分别是:方法名、方法的签名、对应的native函数地址;那么这里我们肯定重点看第三部分,因为要找到具体的解密函数,这时候我们需要去对RegisterNatives函数查看他的实参值:

这里选中RegisterNatives函数名,然后右键选择Force call type即可:

这时候就看到了RegisterNatives的三个参数值,其实这里看到是四个,这个主要是调用方式的区别,因为我们还会看到有这种调用方式:(*JNIEnv)->RegisterNatives(JNIEnv env...),所以第一个参数其实是JNIEnv变量,这里就看第三个参数的地址就是需要注册方法的结构体信息,点击进入查看:

这里看到了方法名,方法签名以及对应的具体函数,这里主要看解密函数,找到decryptData即可,然后点击进入查看:

按下F5查看C语言代码:

继续点击进入查看:

这里就是实际的解密算法的地方了,大致看一下其实还是很简单的,就是有一个AES_CBC_128算法加解密的,我们用过这个算法都知道需要key和iv值,因为是128位的,所以这两个值肯定是16(128/8)个字节,这个是基础知识也是非常关键的知识,知道是16个字节对于后

要使用Frida进行算法Hook,你需要具备一些基础的逆向工程知识,以及对JavaScriptFrida的API有所了解。《Frida快速定位Android加密算法方法整理》这本文档将指导你如何通过自定义JavaScript脚本来实现对Android应用加密算法的监控分析。以下是详细步骤: 参考资源链接:[Frida快速定位Android加密算法方法整理](https://wenku.csdn.net/doc/5rxsbsxzn8?spm=1055.2569.3001.10343) 1. 安装Frida:首先确保你的Android设备已经root或者使用了Frida的代理功能,然后在你的开发环境中安装Frida的Python模块。 2. 连接Frida到目标应用:使用frida-ps找到目标进程,然后使用frida命令或者Python的frida模块attach到目标进程。 3. 编写JavaScript脚本:在你的JavaScript脚本中,你需要使用Frida提供的API来定位目标应用中的加密函数。通常加密函数会使用特定的API,如MD5的ComputeHash,或者使用特定的类方法名。 4. 使用Frida的intercept功能:通过Frida的intercept功能,你可以监控函数调用,并在调用前后执行自定义的JavaScript代码。你可以打印出函数的参数返回值。 5. 分析输出信息:通过观察Hook后输出的信息,你可以分析出算法的类型(如MD5、SHA、AES等),以及密钥等关键信息。 6. 实践演练:通过实际对目标应用进行Hook操作,不断调整你的JavaScript脚本,直到能够准确地提取到所有所需的信息。 7. 学习拓展:对于不熟悉Frida的读者,建议访问csdn网站搜索相关入门教程,加深对Frida使用原理的理解。 8. 注意事项:在实际应用中,Hook操作可能会触发应用的反调试机制,因此操作时需要谨慎。此外,由于Hook涉及到的代码执行,可能会导致应用崩溃或数据丢失,因此建议在安全的测试环境中操作。 综上所述,通过Frida的JavaScript脚本Hook技术,你可以有效地识别并抓取Android应用中的加密算法过程。这对于分析应用的安全性,以及在进行安全测试逆向工程时具有极大的价值。 参考资源链接:[Frida快速定位Android加密算法方法整理](https://wenku.csdn.net/doc/5rxsbsxzn8?spm=1055.2569.3001.10343)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值