so动态调试 - CSDN
精华内容
参与话题
  • 在上一篇中讲到了关于Android so动态调试,没看的可以点这里:点击打开链接; 我自认为写的还是挺全的,在上文中我们说到关于最后一步jdb附加调试时,很多时候都会出现附加不上的问题,使人很闹心。。。于是这一篇...

     今天国庆的第六天,西安淅淅沥沥小雨下个不停,索性卧在床上不如品一杯西湖龙井,更新一篇博客,一来帮助需要之人;二来加深自己的理解。

    问题篇:

    在上一篇中讲到了关于Android so的动态调试,没看的可以点这里:点击打开链接

    我自认为写的还是挺全的,在上文中我们说到关于最后一步jdb附加调试时,很多时候都会出现附加不上的问题,使人很闹心。。。于是这一篇就是专门关于这个问题进行展开的。解决这个问题方法有很多,我是按照自己认为的优良答案顺序展开的,都是借鉴网上的各路大神而总结的。


    解决篇:

    根据android的官方文档,如果调试一个APK,必须满足以下两个条件中的任何一个:

    1.APK的AndroidManifest.xml文件中的Application标签包含android:debuggable="true";

    2./default.prop中的ro.debuggable的值为1;

    方法一:

    在已经root的手机安装Xposed框架和xinstaller插件

    目的:就是利用Xposed的HOOK插件xinstaller开启系统中所有应用的调试功能。

    使用方法:

    第一步:下载Xposed框架,并激活,再下载xinstaller插件安装;

    第二步:开启模块,点击xinstall插件设置专家模式,进入其他设置,开启调试应用,最后在xposed中激活重启,OK!!

    关于框架和xinstaller插件会放在附件中。


    方法二:

    修改android:debuggable="true"

    用AK反编译以后在AndroidManifest.xml文件中的Application标签中加入android:debuggable="true";然后回编译。

    这个方法虽然简单,但是问题多,比如:

    第一:有的反编译,签名验证等等。

    第二:如果说软件已经爱加密或加壳了,修改XML几乎是不可能的,因为改了也不能回包

    于是引入了方法三.


    方法三:

    如果我们在真机,则可以修改根目录下的default.prop文件,将里面的ro.debuggable =1。

    第一:  从Google官方网站下载到boot.img;
    第二:  使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop;
    第三:  修改default.prop;
    第四: 把修改后的文件重新打包成boot_new.img;
    第五: 使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img);


    优点是可以永远调试,不再担心此问题;

    缺点是我没有Nexus 5手机骂人,这个问题很严肃;于是引出了方法四。


    方法四:

    我们没有谷歌的亲儿子,但是我们有神器的小工具。

    首先我们看到如图所示ro.debuggable=0;


    init进程会解析这个default.prop文件,然后把这些属性信息解析到内存中,给所有app进行访问使用,所以在init进程的内存块中是存在这些属性值的,那么这时候我们可以利用进程注入技术,我们可以使用ptrace注入到init进程,然后修改内存中的这些属性值,只要init进程不重启的话,那么这些属性值就会起效。当然这个工具已经写好,我会放在后main附件中。

    解决方法:

    第一步:拷贝mprop 到/data/目录下;
    第二步:./mprop ro.debuggable 1;
    第三步:getprop ro.debuggable;(查看此时ro.debuggable在内存中的值)
    第四步:stop;start(重启adbd进程);


    注意:

    我们在上面的第三步的时候查看好像没有改过来,分析原因为:

    该工具是通过ptrace修改init进程中的内存,然而4.X系统强制开启了selinux;因此这个时候我们需要设置Selinux的状态.需要个APK,会放在后面的附件中。


    附件:点击打开链接


     


    展开全文
  • Android IDA So动态调试大法

    万次阅读 多人点赞 2019-03-28 19:59:56
    下面就说关于在IDA中Android so动态调试的问题以及在so的三个层次下断点的操作。 问题篇: 1.动态调试的作用以及与我们常说的脱壳区别之处? 2.IDA的下断点调试的原理? 3.有无反调试的步骤区别?以及原理? ...

         今天已是国庆的第五天,白天去武馆训练过后,晚上回来品一杯西湖龙井,更一篇博客,一来帮助需要之人,二来加深自己的理解。

    下面就说关于在IDA中Android so的动态调试的问题以及在so的三个层次下断点的操作。

    问题篇:

    1.动态调试的作用以及与我们常说的脱壳区别之处?

    2.IDA的下断点调试的原理?

    3.有无反调试的步骤区别?以及原理?

    4.反调试与反附加的区别?

    5.IDA动态调试so时有哪三个层次?以及如何下断点?

    注意:so的动态调试与脱壳在步骤上有很多的相似之处,关于脱壳在后面会详细介绍加壳以及脱壳的发展历程。

    解答原理篇:

    第一个问题

    曰:动态调试作用有二:

    其一:dump内存,即:找准时机dump出解密后的正确文件;

    其二:查看每一步状态,进一步分析出正确的逻辑;

    脱壳只是我们在调试系统级别的.so文件后 ,找准时机dump出正确而真实的.so文件,而动态调试只不过是手动脱壳的一种表现方式。

     

    第二个问题

    曰:(由于师哥说面试时喜欢问,此处列出来)

    下断点原理:

    由于下断点有硬件断点和软件断点,我们在这里只说IDA中的软件断点原理:

     X86系列处理器提供了一条专门用来支持调试的指令,即INT 3,这条指令的目的就是使CPU中断(break)到调试器,以供调试者对执行现场进行各种分析。

    当我们在IDA中对代码的某一行设置断点时,即:F2,调试器会先把这里的本来指令的第一个字节保存起来,然后写入一条INT 3指令,因为INT 3指令的机器码为11001100b(0xCC)当运行到这的时候CPU会捕获一条异常,转去处理异常,CPU会保留上上下文环境,然后中断到调试器,大多数调试器的做法是在被调试程序中断到调试器时,会先将所有断点位置被替换为INT 3的指令恢复成原来的指令,然后再把控制权交给用户。这样我们就可以愉快的开始调试了。如下图所示也是写调试器的原理图:

     

    第三个问题

    :先说无反调试:

    1.adb push d:\android_server(IDA的dbgsrv目录下)  /data/local/tmp/android_server(这个目录其实可以随便放,有的反调试会检测这)

    2.adb shell 

    3.su(一定要有root权限)

    4.cd /data/local/tmp

    5.chmod 777 android_server(执行权限要给)

    6.再开一个cmd
    adb forward tcp:23946 tcp:23946(端口转发,调试手机上的某个进程要有协议支持通信)

    7.打开待调试的应用程序,就可以愉快的调试了

     

     

    再来说有反调试:

    :在很多情况下我们遇到的是有反调试并且用上面的步骤,附加进去以后直接就退出了,这样的例子数不胜数,那就是反调试惹的货。

    这时候我们就要改变调试战略了

    在上文的基础上:

    1.启动android_server;

    2.端口转发adb forward tcp:23946 tcp:23946

    3.adb shell am start -D -n 包名/类名

    (说明:以启动模式启动,是停在加载so文件之前,报名在AndroidMainfest文件中可以找到)

    4.打开IDA,附加上对应的进程之后,设置IDA中的load so的时机,在debug options中设置一下,后面会有实战部分;

    5.adb forward tcp:8700 jdwp:进程号;(jdwp是后面jdb调试器的协议,转换到待调试的指定的应用程序);

    6.jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700(jdb进行附加);

    7.可以愉快的下断点,开始调试了;

     

    第四个问题

    :反调试就是阻止你进行动态调试所采用的一种手段,在下一篇中会进行具体的讲解反调试的手段,以及解决反调试的办法。

    反附加,在这块重要的是说jdb的反附加,很多情况下jdb会附加不上,就是会出现“无法附加到目标的VM”这样的问题那是因为在每个应用程序下,有这个android:debuggable="true"才能调试,因为篇幅问题,照样会在下一篇中会针对反附加寻找目前所有解决办法。

     

    第五个问题:

    曰:我们知道在so的加载时候有个这个过程:

    .init->->.init array->->JNI_Onload->->java_com_XXX;

    还有我们在脱壳的过程中会在一些系统级的.so中下断点比如:fopen,fget,dvmdexfileopen,等等

    而.init以及.init_array一般会作为壳的入口地方,那我们索性叫它外壳级的.so文件

    这里归纳为三类:

    应用级别的:java_com_XXX;

    外壳级别的:JNI_Onload,.init,.init_array;

    系统级别的:fopen,fget,dvmdexfileopen;

    对于在应用级别的和系统级别的就不说了比较简单容易理解,这里也是在实现篇中会重点说的,看到上面的.so的加载执行过程我们知道如果说反调试放在外壳级别的.so文件的话我们就会遇程序在应用级核心函数一下断点就退出的尴尬,事实上多数的反调试会放在这,那么过反调试就必须要在这些地方下断点,那么我们就重点的说如何在.init_array和JNI_Onload处理下断点。

     

    实现篇:

    这里我们会拿阿里有一年的比赛样本,会放在附件中。

    在JNI_Onload处下断点方法一:(双开定位)

    1.启动android_server;

    2.端口转发以及调试模式启动:如图所示:

    3.打开IDA,设置

    4.附加上对应的进程进去之后如图:

    5.这一步很重要在Debugger option下面选择这三个选项(让在load so的每个接口处停下来)

    6.jdwp协议端口转发

    7.jdb附加

    8.F9执行,忽略提示框;这时候运行到linker处,如图:

    9.这时候找JNI_Onload的绝对地址:

    基地址+相对地址;

    基地址为:ctrl+s显示为:

    相对地址,用IDA静态分析libcrack.so可得到相对地止:

    绝对地址为:4151E000+1B9C=4151FB9C

    按下“G”键输入4151FB9C

    如图所示:按下F2下好断点,再按F9执行到断点处就可以愉快的调试了

     

    在JNI_Onload处下断点方法二:(简单好用)

    1.首先把要分析的libcrackme.so文件拉进IDA里面在要下断点的JNI_Onload处下好断点如图所示:

    2.启动android_server与上面一样;

    3.端口转发以及调试模式启动:如图所示

    4.先设置一下Debugger 如图所示

    5.IDA进行附加进程回到之前静态分析libcrackme.so的IDA界面单击Debugger -> Process options 配置调试信息,这里只需配置hostname为localhost,其余的保持默认设置即可

    6.单击Debugger -> Attach to process进行附加进程

    7.jdwp转发(当然打开DDMS就不需要这一步了)jdb附加

    8.F9执行一路取消就OK,得到如图所示:

    是不是很简单??

     

    在.iniy_array处下断点(与上面方法二雷同)

    得到的结果是:

    OK,搞定


    在JNI_Onload处下断点方法三:(适合于脱壳的时候)

     

    1.可以根据看源码,对应不同版本的系统源码就会发现一点,如下在vm/Native.cpp路径下:

    2.我们逆向去看,首先把系统中的libdvm.so a db pull出来,拉到IDA中去分析;

    找到JNI_Onload处进行分析:F5可以看到,首先V20进行“JNI_Onload”符号查找,同时在V23有对V20的调用,

    回到ARM指令处可以看到如下:

    0x50008就是偏移处,这个时候我们就开始下断:

    加载上要调试的APK以后,找到libdvm.so的基址,然后加上50008,下断点。如果看不到汇编,那就P一下,下断点,这个比较适合于脱壳的时候。

     

    附件:点击打开链接

     

     

    展开全文
  • IDA动态调试逆向so库(各种坑)

    万次阅读 2017-03-08 10:20:55
    1.判断APK是否支持debuggble模式 方法一: 通过过APKKiLLer反编译工具查看 ,如果不是在application节点下去修改然后二次打包即可添加指令android:debuggable="true"  方法二 :通过aapt指令去查看aapt list -v -a...

    1.判断APK是否支持debuggble模式 

     方法一: 通过过APKKiLLer反编译工具查看 ,如果不是在application节点下去修改然后二次打包即可添加指令android:debuggable="true"
    

      这里写图片描述  

     方法二 :通过aapt指令去查看aapt list -v -a crackme1_killer.apk工具所在路径由下图所示,这条指令会打印出apk相关信息
    

    这里写图片描述

    这里写图片描述

    2. 搭建IDA调试android apk测试环境 

    1. 在IDA安装目录找到android_server文件 push到android目录中,修改android_server并文件读写权限,以root身份去运行android_server文件(必须要以root身份去运行,否则无法IDA无法获取android应用进程)
    

    这里写图片描述

    2. 执行指令 
        2.1 adb push androidserver /data/local/tmp/ 
        2.2 chmod 777 /data/local/tmp/android_server 执行权限否则会弹出下图框框,文件执行权限拒绝
    

    这里写图片描述

        2.3 /data/local/tmp/android_server 执行此文件 注意如果下图弹出 出现 bind: Address already in use 错误 这样的错误提示,说明原手机中android_server已经在执行中,找到进程直接干掉重新开启  
    

    干掉指令
    这里写图片描述

    重开成功标志,代表android_server执行中

    这里写图片描述

    2.3 adb forward tcp:23946 tcp:23946 IDA监听23946端口,PC段转发IDA监听端口,使IDA可以监听android系统进程 
    2.4 打开IDA,使IDA添加需要调试的android进程,
    

    这里写图片描述

    2.5 点击确认以后会弹出android系统进程列表 选中需要调试的进程即可,如果未弹出下图提示为出现的话,在output window窗口输出链接失败,无效之类的提示的话请尝试多次执行 IDA监听端口转移指令即可 
    

    这里写图片描述

    2.6 点击Debug-----> debug option 选中下图 
    

    这里写图片描述

    2.7 运行应用程序 开启IDA断点调试
    在执行下面这条指令,最好配置DDMS环境变量 ,在dos窗口输入ddms,弹出ddms窗口,弹出窗口以后经常会弹出ddms端口被占用的情况,解决方案是修改ddms窗口端口号最好,FILE --->Option
    

    这里写图片描述

    ddms 执行文件所在路径
    

    ddms 执行文件所在路径

    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8701,链接的ddms对应的端口,开始测试模式的应用,点击IDA下图 出现下图提示开启IDA调试模式成功
    

    这里写图片描述

    这里写图片描述

     选中需要调试的so库 下断点,F7 代表进入方法,F8代表向下执行,F9
     进入下一个断点,若无及退出程序 ,函数有个固定的执行顺序,
    

    这里写图片描述

    注意啊: 在调试so库的时候 先执行.init_array 其次 JNI_OnLoad
    ,在调试so库的很多时候要双开IDA 动静太结合的双调,因为IDA在编译的过程不能全部展示所要调用的函数,指针还有内存地址

    展开全文
  • 其实我一开始也调试过 但是不是那么清晰 这次亲手 调试了一波 并且看懂了so库的算法算是 比较好的了 不过遇到了几个坑点 写下来 记录一下 第一 就是 千万千万 好好看看 有没有 android:debuggable="true" 这句话...

    其实我一开始也调试过 但是不是那么清晰  这次亲手 调试了一波  并且看懂了so库的算法算是 比较好的了   不过遇到了几个坑点   写下来 记录一下

     

    第一 就是 

    千万千万  好好看看   有没有   android:debuggable="true"  这句话 没有的话 一定要加上

     

    第二 就是

    ida  里面的选项 如果arm /android 不行的话  就选择linux

     

    第三 就是 

    一开始附加 进程的时候 可能没有 so库  但是如果你 点击app 让它调用 so库的函数  就能找到 so库 

    我想 应该是 和dll 差不多   用到再 映射到内存 减少   损耗

     ida7.0 直接就把函数地址 算进去了  点击so库 直接就出现函数 点击函数 直接就能看到汇编 可以直接断点了

    然后 调试的时候  要小心 细心    感觉安卓 ida 调试还是比较好用的

    展开全文
  • so文件是unix的动态连接库,我们知道Android系统是类linux,所以这里也沿用其动态链接库so,一般用c语言实现,是二进制文件,作用相当于windows下的.dll文件,在Android中调用动态库文件(*.so)都是
  • 介绍IDA动态调试.so之前先说几个在调试过程中可能遇到的坑和相应的解决方法。 问题一:IDA在使用过程中,F5插件翻译C/C++代码,汇编时报 please position the cursor within a function。 解决方法:1.右键 create...
  • 之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结。 一、IDA常用快捷键总结 ...
  • android中SO文件动态调试

    千次阅读 2016-03-07 06:43:55
    0X00 前言 为了增加APK文件的破解难度,很多...使用ida实现so动态调试,可以在关键地方下断点,对于一些变换,比如有的时候输入的内容与经过一些列的变换后的结果比较,这个时候我们不需要关心中间的变换过程,
  • linux下.so动态调试

    千次阅读 2016-07-26 10:01:39
    linux 动态库使用方法
  • 环境配置 1、设置JDK环境变量后需要修改JEB的配置脚本jeb_wincon.bat rem Prefer a JDK over a JRE, which allows support for JEB native Java plugins if defined JAVA_HOME (set base=”d:\Program Files\Java...
  • IDA 动态调试SO

    2014-07-20 22:35:19
    1. adb shell am start -D -n com.phoenix.ldzj/com.phoenix.xingyu.Main 2. adb shell 3. su  ./data/android_server    adb forward tcp:23946 tcp:23946    启动IDA, 附加, 断点, F9 ...
  • 动态调试SO之在.init_array段下断点

    千次阅读 2015-03-12 20:04:02
    动态调试SO之在.init_array段下断点  
  • ida动态调试so层反调试入门篇

    千次阅读 2017-04-21 00:12:52
    前期准备 第一步 准备好一部root过的安卓手机 第二步 将android_server push到 /data/local/tmp下 adb push android_server /data/loacal/tmp 然后给android_server...正式开始动态调试 第一步 先以静态方式启
  • so中就做一个加法运算,代码逻辑如下:   然后这样调用:   在IDA中查看代码的相对地址是BBC   然后执行androidserver端口转发   及   然后在启动另一个ida       到上面这一步双击自己...
  • IDA动态调试so

    千次阅读 2017-05-13 14:10:25
    IDA是一个可以用来反编译so、dll、exe、sys等文件,不过IDA无法直接修改汇编代码,这个相对于Ollydbg来说是一个不足的地方,不过它可以通过修改hex代码来修改指令。下面是关于IDA调试android so的介绍  IDA调试so...
  • so动态调试(阿里脱壳)

    千次阅读 2016-07-20 19:11:20
    安卓APP在运行时,每个进程都有单独的进程空间,这是因为每个进程都独有一个Davlik虚拟机。系统启动时会先启动init进程,init进程会启动zygote进程,该进程会为每个要启动的App进程孵化出一个Davlik虚拟机实例....
  • 大概说一些 gdb + gdbserver 在Android 下进行动态调试so的步骤: 准备工作: 1、找到 gdbserver 并 发送到手机里,gdbserver 的位置一般在NDK 目录下的 prebuilt 文件夹内,prebuilt 文件夹内包含各种CPU下的文件...
  • 一、前言最近萌发了一个做app的念头,大致什么样的app先暂时不说,后面会详细介绍这个app的开发流程和架构,不过先要解决一些技术前提问题,技术问题就是需要分析解密当前短视频四小龙:抖音,火山,秒拍,快手这四...
  • 防止so注入加动态调试

    千次阅读 2019-01-31 15:26:59
    放到Application的oncreate里 //非Debug 编译,反调试检测  if(!BuildConfig.DEBUG) {  if(isDebuggable()) {  exit(0);  }  Thread t = new Thread(new Runnable() { ...
  • Android逆向-.so文件动态调试步骤

    千次阅读 2018-07-07 03:49:07
    1、安装目标apk和把android_server(在IDA的dbgsrv目录下 )放到/data目录下,注意要给data和android_server文件赋予相应的权限: chmod 777 <文件名> 2、运行android_server: ...
1 2 3 4 5 ... 20
收藏数 111,482
精华内容 44,592
热门标签
关键字:

so动态调试