美文网首页
IDA 动态调试 android so

IDA 动态调试 android so

作者: android小奉先 | 来源:发表于2023-04-07 15:15 被阅读0次

    本篇介绍

    使用 IDA 可以单步调试 so,即使没有源代码也没关系,这样就可以逆向目标应用的so,分析内部逻辑,本篇就介绍下如何操作。

    ida debug so

    首先得准备一个android app,带jni的。我这边用了一个加法的例子,jni 代码如下:

    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_idadebugdemo_MainActivity_addResultFromJNI(JNIEnv *env, jobject thiz, jint first,
                                                                jint second) {
        // TODO: implement addResultFromJNI()
        return first + second;
    }
    

    写完后的界面如下:


    WeChatWorkScreenshot_ba5b649d-8606-4dd2-b31e-a1e7786fbcb8.png

    接下来就开始调试了:
    运行 android server,从IDA_Pro_7.7\dbgsrv下拷贝对应的二进制到手机/data/local/tmp目录下,目前大部分Android手机都是64位的,选择android_server64就可以了,然后给一个执行权限

    flame:/data/local/tmp # ./android_server64
    IDA Android 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022                           
    Listening on 0.0.0.0:23946...               
    

    接下来在pc端配置下端口转发,这样pc端才可以和手机正常通信

    adb forward tcp:22222 tcp:23946
    

    占用的电脑端口就是22222,在配置ida的时候也用这个端口就好了。

    接下来以调试模式启动目标应用:

    adb shell am start -D -n  com.example.idadebugdemo/com.example.idadebugdemo.MainActivity
    

    这时候手机就会出现一个弹窗:


    WXWorkCapture_16809283198923.png

    接下来就是配置ida了,用ida 把so 加载进去后,配置下debugger:


    WXWorkCapture_16809283995015.png

    接下来继续设置bugger,将Events中的3个suspend选上,这样即使目标应用有反逆向手段也可以在调试中绕过去。


    WXWorkCapture_16809284568433.png

    接下来再配置下端口:


    WXWorkCapture_16809286028796.png

    然后attach 目标应用:


    WXWorkCapture_16809287192239.png

    接下来指令就会停止到一条svc 指令上:


    WXWorkCapture_16809287816868.png

    接下来设置下jdwp调试端口:

    E:\02documents\01projects\01cpp\zego>adb shell
    flame:/ # ps -ef |grep ida
    radio          1133      1 0 15:45:29 ?     00:00:00 imsqmidaemon
    u0_a141        2197    903 0 15:45:34 ?     00:00:00 .qtidataservices
    u0_a144        2341    903 0 15:45:34 ?     00:00:00 .qtidataservices
    u0_a142        2587    903 0 15:45:34 ?     00:00:00 .qtidataservices
    u0_a3         27700    903 0 14:37:39 ?     00:00:00 com.example.idadebugdemo
    root          27842  27838 0 14:50:02 pts/1 00:00:00 grep ida
    
    adb forward tcp:8700 jdwp:27700 
    

    继续建立jdb链接:

    jdb -connect "com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700"
    

    接着就可以点F9运行了。当应用开始加载到目标so后,就会出现一个弹窗


    WXWorkCapture_16809292781788.png

    这时候就根据实际情况选择就好,最好是搞成一样的so,这样调试起来会方便一些。

    接下来就可以找目标地址打断点了,当然也可以提前打断点:


    WXWorkCapture_16809299409604.png

    接下来就可以触发app逻辑了:


    WXWorkCapture_16809299937607.png

    这时候就命中断点了:


    WXWorkCapture_1680930046433.png

    接下来就可以单独调试了,甚至通过修改寄存器值修改代码逻辑,接下来就试试:


    WXWorkCapture_16809302278998.png

    我们输入的是 1 +1,寄存器w8,w9的值已经加载成对应的值了,接下来我们都修改成2:


    WXWorkCapture_16809309523733.png

    继续运行看看:


    WXWorkCapture_1680930371225.png

    这样就完成单步调试和修改逻辑了。

    相关文章

      网友评论

          本文标题:IDA 动态调试 android so

          本文链接:https://www.haomeiwen.com/subject/mxvpddtx.html