• 安卓逆向9-ida静态调试


    ###

    mac的我已经安装好了

    ###

    ida介绍

    ida工具不只是能调试so文件的,还能打开smali文件,dex文件的,这个要知道

    ida是一个逆向工具

    最大的好处就是能把c++写的可执行文件,反编译成为汇编,再转成c语言,

    ###

    ida是国外的软件,是收费的,

    我们要使用ida pro

    国内一般使用比较多的就是ida 7

    分为32位,64位的,

    ###

    C语言简单普及

    数据类型:
    //整型
    int a = 100;
    //字符串
    char *s = "yuanrenxue.com";
    //浮点型
    float = "3.14";
    //双精度浮点型
    double = "3.141592633764862";
    //指针
    int *a_add = &a;

    这个指针,重点理解一下,

    上面这是定义一个指针,int *a_add = &a;,

    print(add)  这是打印内存的地址,比如是0x10000

    print(*add) 这是打印内存地址里面的具体的值,比如是100  

    //字符串常量 不能修改
    const char *ss = "hello";
    //数组
    int num[5];
    char name[5];
    //清空
    name = 0;
    //c++
    MD5::MD5()
    std::__ndk1::init()


    *a_add + 1
    //1个字节(Byte) = 8位(Bit) 1K=1024B 1M = 1024K 1G = 1024M 1T = 1024G
    int8_t //占8位 1个字节
    int16_t //占16位 2个字节

    ###

    什么是NDK开发

    --就是可以使用c或者c++进行so库的开发
    Android NDK:Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集
    用来做Native开发
    .so文件
    官方网站:https://developer.android.com/ndk

    ###

    Java如何调用so库里的方法/函数

    什么是JNI
    JNI是Java Native Interface的缩写,用Java调用so库就叫着JNI。如下
     
    //在Java中申明一个Native方法
    public static native String securityCheck(Context context, String str);
     
    //用System.loadLibrary()加载so库 全称是 libnative-lib.so
    static {
    System.loadLibrary("native-lib");
    }
    所以是把前面的lib和后面的so省略了
     
     
    (11) .so文件里对应的securityCheck函数名称是:
    Java_com_yaotong_crackme_MainActivity_securityCheck()
    Java_类名_方法名()
    示例演示 crackme
     
    但是这个名字可能是不一样的,
    (22). .so文件里对应的函数名称不一致:(IDA静态调试后再讲)
    这种情况叫着:手动注册native方法
    函数对应的名称是在 JNI_ONLoad()函数里注册
     
     
    System.loadLibrary()加载so文件流程:
    1,先读取so文件的.init_array段
    2,再执行JNI_OnLoad函数
    3,JNI_ONLoad是.so文件的初始函数
    4,然后调用具体的native方法 

    #####

    ida静态调试

    案例,之前有一个飞船自毁的apk,

     我们静态调试点击new,

    如果是动态调试点击go

    点击new之后,选择so文件打开,

    ###

    做成的面板函数列表很重要!!!

    左边可以搜索方法的名字,

    面板左侧函数列表可以查看每个函数的偏移量(相较于.so文件头的偏移量)

    ###

    F5键(windows fn+F5) 把汇编代码转成C代码

    我们看不懂,可以点击F5,然后就可以看到一个c语言的代码,如下图,

    你想要看汇编,那就点击这个c语言的某一个值,就跳转到了汇编语言那里了

    export是导出函数,这个是很重要的,可以暴露的接口

    ###

    ctrl + s 查看so文件段信息

    在汇编语言界面,点击ctrl+s,可以弹出这个段

     这个init段就是在初始化,

    System.loadLibrary()加载so文件流程:
    1,先读取so文件的.init_array段
    2,再执行JNI_OnLoad函数
    3,JNI_ONLoad是.so文件的初始函数
    4,然后调用具体的native方法 
    ###
    shift+F12 查看so文件中所有常量字符串的值 有的密码之类的可能就在这里面
    在汇编语言的界面,

     有时候一些密码就会在这个里面,

    ###

    我们F5转成了c语言,但是还是有很多看不懂的,

     这个时候我们可以做一些还原,

    还原方法:

    - JNI函数方法名还原 选中v3 按y建 作用(类型还原)
    v3 + 676 前面是一个指针 比如 *(_DWORD *)v3 + 676 表示 v3 是JNIEnv *类型
    形如 *(_DWORD *)vX + YYY 皆是
    可选中v3 按y键进行类型替换,替换为JNIEnv *

     

     这个就是反向在调用java的代码

    然后就可以进行分析了
    你看最后的return 0, 这个就是java代码调用之后返回的值,
    0就是FALSE
    v8就是1,就是TRUE,
    ###
    这些代码都是v1,v2,v3,看起来很烦躁,
    我可以可以重命名代码
    如何重命名,
    选中变量,右键,rename

     ###

     我们看到v5,就是我们输入的密码,这个是从java调用的,获取到了我们输入的密码

    我们可以把v5改名,input_password

    v7是哪里来的,是v6给的,v6是一个常量,我们可以把v6改为real_password

    这样就更加的清晰了

    ###

    我们还可以加注释,

    因为我们可能是一天分析不完,我们可以加注释,

    如何注释?点击键盘的斜杠,/

     

     这就是我们保存的我们改名字和加注释的文件,我们下次就可以打开之后继续进行分析了

    ###

    java调用so库里面的方法,这个调用的方法名可能是不一样的,
    (22). .so文件里对应的函数名称不一致:
    这种情况叫着:手动注册native方法
    函数对应的名称是在 JNI_ONLoad()函数里注册

    如何手动注册?

    这次是换了一个app了,

     你用jadx打开了文件,是调用的so文件的getAS,

    但是你打开so文件,你会发现没有这个so文件的方法名,

    你搜索JNI_ONLoad,就是在这里进行了手动注册

    ###

     我们使用上面的JNIENV进行还原,注意还原的格式,不要胡乱还原,!!!

    RegisterNative就是这个把名字注册成为了另外一个名字,

    ###

    上面就是ida静态调试了

    这个时候我们还可以打开一个ida,进行动态调试

    这样就是静态调试看c代码,

    动态调试看汇编,然后一步一步往下看,

    这就是ida双开,

    密码就是内置到so文件的,

    我们之前是直接绕过了密码,现在去so文件,直接获取他的密码,如果操作?

    ###

    ###

  • 相关阅读:
    DropBoxUtil
    mtk camera faq
    android onInterceptTouchEvent和onTouchEvent的执行关系
    高通 camera open流程
    android 消息机制
    hierarchyviewer工具,android 布局分析
    关于屏幕的几个概念
    repo 使用
    launcher 壁纸相关
    launcher 点击和滑动屏幕过程分析
  • 原文地址:https://www.cnblogs.com/andy0816/p/15100492.html
Copyright © 2020-2023  润新知