原程分析链接:https://blog.csdn.net/qq1084283172/article/details/52133172
样本下载地址:https://pan.baidu.com/s/10DuffiXUWCrCNoeH9pWw-Q 提取码: f4b9
为了更加熟练的掌握ARM逆向,找了几个程序来练手,这个就是其中一个。
1. 拿到apk就直接用 jdx 加载看吧,首先看 AndroidManifest.xml
很清楚可以看到,程序没有加壳处理
包名叫: com.ucweb.crackme140522
入口Activity为: com.ucweb.crackme140522.MainActivity
2. 既然没有加壳,直接去 com.ucweb.crackme140522.MainActivity 看java代码吧
这里的 java 代码比较简单,取了手机imei,用户输入的userName,注册码sn 就通过 JNI 调用 so 函数 clacSnFuntion
3. 既然如此,那么开始用 IDA 打开 UCcrackme2/lib/armeabi/libclacSn.so ,然后进行分析 Java_com_ucweb_crackme140522_MainActivity_clacSnFuntion 函数
函数大概意思如下:
bool Java_com_ucweb_crackme140522_MainActivity_clacSnFuntion(
JNIEnv *env,
jobject clazz,
jobject imei,
jobject userName,
jobject sn)
{
bool check_result = false;
if (imei == NULL || userName == NULL || sn == NULL)
{
return check_result;
}
char* szimei = (char*)jstringTostring(env, imei);
char* szuserName = (char*)jstringTostring(env, userName);
char* szsn = (char*)jstringTostring(env, sn);
check_result = check_sn(szimei, szuserName, szsn);
free(szimei);
free(szuserName);
free(szsn);
return check_result;
}
4. 发现校验函数在 check_sn 函数里面,但是双击进去,嗯哼?这是什么鬼
5. 这么多红红的,这个函数肯定是不对的。so 在加载的时候还会调用初始化函数。(Linux so加载流程: https://www.cnblogs.com/vendanner/p/4979177.html)
所以按 Shift+F7 打开程序段
双击进入 .init_array 段
发现 init 段 直接就 -1,没有其他函数,所以修改函数不是在 init 里面处理的
6. 除了so加载的机制外,在Android中加载so,加载以后会主动调用 JNI_OnLoad 函数(Android加载so流程: https://shuwoom.com/?p=351)
函数比较复杂,粗略的看了下,就是在 JNI_OnLoad 函数里面做的手脚
7. 这个可以慢慢跟踪看看,为了方便大家跟踪,我把整个 JNI_OnLoad 函数逆向回C语言表述,流程跟汇编流程是一样的(F5插件出来流程上下关系会乱一点)
直接贴代码吧,还原各位对着C代码都跟踪下 JNI_OnLoad。特别是解密字符串部分,跟踪完一定会有收获的,加油
// so中加密的函数数组存储
unsigned char __data_start[0x414] = {
0xA5, 0x1A, 0x78, 0xBC, 0x4D, 0xD1, 0xCA, 0xB0, 0x4D, 0x61, 0xCA, 0xB0, 0x2C, 0x8A, 0x18, 0xB7,
0x5D, 0xD5, 0xDA, 0xB5, 0x55, 0x65, 0xD8, 0xB0, 0x56, 0x65, 0xCD, 0xB2, 0x4D, 0x35, 0xD8, 0xB7,
0x55, 0x15, 0xF5, 0xB6, 0x55, 0xB5, 0xC6, 0xB0, 0x59, 0x65, 0xD3, 0xB7, 0x51, 0x15, 0xD6, 0xB1,
0x65, 0x05, 0xD8, 0xB7, 0x59, 0x95, 0xD0, 0xB7, 0x51, 0x15, 0xD6, 0xB1, 0x51, 0x15, 0xD9, 0xB1,
0x55, 0x15, 0xD6, 0xB0, 0xB5, 0x66, 0xCA, 0xB0, 0x51, 0x15, 0xD9, 0xB1, 0x55, 0x15, 0xD9, 0xB0,
0x8D, 0x96, 0xCA, 0xB0, 0x49, 0x65, 0xD8, 0xB0, 0x54, 0x61, 0xD6, 0xB7, 0x56, 0x63, 0x16, 0xB7,
0x61, 0x95, 0xD8, 0xB0, 0x74, 0x6B, 0x16, 0xB7, 0x91, 0x96, 0xCA, 0xB0, 0x75, 0x65, 0xD8, 0xB