• 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中的密码。----

     

     

    菜鸟的自白
  • 相关阅读:
    hdu 1863 畅通工程
    poj 2524 Ubiquitous Religions
    04 Linux终端命令01
    05 linux中yum源报错
    Filterg过滤器和Listener监听器
    03 Centos的文件目录、远程连接工具及快照操作
    02 安装虚拟机以及设置虚拟机网卡信息
    01VM虚拟机介绍及配置虚拟机网卡信息
    Jstl表达式
    EL表达式
  • 原文地址:https://www.cnblogs.com/lzjloveit/p/14028074.html
Copyright © 2020-2023  润新知