Android逆向之破解某应⽤加密算法(动态调试so和hookso代
码)
⼀、样本静态分析
最近有位同学发了⼀个样本给我,主要是有⼀个解密⽅法,把字符串加密了,加解密⽅法都放在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类
第⼆个参数:注册的⽅法结构体信息
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个字节对于后⾯分析破解⾮常关键。然后需要从解密之后的字节数组的最后⼀位获取实际字节的长度,最后构建byte数组返回给Java层即可。所以这⾥我们看到最重要的是如何获取aes解密的key和iv值。这⾥有很多种⽅式可以动态调试,可以hook。但是我们先不介绍这两种解密⽅式,我们先来看看另外⼀个问题。
⼆、调⽤so功能函数(修改指令)
我们在之前是不是有时候解密⼀个so算法,其实没不要真的知道他的解密算法,⽽是可以调⽤他的so然后直接解密出来数据即可,所以我们本⽂也来尝试做⼀下,为什么这么做因为在这个过程中我想给⼤家介绍⼀些知识点⽐如修改arm指令等,我们把这个应⽤的so拷贝到项⽬中,然后构建⼀个native类和⽅法,最后调⽤解密⽅法,发现调⽤直接出现崩溃信息:这时候我们发现在进⼊JNI_OnLoad挂了,说明
JNI_OnLoad中做了⼀些东西检测:
看到JNI_OnLoad函数中有这两个函数调⽤,第⼀个我们都知道为了防⽌⾃⼰的进程被⼈恶意附加,就⾃⼰先占坑,这样别⼈就附加失败了,第⼆个看似也是类似功能,不过不⽤关⼼内部实现,我们为了后⾯动态调试成功,这⾥还是先把这两个函数⼲掉吧,这⾥⼲掉简单直接改成NOP空指令就可以了,就相当于没调⽤了。因为这两个函数的执⾏逻辑和返回结果和后⾯的逻辑是没任何关系的,所以可以这么做,如果有关系那只能修改返回值了。修改指令之前其实介绍过了,很简单先到指令对应的偏移地址:
然后⽤010Editor⼯具打开so⽂件,到这个地址:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。