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

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

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

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

# 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函数入口处下断点了。

android在JNI_OnLoad入口函数下断点动态调试so库的更多相关文章

  1. Android动态调试so库JNI_Onload函数-----基于IDA实现

    之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...

  2. Windbg对过滤驱动DriverEntry函数下断点技巧

    方法1: 1> 先用DeviceTree.exe查看指定的过滤驱动的Load Address(加载地址) 2> 再用LordPE.EXE查看指定过滤驱动文件的入口点地址 3> 计算过 ...

  3. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  4. linux下C++动态链接C++库示例详解

    注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一.介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题. 事 ...

  5. subline 配置,本地项目代码下断点来调试远程项目

    参考: https://my.oschina.net/ptk/blog/299464 1. 文件 tts.sublime-project 的配置如下: { "folders": [ ...

  6. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

  7. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  8. 动态调试Android程序

    最近好几天来一直在看动态调试.首先是这一篇(http://www.52pojie.cn/forum.php?mod=viewthread&tid=293648)里面介绍了多种IDA动态调试的情 ...

  9. 安卓动态调试七种武器之离别钩 – Hooking(下)

    0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试 ...

随机推荐

  1. 标准对象 -------JavaScript

    本文摘要:http://www.liaoxuefeng.com/ 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对 ...

  2. git常用命令以及速查命令

    工作中使用的是git,所以写这个只是为了加深自己的记忆,提高熟练度 共勉~ git 主要命令 要关联一个远程库,使用命令git remote add origin git@server-name:pa ...

  3. php 获取开始日期与结束日期之间所有月份

    function showMonthRange($start, $end) { $end = date('Ym', strtotime($end)); // 转换为月 $range = []; $i ...

  4. 第六篇:python中numpy.zeros(np.zeros)的使用方法

    用法:zeros(shape, dtype=float, order='C') 返回:返回来一个给定形状和类型的用0填充的数组: 参数:shape:形状 dtype:数据类型,可选参数,默认numpy ...

  5. Linux ps与top命令

    Linux ps与top命令 这两个命令都是查看系统进程信息的命令,但是用处有点儿不同 1.ps命令--提供系统过去信息的一次性快照 也就是说ps命令能够查看刚刚系统的进程信息  命令:ps aux或 ...

  6. PHP计算两个字符的相似程度similar_text

    在网站开发中,我们会常常要计算两个字符的相似程度,那么PHP为我们提供了一个函数similar_text;  1,similar_text的用法 如果我想计算"ly89cn"和&q ...

  7. SHELL脚本的常规命令

    **shell脚本的执行方式: 方法一:首先赋予x权限,再输入相对路径或绝对路径,./testdot.sh或/root/shell/testdot.sh 方法二:sh testdot.sh(会新开一个 ...

  8. Ubuntu12.04下YouCompleteMe安装教程(部分)

    1.通过源码编译安装VIM 开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载 ...

  9. java并发面试题-基础

    多线程 java中有几种方法可以实现一个线程? 1.直接继承thread类:2.实现runnable接口: 如何停止一个正在运行的线程?可以使用正在运行的线程,支持线程中断,通常是定义一个volati ...

  10. eclipse中设置JVM内存

    一.   修改jdk 使用内存: 找到eclispe 中window->preferences->Java->Installed JRE ,点击右侧的Edit 按钮,在编辑界面中的 ...