精华内容
下载资源
问答
  • 动态调试
    2022-05-26 13:12:24

    选用某ctf题目的apk作为调试目标。

    工具:

    雷电模拟器

    jadx1.3.2

    步骤:

    1、在雷电模拟器安装apk:

    2、在jadx打开apk:

    3、检查模拟器的adb服务状态:

    必须确保模拟器里的adb服务启动,且状态正常,不然后续调试无法进行。

    adb服务出现问题,可根据错误提示搜索解决方法,这里就不一一举例了。

    4、在jadx中选择要调试的进程

    打开jadx的调试进程选择窗口:

    找到要调试的apk对应的进程并双击:

     双击后,会自动进入调试界面。

    5、在调试界面进行调试:

    先在代码选项卡,找到要下断点的java语句:

    再切换到smali选项卡,会看到,已自动定位到java语句对应的smali语句,按F2在该smali语句下断点:

     点击下面的运行按钮让apk的进程运行起来:

     之后,在模拟器里,点击app的按钮,就会中断在断点处:

    可以看到,上面是代码窗口,下面的左边是调用路径,下面的右边是变量窗口。

    接下来就可以使用单步等按钮进行调试分析了。

    更多相关内容
  • 在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能。 如上图,我封装的类CSharpProvider很...
  • Android 反动态调试

    2019-05-07 19:58:29
    Android 检查动态调试 最近项目中,三方安全报告中一直存在动态调试检测的高危漏洞。经过多次探索研究,参考了网上不少示例,集大家所成,研究在Android studio 3.0以上,可以使用的示例代码。
  • Android 如何动态调试进行检查 最近项目在进行三方安全报告中一直存在很多动态调试检测的高危漏洞。经过多次研究及测试,也参考了网上不少的示例,集大家精髓所成,测试在Android studio 3.0以上,可以使用的示例...
  • Android动态调试逆向反编译smaliAndroid动态调试逆向反编译smaliAndroid动态调试逆向反编译smali
  • IDA动态调试

    2020-12-01 22:01:34
    Android中使用IDA调试so来apk
  • AndroidSo动态调试.zip

    2020-06-08 17:01:11
    Android So动态调试大法, 此为blog里的例子,包含图片、pdf 以及apk程序,为逆向初学者提供很大的帮助!!!
  • Android逆向动态调试

    2020-05-19 21:12:25
    Android逆向动态调试思维导图,便捷整理思路,反编译、AS配置、以调试模式启动、IDEA调试命令
  • ida_pro7.5动态调试so库

    2022-06-21 15:20:37
    ida_pro7.5动态调试so库,ida pro 7.5
  • 有时候想更了解别人App的调用流程,就需要在App运行的时候进行动态调试动态调试指的是将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等。 下面话不多说了,来随着小编一起看看详细的...
  • App动态调试这也太详细了
  • 动态调试工具ollydbg

    2019-05-05 10:15:09
    强大的逆向动态调试工具,可在程序运行过程分析内存、寄存器等信息,此为2.01版本,解压密码xx123
  • 动态调试日志 假设您正在使用util.debuglog编写调试语句(如您应该的那样),并且希望可以挂接到process.env.NODE_DEBUG来动态地打开和关闭它们,而无需重新启动进程。 这样可以做到这一点。 也许您的应用程序中有...
  • JEB动态调试

    千次阅读 2020-10-21 11:33:29
    往期推荐 Method Profiling ...动态调试有两种方法:Jeb调试和AndroidStudio+smalidea插件动态调试。 一:JEB工具介绍 JEB是一款功能强大的为安全专业人士设计的Android、应用程序反编译工具。用于逆向工程

    往期推荐

    Method Profiling

    方法栈跟踪

    Log插桩调试smali代码

    DDMS工具使用

    调试逆向分为动态分析技术和静态分析技术。静态分析技术是指破解者利用反汇编工具将二进制的可执行文件翻译成汇编代码,通过对代码的分析来破解软件;而动态调试则是指破解者利用调试器跟踪软件的运行,寻求破解的途径。
    动态调试有两种方法:Jeb调试和AndroidStudio+smalidea插件动态调试。

    一:JEB工具介绍

    JEB是一款功能强大的为安全专业人士设计的Android、应用程序反编译工具。用于逆向工程或审计APK文件,可以提高效率减少许多工程师的分析时间。

    首先下载JEB工具,下载完成后解压安装包, 解压后运行安装目录下的jeb_wincon.bat文件。

    本次以“zhuceji.apk”文件作为案例,再下载“zhuceji.apk”文件,打开雷电模拟器安装该APK,点击运行。弹出两个编辑框“用户名”和“注册码” 以及一个注册按钮,如下图所示。

    在这里插入图片描述

    打开JEB工具,将该“zhuceji.apk”文件拖入“项目”窗口,自动开始反编译。反编译完成后,包含以下4项信息,如下图所示:

    Manifest:配置文件
    Bytecode:字节码
    Certificate:证书
    Resources:资源文件

    在这里插入图片描述

    探究:如果无法打开JEB工具怎么办?

    简单来讲,就是检查JDK环境变量,是否配置JAVA_HOME。具体可以查看JDK环境配置教程。

    接下来双击“Bytecode”,右侧打开了两个窗口,工程目录(Bytecode/Hierarchy)和反汇编窗口(Bytecode/Disassembly),如下图所示。

    在这里插入图片描述

    为了方便后面的静态分析和动态调试,通过拖拽窗口的方式,调整UI界面。在工程目录(Bytecode/Hierarchy)中双击指定的文件,就会跳转到反汇编窗口(Bytecode/Disassembly)里面smali代码对应的位置。

    比如这里选中“MainActivity”双击则会跳转到对应的位置,也可以直接双击指定字段或者方法跳转到对应的位置,如下图所示。

    在这里插入图片描述

    二:逆向分析JAVA代码

    为了方便操作,平时都会使用快捷键,在这里介绍两个快捷键:

    1.快捷键Q:将定位到的smali转换为伪代码。具体操作就是在工程目录中,单击选中“MainActivity”文件按“Q”即可。
    2.快捷键Ctrl+B:在Smali中鼠标单击选中行后添加断点,再按一次取消断点。

    在做JEB的动态调试前,必须先静态分析APP执行流程。

    在工程目录中,选中“MainActivity”文件按“Q”将smali转换为伪代码,然后找到它的onCreate函数,这个函数的作用就是初始化当前代码绑定的一些事件,如下图所示,分析的这个”注册”按钮的点击事件。

    在这里插入图片描述

    这个onClick函数就是我们需要分析的“点击事件”,紧接着就是一个if判断,可以看到“edit_username”,它获取到了我们账号编辑框里的内容以及注册码的内容,接着调用了当前类里面的一个checkSN这个方法,我们看这个方法实现了那些功能,如下图所示。

    在这里插入图片描述

    然后直接双击checkSN这个方法就会跳转到对应的实现位置,如下图所示。

    在这里插入图片描述

    在这里可以看到账号和注册码传递进来,首先判断账号是否为空(null),如果为空,就return返回一个false,方法执行结束;不为空,继续执行。

    再判断账号的长度是否为0 ,如果长度为0,就return返回一个false,方法执行结束;不为0,继续执行。
    最后判断注册码是否为空(null)以及它的长度是否为16。如果为空或不为16,就return返回一个false,执行结束。不为空且长度为16,继续执行。
    将传进来的账号进行MD5运算,里面还有一个for循环一直对运算的结果进行一个拼接,每次+2。拼接完成以后还调

    equalsIgnoreCase进行了一个比较,如果该方法的返回值为false ,就说明输入的注册码错误,反之,返回值为true,就说明注册码是正确的。

    三:Jeb动态调试

    Jeb动态调试有两种方式:
    一种是普通模式调试,另外一种是debug模式启动程序调试。

    1.普通模式调试

    (1)在smali代码中找到checkSN方法,鼠标点击该方法的第一条指令,
    按快捷键Ctrl+B设置断点,如下图所示。

    在这里插入图片描述

    (2)运行设备上被调试的应用,这节课里也是“zhuceji.apk”,再点击菜单栏上“Debugger”选项下的“Start”按钮开始调试,如下图所示。

    在这里插入图片描述

    (3)点击”start”按钮后,会弹出一个弹窗,在这里点击“确定”按钮,如下图所示。

    在这里插入图片描述

    (4)之后就会弹出一个“Attach”窗口:
    Machines/Devices:选中要调试设备,即设备名称。
    Processes:选中要调试的应用程序对应的进程,即Flags为D的进程,也就是进程列表,可通过点击Flags 排序的方式快速选中。点击下“attach”按钮开始调试,如下图所示。

    在这里插入图片描述

    (5)点击“attach”附加成功后,可以看到调试界面中有增加的窗口,如下图所示。
    VM/Threads 是线程窗口。
    VM/Breakpoints 是查看断点窗口。
    VM/Locals是寄存器窗口,使用它查看对应寄存器的值,但是上排的工具还是灰色无法使用。

    在这里插入图片描述

    (6)再次打开“zhuceji.apk”,分别输入“用户名”为“易锦大学”,“注册码”为“1234567890123456”,用户名和注册码可以自拟,如下图所示。

    此时点击“注册”按钮,程序就会在我们设置断点的位置断下来,如下图所示。

    在这里插入图片描述

    查看是否断点成功,下段点的位置变为深蓝色,这就表示成功断下。寄存器窗口,显示当前寄存器的信息。如下图所示。

    在这里插入图片描述

    这时,上排灰色的图标会变亮,这些图标是JEB调试的常用功能,如下图所示。
    绿色三角:恢复程序运行。
    红色正方形:结束调试。
    后面四个黄色的箭头依次分别为:单步步入、单步步过、返回、运行到光标所在位置。

    在这里插入图片描述

    通过之前的分析,我们知道checkSN方法会对我们输入的“用户名”和“注册码”进行一系列的判断:判断账号不是不为空(null),判断账号的长度不为0 ,判断注册码的不为空(null)且长度为16。如果均满足条件,然后就会对我们输入的用户名进行MD5运算,获取摘要信息。将MD5后的摘要信息转换为字符串存放在v3寄存器里面 。要查看v3寄存器里面存放的字符串内容,需要修改它的数据类型,将int类型改为string类型。v3寄存器存放的字符串长度为32,对这个字符串进行处理,如下图所示。

    注意:查看完寄存器的值后记得把它的数据类型改回int类型,否则程序会崩溃。

    在这里插入图片描述

    这里看到他加密出来的值为:“2693cd1ae58a54a161599de9130fa864”,把这个值传递进去,进行一个for循环,看到这里就是循环 v4的值每次都加2,然后goto到68这个位置,判断是否取这个32位的循环,取完后会在0000007c这个位置进行一个比较,最后把运行取值存放在v6寄存器中,这里需要转换为string类型,后面的“200c5d8e953336bd”就是正确的注册码。

    注意:jeb反编译中的smali代码和androidkiller 反编译的smali代码的格式区别

    通过以上的调试,得出正确的注册码为:“200c5d8e953336bd”,如下图所示。

    在这里插入图片描述

    现在把这个字符串输入到注册码编辑框里面,点击“注册”按钮,提示“注册成功”,如下图所示。

    在这里插入图片描述

    2. debug模式调试

    debug模式调试和普通模式调试区别在哪里?在程序启动过程中,程序入口界面和入口点里的函数执行时机非常早。要调试此类函数,就需要使用debug模式启动。

    首先打开雷电模拟器,保证需要调试的apk已经安装。在cmd里面输入adb shell am start -D -n 应用程序包名/应用程序入口界面,回车执行该命令,如下图所示。

    在这里插入图片描述

    我们可以看到模拟器弹出了一个弹窗,等待被调试,如下图所示。

    在这里插入图片描述

    在onCreate方法打一个断点,设置断点的方法和普通模式相同。点击菜单栏“Debugger”选项下的“Start”按钮开始调试,如下图所示。

    在这里插入图片描述

    附加成功后,可以看到成功在onCreate方法断下,如下图所示。

    在这里插入图片描述

    既然断点设置成功,就说明我们同样可以采用“debug”模式进行调试,也可以得到和普通模式一样的结果,步骤一样就不再重复。

    小结;

    本次主要分享Jeb动态调试相关内容:

    1.调试快捷键:
    “Q”→ 将smali转换为伪代码
    “Ctrl+B”→设置断点

    2.普通模式调试的步骤:
    (1)找到checkSN方法 ,Ctrl+B设置断点。
    (2)运行被调试的应用,点“Debugger”选项下的“Start”按钮开始调试。
    (3)点击弹窗里“确定”按钮。
    (4)点击“Attach”窗口下方的“attach”按钮开始调试
    (5)输入“用户名”“注册码”,点击“注册”按钮,程序会在设置断点的位置断下来了。
    (6)分析调试得到正确的“注册码”。

    3.debug模式调试的命令:
    adb shell am start -D -n 应用程序包名/应用程序入口界面。

    今天的内容到这人就已经分享完成了,喜欢就点个关注呗,给博主一点动力啊

    如果你也对安卓逆向感兴趣。可以加下方的群,大家一起讨论问题,或者扫描下方二维码,关注回复 “安卓逆向” 获取免费教程

    安卓逆向交流学习:1139349849
    vx:Yjxiaox

    在这里插入图片描述

    展开全文
  • Smali动态调试:包含脚本、工具及具体操作文档。 1.反编译apk 2.回编译apk 3.对apk重新签名(生成修改过的可安装apk) 4.输出src(smali文件便于调试)
  • 动态分析Android App之动态调试

    万次阅读 多人点赞 2019-08-24 18:36:38
    动态分析Android App之动态调试 这个系列一共有五篇左右,内容主要介绍如何动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,希望能给刚入门Android...

    这个系列一共有五篇左右,内容主要介绍如何在Java层动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出
    闻道有先后,术业有专攻,希望能给刚入门Android逆向的同侪们些微帮助。出于各种原因,文章有两个遗憾,一是只包含了Java层代码的动态分析和调试,Jni和Native层并没有涉及;二是对Hook框架的介绍和使用不是很充分,因为Hook值得另外很多个五篇去写。逆向太深太广了,吾辈将上下而求索。

    本篇内容所涉及到的资源
    链接:https://pan.baidu.com/s/14ZF-7pop4NbrDPydtRQOeg
    提取码:8fs8

    一、认识动态分析Android程序

    我们将需要运行应用程序才能实施和完成的分析方法统称为动态分析方法,不要被这个名词吓到了,抓包、动态调试、观察App页面的UI设计和交互、使用Xposed/Frida Hook App中某个函数、Smali插桩等等,这些都可以称为动态分析,有时候我们也会认为Smali插桩是一种静态的技术,但这里不用过分区分和计较,我们最应该关注的是技术和思路。
    这个系列会逐一讲解和介绍这些动态分析工具的使用,为了防止我讲的不够清楚,每一个知识点和技术都会配上数篇详细可靠的同类型文章。当然,你也可以直接Google获取这些知识,但需要稍加甄别搜索到的内容。我们第一篇说一下Smali动态调试。

    1.1 什么是Smali动态调试?

    调试分为源码级调试和反汇编级别调试,源码级调试是什么自然不用说,程序员大多都使用过诸如Pycharm这样的IDE对自己的程序进行过源码级调试,从而了解程序运行情况,分析程序的执行流程,观察变量的动态值等。而我们进行逆向分析时,手里不可能有App的源码,这就需要进行反汇编级的调试,也就是我们常说的的Smali动态调试。

    当我学习Smali时,产生过各种各样的困惑,smali是什么?我写的是java代码,怎么变成smali了?为什么可以smali代码可以调试?Jadx反编译出来的java代码如此优雅,能不能根据这些代码进行源码级调试?
    我们一一来探讨这些问题。

    从Java源码到编译打包成APK文件,会经过非常复杂和繁多的步骤,我们这里只关注代码的编译过程。

    Android平台上主要使用Java语言来开发程序,但Android上的程序运行机制和标准的Java程序并不一样。
    我们先看一下Java程序从编写到执行的过程

    第一步:编写Java代码
    第二步:所有的Java代码通过Java编译器被编译成java字节码,即.class文件
    第三步:Java字节码在Java虚拟机上被解释成机器语言后,程序执行
    

    在这里插入图片描述
    手机系统内存和处理器速度有限,为了解决运行效率的问题,以及摆脱和Java母公司的版权纠纷,Google开发了Dalvik虚拟机,Android程序就运行在其上,我们来看一下App中Java代码的编译过程。

    第一步:编写Java代码
    第二步:所有的Java代码通过Java编译器(javac)被编译成Java字节码,即.class文件
    第三步:Java字节码通过Android 的dx工具转换为Dalvik字节码,即.dex文件
    第四步:Dalvik字节码在Dalvik虚拟机上运行
    

    在这里插入图片描述
    现在我们已经知道解压Apk后,那些奇怪的dex是哪来的了,那Smali又是哪来的呢?
    我们看一下Smali代码长啥样
    在这里插入图片描述
    首先澄清一下这两个概念

    反汇编:将可执行的文件中的二进制经过分析转变为汇编程序。
    反编译:将可执行的程序经过分析转变为高级语言的源代码格式,一般完全的转换不太可能,因为有编译器的优化等因素在里面。

    各种各样反编译工具几乎都用到了Baksmali这个工具,我们来看一下它和孪生兄弟的介绍:

    Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。
    其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。
    Smali,Baksmali分别是冰岛语中编译器,反编译器的叫法。

    也就是说,Smali代码是利用Baksmali反汇编(disassemble)dex文件得到的一种类汇编代码,它完整的实现了.dex格式所有功能(注解,调试信息,线路信息等),谈起Smali和dex之间的关系,我们常常称为转化(convert),即还原度极高,这也是Smali可以胜任动态调试的重要原因。而利用Smali汇编器,我们可以修改Smali代码,重新编译成dex文件,进一步可以对Apk进行重打包。

    在这里插入图片描述
    在黑产中,这也是无数盗版应用、破解版应用、功能增强应用、去广告版应用的实现原理。
    在这里插入图片描述

    而我们这些只是想分析App通信协议的程序员,也可以简单的修改Smali进行“Smali插桩”,通过log探针输出一些可疑的信息,或者根据探针是否触发,探测程序运行逻辑。

    提到Smali插桩,玩法也不少,Android逆向人员在仰望星空时,或多或少都渴望过一种破解App的暴力美学——让每一行代码都自动吐出来一句话“爷,我在这儿,我是干嘛的,我前面又是啥。”
    换成可以通过代码实施的方案,也就是在每个方法内打印调用栈或者log输出一下它在哪个方法里,该怎么做呢?方法非常多,我们看一下暴力插桩的三个思路。

    1.直接对smali代码进行文法分析,写一些正则表达式的判断,实现在每行代码后面加上log输出的Smali代码,然后使用Smali汇编器编译成dex文件,进而重打包Apk,最后运行App查看log输出。具体实现可以参考这篇文章,实现出来的效果也很不错实现出来的效果也很好。
    《Android应用逆向——分析反编译代码之大神器》 https://blog.csdn.net/charlessimonyi/article/details/52027563
    在这里插入图片描述
    2.直接对Dex进行操作,可以使用的工具有ReDex,Dexter等。但由于Dalvik发展尚浅,且由于Dalvik字节码比Java字节码的结构更加紧凑,所以修改起来比较复杂,笔者暂时没有看到逆向中应用Dex插桩的具体实现。

    3.既然Dex紧凑而且不好搞,那能不能搞Java字节码进行插桩呢?答案是完全可以的,对Java字节码进行操作的工具非常多且成熟,可以通过AspectJ、Asm、javassit等工具对Java字节码进行操作。下面这个工具,就是将Dex文件转换为Java字节码,再使用asm操作字节码,最后再用dx工具(Android Java代码编译流程第三步中提到的Android自带工具)编译成dex,进而重打包Apk,最后运行App查看log输出。
    《带你开发一款给Apk中自动注入代码工具icodetools》
    https://blog.csdn.net/jiangwei0910410003/article/details/53386071

    Smali和Smali插桩就介绍到这儿了,感兴趣的同学可以去试一下。
    讲道理,我们应该先花一万字讲一下smali语法和smali如何实现基础的插桩,但动态调试Smali实在是方便又迷人,我发誓,在掌握Smali动态调试后,你们很快就会将又麻烦又容易出错的Smali插桩忘在脑后。

    但这绝不意味着我们就不需要能看懂和理解Smali语法了,原因主要有两个

    1. Smali动态调试基于Smali代码,断点该下在哪里,程序跑到哪儿了,如何查看调试中的变量值……这些都需要你稍微懂一些Smali语法。
    2. Jadx之类的工具虽然号称做到了Dex到Java的一站式反编译(Dex to Java decompiler),但在其内部,是先将Dex反汇编成smali,再用asm将smali转成class字节码,最后解析查看Java代码。如果说Dex到Smali是一种convert(转化),得到的是可调式、精准靠谱的源码,那么Dex到Java就是一种translation(翻译),虽然看着可能还不错,但其实和源码相差甚远,只能称为Java伪代码,正因为相差甚远,所以我们才无法使用Jadx反编译出来的java代码进行源码级的调试,而只能进行稍显晦涩的Smali调试。所以你可能会在使用Jadx反编译过程中遇到部分逻辑无法翻译成java代码的情况,或者翻译的Java代码和真实的Smali逻辑有差异,这个时候就需要老老实实看Smali代码。

    在下一篇中,我们将结合小红书应用来讲解Smali的语法,这一篇的主角还是实现如何进行动态调试。

    1.2 为什么要进行Smali动态调试?

    动态调试能更充分的展示程序的运行逻辑,简而言之倍儿爽。

    1.3 不能进行Java调试吗?

    在上面我们已经讲的很清楚了,反编译得到的Java代码只是一种翻译而来的伪代码,它无法支撑其源代码级的动态调试。

    接下来我们开始动态调试Smali之旅。

    二、推开调试之门

    出于安全考虑,Android系统并不允许应用被随意调试,官方文档称需要满足二者之一的条件。

    1.App的AndroidManifest.xml中Application标签必选包含属性android:debuggable=“true”;
    2./default.prop中ro.debuggable的值为1;

    我们先来看第一个条件有没有办法满足,首先,发行版的App都会将debuggable设置为 false,使第三方不能直接调试分析APP,这也是厂商出于安全的考虑,那我们就需要反编译Apk,修改后进行重打包,这也是绝大多数教程的做法,但我个人非常非常不建议这么操作,因为重打包容易遭受无妄之灾,这也是我不喜欢Smali插桩的原因——它们需要重打包App
    你想研究App的通讯协议和加密字段,这已经足够让人焦头烂额,你可能会遇到繁杂的代码、诡异的反抓包,So层的加密……而如果你对App进行重打包,那就要面对App额外的保护措施,比如重打包失败,签名验证等。因为重打包这个操作主要是开发盗版App和破解版App做的事,这对厂商来说更加难以忍受,只是修改一个debuggable字段就要揽上这么多事,显然吃力不讨好。

    那第二个条件好满足吗?default.prop 文件非常好找,它就在Android的根目录下,我们可以通过ES文件浏览器找到它。
    在这里插入图片描述
    在这里插入图片描述
    很不幸的发现,这台手机的debuggable标识为0,不可调试。一个朴素的想法是直接修改这个值不就可以了?但是这是不可以的,这个值只在系统启动时,也就是开机时才会读取和加载一次。那重启?抱歉,每次重启,这个值就会恢复默认。所以就造成了一个死循环。
    那我们是怎么解决它的呢?有这样几种办法。
    1.改写系统文件,修改ro.debuggable为1,重新编译系统镜像文件,刷入设备。
    难度稍大,但一劳永逸,缺点是对新手很不友好。可以参考这篇文章,https://bbs.pediy.com/thread-197334.htm。
    2.注入init进程,修改内存中ro.debuggable的值,这个也是之前惯常的做法。
    通过大佬写的mprop工具可以修改内存中所有的属性值,只需要按照操作步骤,cmd敲七八行即可,还有人出了一键式的bat脚本。资源放在了我分享的百度资源里,大家也可以去制作者那儿下载。https://bbs.pediy.com/thread-223294.htm。 需要注意的是,因为是修改内存值,所以文件中的ro.debuggable值并不会变化,且每次重启设备都要重新注入。
    3.使用开发版/测试版的手机系统,ro.debuggable值常常为1
    4.使用模拟器,比如雷电模拟器、Genymotion等,许多模拟器天然支持动态调试,尽管defalut.prop中值并不为1,打开adb shell,用getprop ro.debuggable命令查看内存中的debuggable值却为1。
    在这里插入图片描述
    在这里插入图片描述
    5.Xposed Hook系统判定函数,Android系统凭什么判断某个App是一个可调试的应用?从读取AndroidManifest.xml中android:debuggable属性值,到打开这个应用,里面有非常多的门路,找一个合适的时机进行hook,就可以实现狸猫换太子,这需要逆向分析人员了解Android源码,我们这里不去说它,因为成熟的工具已经有很多了,只需要下载Apk,在Xposed中激活后重启手机,就可以一劳永逸。

    • BDOpener 开启APK调试与备份选项的Xposed模块 https://security.tencent.com/index.php/opensource/detail/17
    • Xinstall 如何不重打包调试Android应用 https://www.open-open.com/lib/view/open1426304176732.html
    • BuildProp Enhancer Make all application attribute android:debuggable=“true” https://repo.xposed.info/module/com.jecelyin.buildprop
    • XDebug make all app on your phone debuggable https://github.com/deskid/XDebug

    我个人平时用BDopener,网盘资源中存放了数种开启调试的工具,请自行选择,Xinstall是个十分优秀的Xposed框架,我们日后还会用到它。

    三、选择调试目标

    我猜测你很可能选择了雷电模拟器,或者在真机上装了BDOpener,我并不觉得意外,因为这两种方法确实最为便捷,之所以我们要讲那么多种方法,是为了避免意外,有的机型或者有的App存在闪退行为,这样你就可以求助于另外一个方法。

    我们演示在雷电模拟器上调试新浪博客的一个sign参数,不难,但又不是纸玩具,非常适合我们进行测试。
    下载新浪博客最新版,我在百度云里也放了apk。开启Fiddler/Charles抓包工具后,打开App。
    在这里插入图片描述
    点开一条博客
    在这里插入图片描述
    查看Fiddler,多出四五条数据,根据数据包大小和内容找到我们需要的那一条。
    在这里插入图片描述
    这是一个GET请求,字段有九个
    在这里插入图片描述
    deviceid、chno,appver,appid是固定不变的,Is_default可以不填,login_uid因为没有登录也不用管,article_id是每篇文章的id,显然这个sign是比较好玩的。
    它是64位十六进制数,猜测是两个md5拼接,不太确定哦。

    我们接下来使用Jadx反编译Apk,搜索url链接的末尾部分,即get_article_info.php,放一张之前教程的截图
    在这里插入图片描述
    在这里插入图片描述
    只有m字符串是符合要求,双击代码进去看一下,在这个config(配置)包里,以类变量的方式存放着大量的字符串,如果想引用它,就是b.m
    在这里插入图片描述
    在这里插入图片描述
    右键查看用例,看一下这个url在哪儿被使用了,发现只有一处
    在这里插入图片描述
    双击第二行的代码,查看详细引用
    在这里插入图片描述
    它包装了一个a方法来取我们的目标URL,再次查找用例
    在这里插入图片描述
    点开第一个,你会发现其实它就是a方法上面的那个方法
    在这里插入图片描述
    看到这些代码你应该感到喜闻乐见了,我们发送网络请求,首先就要进行字段的获取和拼接,在Java中往往由集合map完成,格式类似于{”id“:3,“name”:“lilac”},put存入,get取出,这儿就是一个典型的Hashmap。

    它第一步初始化一个map,之后巴拉巴拉放进去很多东西,看着和我们get请求中的字段一致。接下来我们用Smali动态调试跟踪一下集合m从初始化到塞满东西的全部过程
    首先我要说明,这儿不用动态调试也是完全可以的,但App并不总是很简单,可以一目了然。

    首先我们要获取反编译的Smali代码,因为我们的调试就是基于Smali的。你可以使用Apktool敲几行命令完成,但我个人更喜欢可视化的界面,市面上有很多集成了这些工具,可视化拖拽操作的工具。
    我这边演示windows下的操作,工具放在了网盘里,也可以自行搜索下载。
    在这里插入图片描述
    操作选择反编译apk——拖拽apk到源文件——点击操作,依据电脑性能和Apk的大小,反编译所需时间要几十秒到十分钟不等,反编译完成后自动弹出文件目录。
    在这里插入图片描述
    mac可以下载这个工具https://github.com/Jermic/Android-Crack-Tool ,界面和操作几乎和windows中一样。
    在这里插入图片描述
    都讲这么久了,我们都还没说调试工具,是这样的,几乎所有的主流Java IDE配上smalidea插件都可以对Smali进行动态调试,除此之外,JEB也可以直接调试Smali,IDA也有调试DEX的能力,还有Qtrace等等工具,但调试Smali,我只推荐Android Studio+smalidea插件这个组合,操作简单,功能强大,效果也很稳定。

    接下来打开Android Studio(注:Android studio版本需要大于3.0,我个人是3.5Beta版)
    先下载smalidea插件,可以直接用我的百度云链接,也可以去官网下载 https://bitbucket.org/JesusFreke/smali/downloads/
    在这里插入图片描述
    Android Studio–>Settings–>Plugins–>Install plugin from desk…,安装插件;需要注意smalidea路径最好不要有中文路径,可能会出问题。安装好后重启生效。
    在这里插入图片描述
    打开项目【Open an existing Android Studio Project】,选择sinablog文件夹,等待其加载,过程会持续数分钟。
    在这里插入图片描述
    加载完成之后,你需要配置一下JDK和SDK,SDK并不一定要和我一样,29,22……或者别的其他版本都可以。
    在这里插入图片描述
    在这里插入图片描述

    我们要在想要跟踪的程序起始处下断电,重新上一下图,它是类com.sina.sinablog.network.d中的一个a方法,我们要在smali文件夹中找到它。
    在这里插入图片描述
    在目录中,我们可以看到两个smali文件夹,这是由于dex分包造成的,你暂时可以不用理解它,smali1文件夹找不到对应的包,就去下一个找即可,注意要切换到Project目录。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    接下来找到a方法,我们需要了解Smali语法才能读懂它,这一部分我打算下一节结合Smali插桩讲,大家也可以自行搜索和学习。
    我们现在只需要知道".method"和“.end method”分别是方法开始和结束的地方即可。下图红框即a方法的两个重载方法,它们对应着我们前面分析的Jadx伪代码。
    在这里插入图片描述
    对比一下Jadx反编译的结果
    在这里插入图片描述
    显然Smali代码更长的那个才是我们需要的重载方法,在代码左边空白处单击即可下断点。
    在这里插入图片描述

    下好断点后,就可以准备开始运行了。
    首先,红框一圈出来的设备信息处,必须要有一个蓝色的设备在运行,如果你的是黑色,可以重启一下模拟器。
    在这里插入图片描述
    在这里插入图片描述
    确定设备没问题后,点击那个带箭头的小虫子
    在这里插入图片描述
    在这里插入图片描述
    我们现在要找到我们应用的包名,查看应用包名以及其他信息的方法和工具非常多,我这里推荐一个非常优雅的工具Apk Messenger,在反编译的第一步,我们需要对应用进行查壳,我也建议使用它,因为它实在是难得的UI设计好看的反编译工具。这是它的官网,https://www.ghpym.com/apkinfo.html ,百度云也放了相应的资源。

    在这里插入图片描述
    直接拖拽Apk 进去
    在这里插入图片描述
    细心的小伙伴可能会发现,它判定应用进行了腾讯加固,这似乎是一个误报。这是为什么呢?事实上,Apk的查壳工具都并不算聪明,是通过检查Apk目录中是否由加固软件的特征文件判断的,我们来看一下APK Messenger的判断库。
    在这里插入图片描述
    再用360压缩或者别的压缩工具打开Apk,会在assets目录下找到这些。
    在这里插入图片描述
    所以不用去管它,我们反编译内容正常,就不用考虑它为什么是个“假加固”的事了。
    现在我们知道了包名,在模拟器中打开App,在列表中找到com.sina.sinablog附加调试即可,反复调试Smali代码时,可能会出现进程列表里没有这个App的状况,重启App即可。
    在这里插入图片描述
    在这里插入图片描述
    网上很多教程都让你用DDMS查看端口,再用adb动态转发端口之类的,其实这些步骤一般都是不需要的。
    我们现在已经开始了Smali调试,只需要触发断点即可。
    在这里插入图片描述
    点击一条博客
    在这里插入图片描述
    关于Android Studio调试工具如何使用,网上已经有非常多的文章了,不熟悉的可以看一下这篇文章https://blog.csdn.net/yy1300326388/article/details/46501871

    我们这里需要使用到下图这些功能
    在这里插入图片描述
    我们来看一下Smali代码,我们下一篇才会讲Smali语法,但如果大家先学习了Smali语法,会对Smali调试有非常大的帮助。在这里插入图片描述
    运行完move-result-object v0 这一行后,我们在Watches监视器中添加v0,接下来我们就可以一路F8,感受它的变化了。
    初始化hashmap时,那个方法已经塞进去五个字段了,一步步F8,你会发现v0里的字段越来越多,没过多久,Get请求的九个字段就全部躺在了v0中。
    在这里插入图片描述
    在这里插入图片描述
    光靠F8一行一行走是没办法得知的,你可以退出调试模式,更加精细的看一下,F7进入到子方法,Shift+F8跳出方法,这样子多走几遍,你就理解了。
    在m方法中,获得了5个字段
    在这里插入图片描述
    出了m方法后,得到了三个字段
    在这里插入图片描述
    我们用Jadx的Java代码上标记一下
    在这里插入图片描述在这里插入图片描述
    SIGN是怎么生成的呢?
    在这里插入图片描述
    不熟悉Smali可以在Jadx中对应看一下
    在这里插入图片描述
    sign值是由CpltUtil.invoke()方法生成的,参数是两个字符串,第一个是固定字符串“/apicheck/blog”,第二个参数是八个参数的字符串,我们可以用计算器查看一下。

    在如图这一步,v0即包含了8个字段的map,点击图中红框的计算器,它叫Evaluate Expression,可以在这儿运行各种各样的表达式
    输入new JSONObject(v0).toString();
    你会发现JSONObject飘红,按照提示进行导包
    在这里插入图片描述
    导包后Evaluate
    在这里插入图片描述
    好吧,报错,那我们就不转JsonObject了,直接toString转成字符串看看什么样
    在这里插入图片描述
    在这里插入图片描述
    结果为{is_default=0, login_uid=, blog_uid=1260074450, article_id=4b1b35d20102yvlj, appver=6.1.2, appid=2, deviceid=e9ec21f2f9a7dc8f9c4e10694bdc6143, chno=515_104},和预期一样。
    接下来我们在Jadx中看一下这个CpltUtil.invoke()方法

    在这里插入图片描述
    一看这名字,似乎是个native方法,Ctrl+左键进入
    在这里插入图片描述
    竟然是一个native层的加密函数,在之后native层破解时我们再提它,大家可以先试一下。
    去lib库中找到libcrossplt.so文件,在ida中反编译,这个函数是静态注册的,所以很容易就可以在Exports列表中找到它,之后F5反汇编成c代码,静态分析c代码或者ida动态调试即可。

    不入so层,就还没有入门逆向,大家加油,下一篇可能讲Smali相关的东西。
    在这里插入图片描述

    展开全文
  • Ollydebug动态调试

    2018-03-13 13:13:44
    OllyDbg是一款广泛应用的动态调试工具,在做漏洞挖掘的时候可以结合IDA分析程序,其中包含了FindAddr库
  • x64dbg动态调试,懂得都懂。最新x64dbg软件-比OD更好的工具,原生支持中文界面和插件 x64dbg是一款专业的windows系统下的64位调试器,界面简洁、操作简单,与“OllyDbg”调试工具非常相似,如果之前使用过OllyDbg这...
  • ida使用技巧之动态调试

    千次阅读 2022-05-19 20:39:05
    众所周知,ida是一款非常优秀的反编译软件,在静态逆向中是属于屠龙宝刀一般的存在,他不仅仅有着优秀的静态分析能力,同时还有着极其优秀的动态调试能力,甚至可以直接对生成的伪代码进行调试,这一点远超其他只能...

    一、ida动态调试

    1、介绍

    众所周知,ida是一款非常优秀的反编译软件,在静态逆向中是属于屠龙宝刀一般的存在,他不仅仅有着优秀的静态分析能力,同时还有着极其优秀的动态调试能力,甚至可以直接对生成的伪代码进行调试,这一点远超其他只能在汇编层进行调试的动态调试器,极大的增加了动态调试程序的可读性,能够节省很多精力。甚至可以以远程调试的方式,将程序部署在linux或安卓端上,实现elf文件和so文件等的动态调试。

    2、本地调试(Windows)

    首先从本地动态调试开始

    加载目标文件

    万年第一步,使用ida打开目标文件,然后点击菜单项中的“Debugger”
    在这里插入图片描述
    选择select debugger
    在这里插入图片描述本地调试Windows文件,所以这里选择local Windows debugger。
    在这里插入图片描述点击ok之后,再看debugger菜单发现此时菜单以新的形式展开

    在这里插入图片描述此时再点击带有绿色三角符号的“Start process”即可开始调试程序

    ida还支持另一种调试方式,即将目标文件附加到一个正在运行的进程上,以调试某些无法独立运行的文件,如果想以这种方式进行调试,则在选好调试器后点击“Attach to process”后即可选择附加进程
    在这里插入图片描述

    调试器界面

    经过一段时间的加载之后,进入了调试器界面
    在这里插入图片描述“IDA-view-eip”界面是反汇编窗口,在这里点击f5,可以进入伪代码调试
    在这里插入图片描述

    可以说是非常的好用
    下面的“hex view”顾名思义,右边从上到下分别是级寄存器/标志寄存,加载到进程内存空间中的可执行文件和共享库,双击模块名称可打开该模块输出的符号表,再向下看就是栈窗口

    调试命令

    ida快捷键功能
    F7单步步进
    F8单步步过
    F9继续运行程序
    F4运行到光标所在行
    Ctrl + F7直到该函数返回时才停止
    Ctrl + F2终止一个正在运行的进程
    F2设置断点

    断点

    ida的动态调试同样支持设置条件断点
    在这里插入图片描述
    设置好断点后,右键断点,点击第二行“Edit breakpoint”即可打开断点设置菜单
    在这里插入图片描述
    location栏是断点地址,condition栏则是条件断点的表达式
    例:EAX == 12
    指当EAX的值为12时中断,同时,因为condition栏由IDC表达式支持,所以可以使用一些IDC的函数。
    比如:GetRegValue(“ZF”)
    指当ZF的值不为0时中断

    监视窗口

    ida同样也支持对数据的监视,需要监视的数据一般在栈或者数据块中,进入栈或者数据,点击右键打开菜单,选择“Add watch”
    在这里插入图片描述即可在窗口“watch list”中显示,如果需要删除,则按“Delete”键
    在这里插入图片描述

    3、远程调试

    ida支持远程调试Windows、linux、Android、Mac OS的二进制文件,将文件放在远程的对应系统服务器上,ida远程连接服务器,在服务器上运行、调试程序,并在本地客户端显示调试界面。界面视图上和本地调试并没有区别。
    如果需要远程调试,首先需要将ida的服务端部署在远程服务器上,ida的服务端存储在ida目录中的dbgsrv文件中
    在这里插入图片描述将需要调试的文件和服务端版本放入服务器中,然后运行服务端,会默认在23946端口启动ida服务端程序,以linux为例
    被调试程序是64位elf文件,所以在linux端运行linux_server64,然后回到客户端
    在这里插入图片描述
    客户端的第一步没什么变化,在菜单选择debugger栏,在选择debugger时,选择Remote Linux debugger
    在这里插入图片描述然后在菜单中先选择“Process option”进行设置
    在这里插入图片描述
    打开后页面如下
    在这里插入图片描述第一行application和input file选择被调试文件在服务端中的存储路径。下面第三行的directory是存储路径,直接选被调试文件所在目录就行。再下面第四行的是程序启动时传入的参数,可以为空。第五行则“Hostname”则填服务端的ip和端口号,我这里选的服务端是虚拟机。最后一行的password是linux_server启动时设置的密码,如果没有设置,则为空即可。全部设置正确之后就可以开始调试了
    点击“start process”开始调试程序

    在这里插入图片描述可以看到在服务端程序已经成功启动
    在这里插入图片描述

    接下来的步骤和本地调试并没有什么区别不再赘述。其他安卓和Mac的文件远程调试也是大同小异,也不再多说了。

    展开全文
  • IDA在linux下的动态调试的准备

    千次阅读 2022-04-22 22:31:11
    我们难以分析,使用IDA动态调试 启动我们的虚拟机一定要是Linux的, 确保这个2个文件在虚拟机,这2个文件在IDA目录下的dbgsrv中,直接复制到虚拟机即可 现在IDA下入一个断点 在虚拟机中 chmod a+x ./...
  • 一次jeb动态调试

    千次阅读 2022-03-15 18:08:39
    一次jeb动态调试记录 实例:Brokendex.apk 修复apk文件 classes.dex文件头损坏 apk文件修改扩展名为zip,解压,可以打开该文件夹,找到根目录下的classes.dex 使用010 Editor打开classes.dex,修改头部,先覆盖1...
  • 安卓逆向基础(动态调试,静态调试)

    千次阅读 2022-02-21 18:58:46
    BroadcastReceiver 静态注册和动态注册 静态:xml中注册 动态:代码中实现 NotificationManager 系统的Service Notification 内容提供者 实现跨程序共享数据的标准方式,不同文件存储和Sharedpreferences 存储中的...
  • iOS 越狱逆向LLDB动态调试app, debugserver,越狱,逆向,动态调试
  • IDA动态调试SO文件

    千次阅读 2021-10-26 23:03:18
    IDA动态调试SO文件前言一、启动android server,以调试方式启动APK二、调试步骤三、调试技巧 前言 此篇博文仅仅记录下本人学习 IDA pro 动态调试so文件过程。 工具:IDA pro 7.5 参考博文及APK来源: ...
  • IDA pro动态调试dex文件

    千次阅读 2021-10-27 22:24:57
    IDA pro动态调试dex文件前言一、启动android server二、调试步骤三、注意事项 前言 此篇博文仅仅记录下本人学习 IDA pro 动态调试dex文件步骤。 工具:IDA pro 7.5 书籍:《android软件安全权威指南》 一、启动...
  • 动态分析Android App之动态调试(一)

    千次阅读 2019-08-25 10:46:48
    这个系列一共有五篇左右,内容主要介绍如何在Java层动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 426,034
精华内容 170,413
关键字:

动态调试

友情链接: 高斯白噪声.zip