网站挂载济南产品设计公司
App信息
包名:com.yaotong.crackme

Java层分析
MainActivity

很容易就能看出来是在securityCheck函数里进行安全校验。securityCheck是一个native函数,到so中进行分析。
SO层分析
定位函数位置
在导出函数里搜索

securityCheck
数据类型修复和重命名后的securityCheck
int __fastcall Java_com_yaotong_crackme_MainActivity_securityCheck(JNIEnv *a1, jobject a2, char *str)
{const char *inputStr; // r0char *wojiushidaan; // r2int tempResult; // r3int v8; // r1if ( !byte_6359 ){sub_2494(byte_6304, 8, &unk_446B, &unk_4468, 2, 7);byte_6359 = 1;}if ( !byte_635A ){sub_24F4(byte_636C, 25, &unk_4530, &unk_4474, 3, 117);byte_635A = 1;}_android_log_print(4, byte_6304, byte_636C);inputStr = (*a1)->GetStringUTFChars(a1, str, 0);wojiushidaan = off_628C;while ( 1 ){tempResult = *wojiushidaan;if ( tempResult != *inputStr )break;++wojiushidaan;++inputStr;v8 = 1;if ( !tempResult )return v8;}return 0;
}
off_628C
进入off_628C偏移查看,它的内容是"wojiushidaan"

结合securityCheck函数分析,我觉得这就是正确答案了。
可是输入之后,还是校验失败。

无奈只能动态调试
动态调试
IDA动态调试环境配置这里不再介绍。
附加进程
这里我们选择附加到进程

附加进程之后,我们运行一下,会发现,程序崩了,IDA也崩了,说明这个程序是有反调试的。
反调试绕过
猜测反调试是通过线程进行循环检测的。
打开线程窗口

发现一个线程yaotong.crackme,有点可疑,右键这个线程,将状态改为suspend,暂停这个线程。

然后运行,程序没有挂掉,可以进行调试。
断点调试
打开Modules窗口,找到libcrackme.so,双击进去,找到securityCheck函数,双击该函数跳转到函数的位置。

在这个函数起始的位置下一个断点,将光标移动到断点位置,按下快捷键F,然后在输入框输入任意数据,点击输入密码,程序就会运行到断点位置。
F5查看反汇编,找到原来的变量偏移地址处,发现数据变了,变成了aiyou,bucuoo

验证
将aiyou,bucuoo放进输入框,点击输入密码,跳转到成功界面。

