ida动态调试--反反调试

静态分析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中的密码。----

 

 

菜鸟的自白
原文地址:https://www.cnblogs.com/lzjloveit/p/14028074.html