静态分析ida crackme
f5 快捷键 汇编转c语言
signed int __fastcall Java_com_yaotong_crackme_MainActivity_securityCheck(int a1, int a2, int a3)
{
int v3; // r5
int v4; // r4
unsigned __int8 *v5; // r0
char *v6; // r2
int v7; // r3
signed int v8; // r1
v3 = a1;
v4 = a3;
if ( !byte_6359 )
{
sub_2494(&unk_6304, 8, &unk_446B, &unk_4468, 2, 7);
byte_6359 = 1;
}
if ( !byte_635A )
{
sub_24F4(&unk_636C, 25, &unk_4530, &unk_4474, 3, 117);
byte_635A = 1;
}
_android_log_print(4, &unk_6304, &unk_636C);
v5 = (unsigned __int8 *)(*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)v3 + 676))(v3, v4, 0);
v6 = off_628C;
while ( 1 )
{
v7 = (unsigned __int8)*v6;
if ( v7 != *v5 )
break;
++v6;
++v5;
v8 = 1;
if ( !v7 )
return v8;
}
return 0;
}
动态调试—反反调试
使用apktool 反编译apk
1: 修改app , androidmenifest.xml 文件,application标签添加
<application android:allowBackup="true"android:icon="@drawable/creakme2_logo"android:label="@string/app_name"android:debuggable="true">
重新打包,签名
apktool b AliCrackme_密码在so文件/
打包后的文件在dist目录下面
签名:
生成证书
keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
123456
回车
y
回车
给app签名
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar AliCrackme_密码在so文件_sign.apk AliCrackme_密码在so文件.apk my_alias
2: 检查flag中是否有debug选项
adb shell dumpsys package com.yaotong.crackme
3: 以调试模式启动app ,app此时会挂住
adb shell am start -D -n com.yaotong.crackme/.MainActivity
Starting: Intent { cmp=com.yaotong.crackme/.MainActivity }
4: ida动态调试,连接模拟器
启动模拟器
adb push android_x86_server /data/local/tmp/
android_x86_server: 1 file pushed, 0 s...ed. 51.0 MB/s (920668 bytes in 0.017s
ida连接真机,进入app的包名。设置debug options
5:在设备里面查看app的进程
1682
6: 使用jdb命令让app恢复运行
adb forward tcp:8700 jdwp:1682
8700
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
7 在so文件被加载的时候,ida会停止,使用ctrl+s 查看目标so文件是否被加载
计算jni_onload的绝对地址,
需要先知道libcrackme的头文件的地址,使得ida可以查找到libcracme.so文件
0C801000
ida静态调试获取jniload的偏移量
JNI_OnLoad 00001B9C
.绝对地址= 0C801000 + .00001B9C = C802B9C
http://www.ab126.com/system/2783.html 是一个计算16进制的在线工具
libcrackme.so 0C806000
00001B9C
0C807B9C
变量名还原:
选中变量—y键—JNIEnv *
libcrackme.so 0C801000
C802B9C
开始单步调试
0C801000
00001B9C
C802B9C
如何转为
libcrackme.so
E798C000
00001B9C
E798DB9C
进入jnionload这个函数了
执行到红框这里就执行完了,跳出来了
ida静态调试,找到blx r7 的16进制
37 FF 2F E1
修改so文件,使用文本文件打开libcrackme.so文件
修改37 FF 2F E1
为nop指令—00 00 00 00
重新打包,签名
接下来是给check打断点
计算check函数的绝对地址
E7988000
000011A8
E79891A8
双击r3 可以查看这个变量的值
f5 转成c代码
总结:
反调试:
就是在jnionload 函数中不断的检查tracepid这个值是否不为0 ,不为0 ,说明是调试模式,创建线程去杀掉这个程序进程id
反反调试:
将app设置为调试模式,在配置文件中application标签设置android:debuggable="true"。给app重新打包,签名,安装
adb shell am start -D -n com.yaotong.crackme/.MainActivity 启动app
校验app启动是否是调试模式,查看字段debugs
ida动态模式连接真机,设置debug options选项
adb forward tcp:8700 jdwp:23757 端口转发23757 app的进程id
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 让app恢复运行
最后获取某个指令的16进制位,使用ida静态模式打开so文件获取指令
使用文本工具打开so文件,将获取到的指令修改为nop指令 00 00 00 00
对app重新打包,签名,安装
反调试完成。
调试app,获取app中的密码。----