动态调试android_android so 动态调试 - CSDN
  • Android逆向系列之动态调试

    万次阅读 2016-06-04 17:22:57
    Android逆向系列之动态调试(七)–IDA调试so文件(下) 《Android逆向系列之动态调试(零)–入门篇》 《Android逆向系列之动态调试(一)–Smali注入》 《Android逆向系列之动态调试(二)–Eclipse调试apk》 ...

    Android逆向系列之动态调试(七)–IDA调试so文件(下)

    111111111


    《Android逆向系列之动态调试(零)–入门篇》
    《Android逆向系列之动态调试(一)–Smali注入》
    《Android逆向系列之动态调试(二)–Eclipse调试apk》
    《Android逆向系列之动态调试(三)–IDA调试dex》
    《Android逆向系列之动态调试(四)–代码注入(JDB调试)》
    《Android逆向系列之动态调试(五)–gdb调试》
    《Android逆向系列之动态调试(六)–IDA调试so文件》
    《Android逆向系列之动态调试(七)–IDA调试so文件(下)》

    一、环境准备
    工具详见<工具篇>、破解的apk demo: Alictf2014_2.APK(反调试)、apktool

    上一篇文章是讲解了IDA在无反调试的情况下调试so文件,这一篇文章自然就是解决在有反调试的情况下,如何使用IDA调试so文件,下一篇文章将会讲解dump dex的方法,敬请关注!

    二、调试准备
    1、同样的老操作,确保XML里的android:debuggable=”true”,不懂的参考前面的文章
    2.以调试模式运行apk,命令: adb shell am start -D -n 包名/类名 (包名类名获取方式请参考文章)
    adb shell am start -D -n com.yaotong.crackme/.MainActivity ,出现下图说明启动成功:
    等待调试

    3.IDA–attach
    adb shell android_server
    adb forward tcp:23946 tcp:23946
    启动IDA–>debugger–>attach–>remote xxxxx–>填localhost–>ok–>选择对应进程
    以上步骤不完整,具体请参考上一篇文章《Android逆向系列之动态调试(六)–IDA调试so文件》

    配置debugger: Debugger — Debugger Options–>勾选如下图的勾:
    ida配置

    4.jdb–attach
    先打开DDMS
    F9运行程序
    然后再cmd下输入: jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    jdb成功

    问题分析:jdb出现致命错误,无法附加到目标 VM
    问题解决:
    打开DDMS,然后选中相应的进程,重新输入jdb命令;如果不行,重新检查是否有android:debuggable=”true”属性;

    问题分析:出现如图:
    找不到文件
    问题解决:直接点取消即可,另一弹窗也点取消,最终程序会断在linker断即正确。

    5.下断点–触发断点
    定位函数的方法:绝对地址=基地址+偏移地址
    具体方法请查看上一篇文章

    这里触发断点的方式为:点击运行按钮或者是按F9
    接着就可以动态调试F7或者F8里

    6.程序破解
    这里F8跟踪程序,每次调试到BLX R7;便退出,说明这里有问题,我们查看一下寄存器,发现是一个pthread_create函数,说明,反调试在这里开启一个线程,然后不断地做轮询,主要的原理是判断TrackerPid字段值是否等于0,由于如果存在调试,TrackerPid就不为0,因此可以用作反调试;要破解也简单,我们只要把这里的调用函数给Nop掉即可。
    JNI

    使用二进制编辑器,将BLX R7 nop掉,首先找到其对应的地址,这里可以再打开另一个ida去找到对应的地址。
    nop

    然后使用apktool回编译,签名、安装即可进行正常的调试。

    三、小结
    执行android_server
    端口转发 adb forward tcp:23946 tcp:23946
    调试模式启动程序 adb shell am start -D -n 包名/类名
    IDA附加
    静态找到目标函数对应所在模块的偏移地址
    Ctrl+S找到对应模块的基地址,两个地址相加得到最终地址
    G跳转至地址,然后下断点
    F9运行
    执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    断下,进行调试

    参考资料:
    http://m.blog.csdn.net/article/details?plg_nld=1&id=51500328&plg_auth=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_dev=1
    Android逆向之动态调试总结

    展开全文
  • IDA动态调试Android的DEX文件

    千次阅读 2016-08-27 21:40:40
    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下。   IDA 6.6新添加了对dex文件的调试支持,但是功能还是很弱的说,...

    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下。

     

    IDA 6.6新添加了对dex文件的调试支持,但是功能还是很弱的说,因为IDA动态调试Android程序的DEX文件时,查看变量很不方便,可以说然并卵。

     

    @根据android的官方文档,如果要调试一个App里面的dex代码,必须满足以下两个条件中的任何一个:
    1.App的AndroidManifest.xm中Application标签必选包含属性android:debuggable="true"
    2./default.propro.debuggable的值为1;


    由于正常的软件发布时都不会把android:debuggable设置为true,所以要达成条件1,需要对app进行重新打包,这不仅每次分析一个App都重复操作,而且很多软件会对自身进行校验,重打包后执行会被检测到,所以想办法满足第2个条件是个一劳永逸的办法,我实际使用的方法就是满足第二个条件。

    由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk重新刷到设备中

    测试使用的设备为Nexus 7,修改步骤如下:
    a)  从Google官方网站下载到boot.img,
    b)  使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop
    c)  修改default.prop
    d)  把修改后的文件重新打包成boot_new.img

    e)  使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img)




    图1 修改后的default.prop内容

    说明:上面这段话引用自http://bbs.pediy.com/showthread.php?p=1291716大神的。

     

    其实,对于第2个条件有一个简单的方法,在网上找个靠谱的刷机助手软件,然后下载刷机助手中提供的供开发者使用的ROM版本,刷到Android的测试手机上就可以了。博主就是这么做的,之前费了好大的劲从网上找教程,但是由于Linux系统不熟悉,尝试几次都失败了,后来就是用这个办法解决问题的。因此,博主的Nexus 4手机的/default.propro.debuggable的值为1,符合Android程序的DEX文件的被动态调试的条件。


    工具:

    谷歌Nexus 4

    IDA Pro 6.6

    Eclipse

     

    0x1,将Nexus 4手机开启开发者USB调试模式连接到电脑上。连接成功以后,打开Eclipse程序,查看Nexus 4手机的设备序号,如图:




    从图中,可以得知Nexus 4手机的设备序号为03aae257437d8244,将这个设备序号记下来,后面调试Android程序的DEX文件时要用到,然后关闭Eclipse程序

     

    0x2,Cmd命令行情况下,安装要调试的apk程序到手机上。




    0x3,IDA 6.6的设置。

    1.用IDA 6.6打开apk文件,选择dex文件进行加载;

    2.设置debugger选项,Debugger->Debugger options->Set specific options按如下图所示进行设置,然后确定返回;

    Debugger->Process Options其他默认不变,端口这里改为8700

    3.找到在感兴趣的函数要下断点的位置,光标移到要下断点的那一行,按F2下断点;












    4.选中IDA Pro 6.6窗口,按F9运行,如果出现下图的画面并且手机屏幕出现"Waiting For Debugger"界面就说明设置成功,可以进行动态调试了。




    注意:如果运行过程中一直显示下图所示窗口,就需要关注一下手机上的屏幕界面,看是否是需要与用户进行交互了。




    5.当IDA中断在了我们设置断点的地方,这时选中ida->debugger->use source level debugging(源码水平调试),然后点击ida->debugger->debugger windows->locals打开局部变量窗口,就可以产看变量的值了。尽管如此,IDA动态调试Android程序的Dex文件时,变量的查看不是很方便。




    说了那多,IDA调试Android程序的DEX文件就是这么简单。

     

    参考博文的网址:

    http://bbs.pediy.com/showthread.php?p=1291716

    http://www.cnblogs.com/goodhacker/p/4257433.html

    http://drops.wooyun.org/?p=5942&preview=true



    文档的下载的地址:http://download.csdn.net/detail/qq1084283172/9201921




    展开全文
  • IDA Pro动态调试Android so文件

    千次阅读 2016-03-27 13:10:38
    使用apktool或者Android Killer反编译apk,在androidmanifest.xml添加以下代码将程序设置为可调试模式 …  android:debuggable=“true”> (不这样做的话在DDMS里就看不到进程信息) 重新打包编译签名 adb ...

    网上的教程坑太多,记录一下

    使用apktool或者Android Killer反编译apk,在androidmanifest.xml添加以下代码将程序设置为可调试模式

    <application

        android:debuggable=“true”>

    (不这样做的话在DDMS里就看不到进程信息)

    重新打包编译签名

    adb install xxx.apk

    adb push android_server /data/local/tmp/android_server

    adb shell

    su

    cd /data/local/tmp

    ./android_server

    adb forward tcp:23946 tcp:23946

    adb shell am start -D -n com.yaotong.crackme/.MainActivity

    在IDA Pro里

    Debugger->Attach->Remote ARMLinux/Android Debugger

    Hostname填手机局域网ip    Port填23946

    Debugger setup勾上

    Suspend on thread start/exit

    Suspend on library load/unload

    Suspend on debugging message

    OK

    在module list找到要crack的so

    根据静态分析的地址加上so的基址

    在关键位置下断点 init init.arry JNI_Onload

    打开DDMS(必须)

    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

    开始debug


    原文地址: https://sweetll.me/2016/02/ida-pro%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95android-so%E6%96%87%E4%BB%B6/

    展开全文
  • 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一下,下断点,这个比较适合于脱壳的时候。

     

    附件:点击打开链接

     

     

    展开全文
  • 动态分析Android App之动态调试

    千次阅读 多人点赞 2019-09-07 17:14:11
    这个系列一共有五篇左右,内容主要介绍如何动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,希望能给刚入门Android逆向的同侪们些微帮助。 出于各种...
  • 前提条件和运行环境一定要写清楚,不然会有很多坑,坑死人。 (1)IDA 是最新的7.0版本 (2) JDB 使用Java安装目录...2.复制IDA 安装目录下dbgsrv 文件里面的android_server文件到 手机内存储的 /data/local/tmp 目录...
  • Android动态调试--jeb调试apk

    万次阅读 2017-10-20 22:16:22
    在jeb2及以上版本新增了动态调试的功能,个人觉得比AndroidStudio操作起来简单许多,而且可以边查看伪代码边调试smali,对于像我这样不太了解smali的新手提供了很大便利。 将apk安装在模拟器或真机中adb install ...
  • 一定要打开ddms,否则调试端口是关闭的,就无法在程序刚开始的暂停了。我之前不知道要打开ddms才能用jdb,还以为android系统或者sdk出问题了,重装好几次。汗。 我遇到好几次打开ddms会报错:Could not open ...
  • so文件是unix的动态连接库,我们知道Android系统是类linux,所以这里也沿用其动态链接库so,一般用c语言实现,是二进制文件,作用相当于windows下的.dll文件,在Android中调用动态库文件(*.so)都是
  • 大概说一些 gdb + gdbserver 在Android 下进行动态调试so的步骤: 准备工作: 1、找到 gdbserver 并 发送到手机里,gdbserver 的位置一般在NDK 目录下的 prebuilt 文件夹内,prebuilt 文件夹内包含各种CPU下的文件...
  • Android Studio动态调试smali

    千次阅读 2018-09-16 14:24:15
    之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态...
  • Android防止被动态调试的解决方法

    千次阅读 2020-05-11 17:47:23
    1、判断要是BuildConfig.DEBUG为false,但AndroidManifest却声明为debuggable,可认为是被动态调试调试状态,强制退出 2、定时轮询,判断在BuildConfig.DEBUG为false时,是否有调试器连接,如果有,可认为是被动态...
  • 动态调试android, ddms&ida

    千次阅读 2015-07-16 19:15:45
    Android NDK R8提供四套运行时环境来支持c++特性: System, gabi++, stlport, gnustl Gnustl支持 C++exceptions, C++ RTTI, ...动态调试: 1. 手动添加log.v() 2. 栈跟踪 new Exception(“print trace”)
  • IDA动态调试Android进程的so模块

    千次阅读 2016-11-04 14:20:26
    分析一个android应用时,核心算法代码大部分都在so库中,除了使用IDA静态分析,还需要通过动态调试来获取执行流程以及中间数据。这里记录的是使用IDA进行调试的方法,相比而言,IDA动态调试时不能看到浮点寄存器的...
  • Android应用安全与校验之反动态调试

    千次阅读 2017-03-16 21:45:19
    是不是有很多初学者认为没有拿到源码就不可以调试Android应用了?不是这样子的。只要通过反编译拿到smali代码工程,再加上smalidea调试神器,分分钟就可以在Android Studio中调试应用。即便核心代码被放到了JNI层,...
  • 安卓APP动态调试技术

    千次阅读 2016-01-19 16:51:13
    0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域。越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ、游戏、导航地图、微博、微信、手机支付等等,尤其2015年春节期间各大厂商推出...
  • Android平台IDA so调试环境搭建

    千次阅读 2017-02-25 16:21:37
    IDA Pro软件6.1以上的版本支持调试Android平台下原生程序,相对于GDB,Android平台下IDA动态调试的优势非常明显,业界内Android平台逆向绝大部分使用IDA进行动态调试。IDA调试Android平台Natvie程序的优势集中于:...
  • AndroidStudio动态调试smali

    千次阅读 2019-01-25 10:09:14
    AndroidStudio动态调试smali配置操作稍微有些繁琐,为了加深印象,同时方便日后翻阅查询,所以有了这篇博客。 1、环境与工具 AndroidStudio V3.2beta1 smaliidea——AndroidStudio插件 链接:https://p...
  • Android gdb 调试

    千次阅读 2015-11-12 21:52:13
    其实抛开android 应用环境,Gdb 本身就是个神迹。 Gdb作用: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当...
1 2 3 4 5 ... 20
收藏数 174,740
精华内容 69,896
关键字:

动态调试android