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

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

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

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

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

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

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

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

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

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

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

<manifest …

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

由此它的启动方法为:

# am start -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=8700(DDMS查询到的端口号,一般都是8700);

⑦连接成功后,按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函数入口处下断点了。

时间: 2024-11-05 13:42:38

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

Android逆向之动态调试so库JNI_Onload函数-----基于IDA实现

之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解论坛的该贴,我也是看了很多遍,自己也查了不少资料,但是自己动手的时候总觉比较繁琐,并且很多细节的地方没有注意到,按照那个帖子尝试了几遍但是却出现了错误(后面会提到),今天周末重新拾起来试了试,终于把遇到的问题给解决了,顺便做个记录以免忘记了,其中的一些细节我也不是太明白,忘知道的人给指出. 第一步.

记录一次安卓动态调试lib库

这道题是iscc 2017中的安卓第二题,所有的算法都在lib库中,而lib库又是加了壳的,所以就用动态调试解决吧.第一次动态调试安卓,就写的详细一些吧. 文中用到 1.能正常运行这个crackme的手机一部,需要root(本人手上的主力机是安卓7.1的就运行不了)2.IDA一个3.IDA神级插件Keypatch4.安卓调试adb5.python6.这个crackme 题目链接 链接:http://pan.baidu.com/s/1kVLYYOJ 密码:e2tj 解析 准备 首先在手机上安装这个

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

方法1: 1> 先用DeviceTree.exe查看指定的过滤驱动的Load Address(加载地址) 2> 再用LordPE.EXE查看指定过滤驱动文件的入口点地址 3> 计算过滤驱动的DriverEntry函数内存地址 DriverEntry函数内存地址 = Load Address + 入口点地址 例子: 1> Load Address = 0xFAABF000 2> 入口地址 = 0x3400 3> Windbg下断点 bu 0xFAABF000+0x3400

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

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

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

参考: https://my.oschina.net/ptk/blog/299464 1. 文件 tts.sublime-project 的配置如下: { "folders": [ { "path": "." } ], "settings": { "xdebug": { "url": "http://localhost", "port": 9004

【转】Android逆向之动态调试总结

一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆向分析> 简单说:在libsyclover.so文件中有一个函数jnicall1.每次单击按钮的时候,便会调用此函数. 1.静态载入此so文件,找到函数的偏移地址为:0x132C <ignore_js_op> 2.执行android_server3.端口转发 adb forward tcp:

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

0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试武器.因此,笔者将会在这一系列文章中分享一些自己经常用或原创的调试工具以及手段,希望能对国内移动安全的研究起到一些催化剂的作用. 目录如下: 安卓动态调试七种武器之长生剑 - Smali Instrumentation 安卓动态调试七种武器之孔雀翎 – Ida Pro 安卓动态调试七种武器之离别钩

IDA远程调试so库JNI_Onload函数

JNI_OnLoad函数大概功能就是在程序加载so的时候,会执行JNI_OnLoad函数,做一系列的准备工作.很多时候,程序猿们会将一些重要信息放在此函数中,而不是通过某种事件来重复触发.包括说将反调试函数放置在此函数中.因此,调试手段发生了改变,上述调试方法基本上被淘汰. 1.静态分析,找到JNI_OnLoad函数的偏移 2.执行android_server 3.端口转发 4. 以调试模式启动程序adb shell am start -D -n com.example.mytestcm/.Ma

背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能

背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介绍背景减法库(BGS Library)的基本框架与入口函数main()的功能. BGS库的整体框架在背景建模技术(二)中已经全部给出,此处从函数的角度再次给出BGS库的基本框架,有利于代码的修改与维护. 如下图所示是基于C++的BGS库的函数流程图: 接下来将会对每个函数进行更加详细的分析. 首先,