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/.MainActivity
此时,手机界面会出现Waiting For Debugger页面

5.打开ddms或者Eclipse (必要,为了使用jdb命令),获取应用程序的端口号

6.IDA附加

7.设置调试选项

8. F9运行程序

在命令行中执行:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700其中port=8700是从ddms中看到的。

此时程序会断下来

9.下断点,首地址加偏移,跟上一篇远程调试的方法一样

下好断点之后,直接F9运行吧,就能断在JNI_OnLoad函数处~

当这种调试手法出现之后,将特殊函数,或者反调试函数放在JNI_OnLoad中也不是那么的安全了。此时,程序猿们通过分析系统对SO文件的加载链接过程发现,JNI_OnLoad函数并不是最开始执行的。在JNI_OnLoad函数执行之前,还会执行init段和init_array中的一系列函数。

因此,现在的调试方法,都是将断点下在init_array中~
至于下断点的方法,可以类比于在JNI_OnLoad中下断点的方法,在init_array的函数中下断点。还有一种方法便是通过在linker模块中,通过对其中函数下断点,然后也能单步到init_array中

时间: 2024-10-12 23:39:38

IDA远程调试so库JNI_Onload函数的相关文章

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

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

IDA远程调试Android

IDA远程调试Android ADB 连接安卓设备.(不会ADB参考:http://www.cnblogs.com/ONDragon/p/6841787.html) 把IDA文件夹中dbgsrv目录下的android_server(作用:和IDA进行通信)文件push到手机的/data/local/tmp目录下,当然这个目录可以自己选. 然后在终端中adb shell登陆到手机的shell环境,获取root权限以后,chmod 655 android_server修改运行权限,然后运行它. 转发

IDA远程调试出现"The file can't be loaded by the debugger plugin."云云

看到网上都没有像样的解答,我把我的情况分享出来给大家 先说说我的需求:IDA远程调试linux程序,按照教程配置好后,F9启动出现“The file can't be loaded by the debugger plugin.”,然后网上搜,然后懵逼了. 我的环境配置win7 x64 sp1 IDA PRO6.8 金山泄露版 Linux是CentOS6.x 解决办法是 关闭linux防火墙 service iptables stop IDA远程调试出现"The file can't be lo

IDA远程调试 在内存中dump Dex文件

1. 首先使用调试JNI_OnLoad函数的方法,先将apk以调试状态挂起,使用IDA附加上去. 2. 然后在libdvm.so中的dvmDexFileOpenPartial函数上下一个断点 3. 然后我们点击继续运行,程序就会在dvmDexFileOpenPartial()这个函数处暂停,R0寄存器指向的地址就是dex文件在内存中的地址,R1寄存器就是dex文件的大小 4. 然后我们就可以使用ida的script command去dump内存中的dex文件了. static main(void

IDA 远程调试设置

第一步,先去 IDA   dbgsrv  这个目录下,找到要调试的那个远程计算机对应的可用客户端, 比如,android_server, 把它拷贝到目标计算机中, 比如 adb push .... 然后如果是特殊的系统,给它一个执行权限, 比如 adb shell , chmod 777 ... 然后运行它,它会监听一个端口, 23946 , 使用某些方法,让这个端口可以被我们的电脑访问, 比如 adb forward tcp:23946 tcp:23946 然后,就可以打开IDA,连接这个端口

IDA 远程调试 Android so

1.把ida 目录下android_server 传到android 目录中如:adb push  android_server /data/local/tmp/adb shell 进入模拟器cd /data/local/tmp/chmod 755 android_server./android_server看到监听端口 23946 2.在windows 控制台下转发window 到模拟器或者手机的端口adb forward tcp:23946 tcp:23946 3.ida 中选择androi

IDA 动态调试 ELF 文件

01  IDA 远程调试配置 Windows 下的 IDA 在 IDA 的安装目录/dbgsrc/找到 linux_server 和 linux_serverx64 拷贝到 linux 虚拟机中 在 linux 中运行 linux_server 并在 linux 中运行要调试的 demoDebugger -- Attach -- Remote Linux debbuger Linux 下的 IDA 配置方法和 Windows 相同 #!/bin/bash cd /home/ubuntu/IDA/

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

一般来说,很多APK的校验代码,都会在程序运行的时候自动加载一些动态so库,然后执行这些库中的校验代码.所以为了能够通过程序的校验,我们必须在执行这些函数之前下断点--理想的方法就是在JNI_OnLoad入口函数下断点. 在2.3.3模拟器中详细步骤如下: ①在控制台输入adb shell 进入手机,然后使用  am start -D -n 包名/类名,以等待调试的模式启动APK应用: 这里需要说明的是 "包名/类名"的书写方法: # am start -n {包(package)名}

MAC使用IDA PRO远程调试LINUX程序

1 背景 在学习Linux系统上的一些漏洞知识的时候,往往需要进行“实地测试”,但是在Linux系统上进行调试并不太方便,因为LINUX自带的GDB调试工具真的不太人性化,即使有GDBTUI之类的“伪图形界面调试器”,也跟IDA PRO之类的调试器相差甚远.这里又遇到另一个问题了——LINUX平台的IDA PRO不太好找. 综上,对于初学者而言最佳方案就是使用IDA PRO的远程调试功能! 2 环境配置 本文主要说明在MAC系统上如何通过IDA PRO对linux程序进行远程调试(如果宿主机为W