• android在JNI_OnLoad入口函数下断点动态调试so库


     一般来说,很多APK的校验代码,都会在程序运行的时候自动加载一些动态so库,然后执行这些库中的校验代码。所以为了能够通过程序的校验,我们必须在执行这些函数之前下断点——理想的方法就是在JNI_OnLoad入口函数下断点。

      在2.3.3模拟器中详细步骤如下:

      ①在控制台输入adb shell 进入手机,然后使用  am start -D -n 包名/类名,以等待调试的模式启动APK应用;

        这里需要说明的是 “包名/类名”的书写方法:

    # am start -D -n {包(package)名}/{包名}.{活动(activity)名称}    或者

    # am start -D -n {包(package)名}/.{活动(activity)名称}

    程序的入口类可以从每个应用的AndroidManifest.xml的文件中得到,以计算器(calculator)为例,它的

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" …

    package="com.android.calculator2" …>…

    由此计算器(calculator)的启动方法为:# am start -D -n com.android.calculator2/com.android.calculator2.Calculator

    对于HelloActivity这个示例工程,AndroidManifest.xml如下所示:

     <manifest …

    package="com.example.android.helloactivity" …>

    由此它的启动方法为:

    # am start -D -n com.example.android.helloactivity/com.example.android.helloactivity.HelloActivity

      ②使用adb将IDA(我的是6.1)中的android_server 传入手机的/data/local/tmp目录中:

        adb push android_server  /data/local/tmp 

      #  再赋予权限

       adb shell

       cd /data/local/tmp

       chmod 777 android_server

      #运行android_server

       ./android_server

      ③另起一个cmd窗口,使用命令 adb forward tcp:23946  tcp:23946 进行窗口转发

      ④启动IDA主程序,点击菜单 Debugger->Attach->Remote ArmLinux/Android debugger ,打开调试程序对话框,在hostname一栏输入localhost,

    点击ok,然后在IDA弹出的窗口中,选择自己要附加的进程后点击OK 即可。

      ⑤点击菜单Debugger->Debugger Opitions 在弹出的Debugger setup窗口的Events中选择 stop on thread start/exit 以及 stop on library load/unload,再点击OK退出。通过此操作可以设置程序在创建新线程和加载so时自动中断。

      ⑥通过DDMS获取相应进程的端口号,然后使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=XXXX(DDMS查询到的端口号);

      ⑦连接成功后,按F9后手机上的“waiting for debugger"提示会自动消失,这个时候应该已经断在新线程,或者加载so处了。

      ⑧现在就可以在IDA中按下快捷键CTRL + S来查看要调试的so是否已经加载了,如果没有就F9,直到加载了为止;如果已经有了,就记下该so的start位置,然后另开一个ida分析.so库,找到JNI_ONLOAD的偏移地址,那么该JNI_OnLoad函数在进程中的真实地址就是so.start +  JNI_OnLoad_Offset。

        这里需要说明的是:有可能在快捷键CTRL + S跳出的窗口中有两个同名的so,我们应当选择权限为RX的这个,RX一般是代码段,RW一般是数据段。

        得到真实地址后,在IDA中按下快捷键G跳转到这个地址,然后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。

    注:原址:http://www.cnblogs.com/wanyuanchun/p/3760825.html

  • 相关阅读:
    Web开发学习之路--Eclipse+Tomcat+mysql之初体验
    Android必知必会-Stetho调试工具
    Android开发学习之路--NDK、JNI之初体验
    OpenMP基础----以图像处理中的问题为例
    leetcode 2 Add Two Numbers
    Java在linux下调用C/C++生成的so文件
    OpenCV特征点检测匹配图像-----添加包围盒
    [POJ 1442] Black Box
    [POJ 2019] Cornfields
    [HDU 1806] Frequent values
  • 原文地址:https://www.cnblogs.com/csnd/p/11800736.html
Copyright © 2020-2023  润新知