动态调试_动态库调试 - CSDN
精华内容
参与话题
  • 动态调试(一)

    2019-05-05 23:04:00
    动态调试程序 转载于:https://www.cnblogs.com/Trybst/p/10816996.html

    动态调试程序

    转载于:https://www.cnblogs.com/Trybst/p/10816996.html

    展开全文
  • 动态调试

    2013-10-22 15:28:08
    Introduction ============ This document describes how to use the dynamic debug (ddebug) feature. Dynamic debug is designed to allow you to dynamically enable/disable kernel code to obtain addition

    如何动态调试 (ddebug)

    这篇文档主要介绍动态调试 (ddebug) 特性. 

    动态调试的主要功能是允许你动态的打开或关闭内核代码的各种提示信息. 现在, 假如  
    CONFIG_DYNAMIC_DEBUG 已经设置好了, 那么所有的 pr_debug()/dev_debug() 之类的函数可以动态的在代码里所使用. 

    动态调试有很多有用的特性: 

     * 简洁的查询语言允许打开或关闭调试的状态通过匹配以下的任意组合: 

       - 资源文件名  
       - 函数名  
       - 行号 (包括一定范围的行号) 
       - 模块名  
       - 格式化字符串  

     * 提供一个debugfs 控制文件: <debugfs>/dynamic_debug/control 这个文件被读取用来显示已完成的调试信息列表, 来帮助指导你  
    控制动态调试的行为  
    =================================== 

    pr_debug()/dev_debug()的行为控制通过在'debugfs'文件系统上写一个控制文件 .因此,为了这个特性,你首先必须挂载这个debugfs文件系统. 然后, 我们再像这样使用控制文件: <debugfs>/dynamic_debug/control. 下面这个是个例子, 假如你要显示文件'svcsock.c'的1603行内容,你可以这样做: 

    nullarbor:~ # echo 'file svcsock.c line 1603 +p' > 
                    <debugfs>/dynamic_debug/control 

    如果你的语法有错误,写成了下边这个样子,会有下面的写操作错误提示: 

    nullarbor:~ # echo 'file svcsock.c wtf 1 +p' > 
                    <debugfs>/dynamic_debug/control 
    -bash: echo: write error: Invalid argument 
    查看动态调试行为  
    =========================== 

    你可以查看目前所有调试状态的行为配置通过以下命令: 

    nullarbor:~ # cat <debugfs>/dynamic_debug/control 
    # filename:lineno [module]function flags format 
    /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:323 
    [svcxprt_rdma]svc_rdma_cleanup - "SVCRDMA Module Removed, deregister RPC RDMA transport\012" 
    /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 
    [svcxprt_rdma]svc_rdma_init - "\011max_inline       : %d\012" 
    /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 
    [svcxprt_rdma]svc_rdma_init - "\011sq_depth         : %d\012" 
    /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 
    [svcxprt_rdma]svc_rdma_init - "\011max_requests     : %d\012" 
    ... 


    你也可以应用标准的Unix文本过滤命令来过滤这些数据, 例如. 

    nullarbor:~ # grep -i rdma <debugfs>/dynamic_debug/control  | wc -l 
    62 

    nullarbor:~ # grep -i tcp <debugfs>/dynamic_debug/control | wc -l 

    42

    在第三列(在Uninx下执行这个命令的结果是一列一列的)显示了调试状态位的激活标志(后边的是标志位的定义).  默认值, 无额外行为被激话, 是这个 "-".  因此你可以查看任何不是默认标志的状态位通过下面的命令:

    nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control 
    # filename:lineno [module]function flags format 
    /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c:1603 [sunrpc]svc_send p 
    "svc_process: st_sendto returned %d\012" 

    命令语言参考 
    ========================== 

    在词汇层面上,一个命令由一系列由空格分割的的单词组成。注意的是换行符会认为是单词的分割,同时*不会*结束一条命令或者允许多个命令一起完成。下面的这些都是等价的: 

    nullarbor:~ # echo -c 'file svcsock.c line 1603 +p' > 
                    <debugfs>/dynamic_debug/control 
    nullarbor:~ # echo -c '  file   svcsock.c     line  1603 +p  ' > 
                    <debugfs>/dynamic_debug/control 
    nullarbor:~ # echo -c 'file svcsock.c\nline 1603 +p' > 
                    <debugfs>/dynamic_debug/control 
    nullarbor:~ # echo -n 'file svcsock.c line 1603 +p' > 
                    <debugfs>/dynamic_debug/control 

    命令由wirte()的系统调用界定。如果你想执行多个命令,你需要为每个加入“echo”分割,像这样: 

    nullarbor:~ # echo 'file svcsock.c line 1603 +p' > /proc/dprintk ;\ 
    > echo 'file svcsock.c line 1563 +p' > /proc/dprintk 

    或者甚至是这样:  

    nullarbor:~ # ( 
    > echo 'file svcsock.c line 1603 +p' ;\ 
    > echo 'file svcsock.c line 1563 +p' ;\ 
    > ) > /proc/dprintk 

    在语法层面上,一个命令由一系列的规格匹配组成,随后由一个标记来改变这规格。 

    command ::= match-spec* flags-spec 

    match-spec常用来选择一个已知的dprintk()调用点的子集来套用flags-spec。把他们当做彼此之间的每对做隐式查询。注意一个空的match_specs列表是有可能的,但不是非常有用,因为它不会匹配任何调用点的调试子句。 

    一个匹配规范由一个关键字组成,关键字控制被比较的调用点的属性和要比较的值。可能关键字是: 

    match-spec ::= 'func' string | 
               'file' string | 
               'module' string | 
               'format' string | 
               'line' line-range 

    line-range ::= lineno | 
               '-'lineno | 
               lineno'-' | 
               lineno'-'lineno 
    // 注意:line-range不能包含空格,例如 
    // “1-30”是有效的范围,但“1 - 30”就是无效的 

    lineno ::= unsigned-int 

    每个关键字的意思是: 

    func 
         给定的字符穿会和每个调用点的函数名比较。例如: 

        func svc_tcp_accept 

    file 
         给定的字符串会和每个调用点的源文件的全路径名或者相对名比较。例如: 

        file svcsock.c 
        file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c 

    module 
        给定的字符串会和每个调用点的模块名进行比较。模块名是和在“lsmod”里看到的字符串一样,举例来说,没有路径或者是.ko后缀同时带有'-'的改变为'_'。 

        module sunrpc 
        module nfsd 

    format 
         给定的字符串会在动态调试格式字符串里查找。注意这字符串不需要匹配这个格式,这是一部分。空格和其他特殊字符能够用C的八进制字符语法来转义,例如空字符是\040。作为选择,这个字符串可以附上双引号(")或者是单引号(‘)。 
         例如: 

        format svcrdma:        // 大多数NFS/RDMA 服务器的dprintks 
        format readahead        // 一些在预加载缓存里的dprintks 
        format nfsd:\040SETATTR // 一个使用空格来匹配格式的方式 
        format "nfsd: SETATTR"  // 一个整齐的方法来用空格匹配格式 
        format 'nfsd: SETATTR'  // 同样是一个用空格来匹配格式的方法和 

    line 

         给定的行号或者是行号范围会和每个dprintk()调用点
          的行号进行比较。一个单一的行号与调用点 的行号 进行准
         确匹配。一个行号范围会和包含的第一行和最后一行 的任何调
          用点进行匹配。一个空的第一个数字表示该文件的第 一行
          ,一个空的行号表示文件的最后一行。例如:


        line 1603        // 准确定位到1603行  
        line 1600-1605  //1600行到1605行之间的6行 
        line -1605        // 从第一行到1605行之间的1605行 
        line 1600-        // 从1600行到结尾的全部行 

    标记规范包含了一个由一个或多个标记字符跟随的变化操作。这变化操作是下面的字符之一: 

    - 
         移除给定的标记 

    + 
         加入给定的标记 

    = 
        设置标记到给定的标记上  

    这些标记是: 

    f 
        包含已打印消息的函数名 
    l 
         包含已在打印消息的行号 
    m 
        包含已打印消息的模块名 
    p 
        产生一个printk()消息到显示系统启动日志 
    t 
        包含了不在中断上下文中产生的消息里的线程ID 

    注意正则表达式^[-+=][flmpt]+$匹配一个标记规范。 
    同样也要注意,没有便捷的语法来一次性移除所有的标记,你需要使用"-flmpt"。 

    引导进程中的调试信息

    即使在用户空间和debugfs存在之前,也可以使用引导参数:ddebug_query=“QUERY”来激活引导进程中的调试信息。

    QUERY遵循上述语法,但一定不能超过1023个字符。调试信息的启动随着arch_initcall而完成。因此通过引导参数arch_initcall之后,你可以在所有的代码处理中启用调试信息。

    例如,在一个x86的系统中,ACPI启用是一个subsys_initcall并且如果你的机器(通常是一台笔记本)有一个嵌入式的控制器,ddebug_query=“fileec.c+p”将会在ACPI装备期间显示早期的嵌入式控制器事务。PCI(或其他设备)的初始化也是使用这个引导参数来调试的热门候选。

    实例 
    ======== 

    // 提供文件 svcsock.c   1603行信息 
    nullarbor:~ # echo -n 'file svcsock.c line 1603 +p' > 
                    <debugfs>/dynamic_debug/control 

    // 提供文件svcsock.c所有信息  
    nullarbor:~ # echo -n 'file svcsock.c +p' > 
                    <debugfs>/dynamic_debug/control 

    // 提供NFS服务模块所有的信息 
    nullarbor:~ # echo -n 'module nfsd +p' > 
                    <debugfs>/dynamic_debug/control 

    // 提供函数svc_process()的所有12条信息  
    nullarbor:~ # echo -n 'func svc_process +p' > 
                    <debugfs>/dynamic_debug/control 

    // 不显示 函数svc_process()的所有12条信息 
    nullarbor:~ # echo -n 'func svc_process -p' > 
                    <debugfs>/dynamic_debug/control 

    // 提供NFS调用的所有以READ开始的信息. 
    nullarbor:~ # echo -n 'format "nfsd: READ" +p' > 
                    <debugfs>/dynamic_debug/control

     

     

     

     

     
     

    Linux内核动态调试信息的打开,如pr_debug

     (2012-08-23 13:38:54)
     

    【1】配置Kconfig,添加要调试驱动模块的DDEBUG选项,如

    kernel_imx\drivers\mxc\pmic\mc13892\Kconfig

    config MXC_PMIC_DEBUG
     bool "Support MXC PMIC DEBUG"
     depends on MXC_PMIC
     

    【2】配置Makefile,添加编译支持驱动模块 EXTRA_CFLAGS  += -DDEBUG ,如

    kernel_imx\drivers\mxc\pmic\core\Makefile

    ifeq ($(CONFIG_MXC_PMIC_DEBUG),y)
     EXTRA_CFLAGS  += -DDEBUG
    endif

     

    【3】配置内核,使支持动态调试

    make menuconfig

      | |        Kernel hacking  --->

      | |    [*] Tracers  --->

      | |          [*]   Trace max stack

      | |    [*] Enable dynamic printk() support

     

      | |        Device Drivers  --->

      | |            MXC support drivers  --->

      | |                MXC PMIC support  ---> 
      | |                       [*] Support MXC PMIC DEBUG

     

    【4】重烧内核启动后,改变控制台debug消息显示级别,可以打印printk(DEBUG ...)信息
    echo > /proc/sys/kernel/printk "8"

     
    展开全文
  • 安卓逆向之----常用动态调试方法 一. 前言 逆向分析中常用的分析方法有:静态分析、动态调试、HOOK等。动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履清代码运行的...

    安卓逆向之----常用动态调试方法

    一. 前言

    逆向分析中常用的分析方法有:静态分析、动态调试、HOOK等。动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履清代码运行的先后顺序,验证自己的想法是否正确。安卓中需要调试的代码有dex中代码和so中代码,对于dex层java代码调试,本人常用的是dex Java代码用JEB调试和IDEA + Smalidea调试,so层代码是用IDA附加调试。下面就这三种方法进行一一介绍。

    二. 调试介绍

    命令:adb jdwp 用于查看Android手机中可调式的进程。

    1. JEB调试

    先安装好JEB,并配置好Java环境。JEB调试并不需要事先将apk转换成smali代码,只需要打开和安装到安卓手机上对应的apk文件即可。不过前提是让想要调试的apk支持被调试,这一点对后面的两种调试方法也是要符合才行。至于怎么支持调试?1)apk的Manifest.xml文件的Application的属性中包含android:debuggable=“true” ;2)或者第一条不满足时,安卓手机的default.prop文件中ro.debuggable=1时也行,mprop工具可用于修改该属性值。用JEB调试时,得把Eclipse和Android Studio关掉,不然会占用adb端口。
    做好前期准备后,下面正式进入调试环节:
    (1)打开JEB,并打开一个apk文件,安卓手机打开相应的应用,并且连接好电脑:
    在这里插入图片描述
    在这里插入图片描述
    调试时,需要在smali界面才能单步(可以发现在Java代码界面单步是无效的),但是在调试过程中可以随时切换看源码,单步时切回去即可,调试快捷键直接点击debugger查看,不同版本会有些不同。
    (2)开始附加调试
    点击Debugger——start,然后弹出选择附加进程界面,如下图:
    在这里插入图片描述
    在这里插入图片描述
    (3)查看变量的值
    调试时,变量的值都是地址,即使是String类型也是,所以需要将类型转成String,选中类型,然后Ctrl + 输入String,不过很不稳定,很多时候都不成功,查找变量的值在用smalidea + idea调试时很容易观察。
    在这里插入图片描述
    在这里插入图片描述

    2.smalidea + idea调试

    idea直接到官网下载一个社区版(不收费版,够我们调试用了)安装,然后下载smalidea插件(github地址:https://github.com/JesusFreke/smali/wiki/smalidea
    下载地址:https://bitbucket.org/JesusFreke/smali/downloads),在IDEA界面中选择:File——Setting——Plugin——Install plugin fromdisk…,选择下载好的smalidea插件,安装即可。
    在这里插入图片描述
    环境配好了,接下来介绍调试的步骤:
    (1)找到要调试的应用的相应的apk文件,可以是从手机里面导出来,高版本的系统导出来的apk可能是包含odex文件的,或者是vdex文件的,所以遇到时,得需要将这些文件转成包含dex的apk文件。
    (2)通过apktool工具将apk反编译成smali文件,然后用IDEA打开smali文件所在的总目录。
    在这里插入图片描述
    (3)初次调试时,需要配置:Run——Edit Configurations,点击左上角+,然后选择remote,然后打开DDMS(ddms工具在安装好Android的Eclipse中会自带,也可网上下载),查看需要调试的包名对应的端口,替换掉8700,保存后,Run——debug unnamed,即能实现调试。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (4)查看变量的值
    smali+Idea调试时,查看变量很稳定,如下:
    在这里插入图片描述

    3.IDA调试so

    IDA调试so时,可以在打开相应的so文件下调试,也可以在不带so文件的情况下调试,二者都需要附加,常用的是后者,现在直接说明后者的步骤。
    (1)启动IDA的调试服务
    在这里插入图片描述
    根据getprop ro.product.cpu.abi,查看CPU型号,我的是armeabi-v7a,所以选择android_server。

    adb push android_server /data/local/tmp
    adb shell chmod 777 /data/local/tmp/android_server 
    adb shell su
    #:/data/local/tmp/android_server -p3000
    之后另一cmd窗口中映射指定的端口:
    adb forward tcp:3000 tcp:3000
    

    上面最后一行中,5566是给服务指定的端口,默认是23946,也可以改成其它的。必须是root权限下执行这个命令,不然调试进程只会显示两个,不是所有的包名对应的进程。
    (2) 打开IDA开始附加
    IDA一般会有32位和64位,在经验中,64位IDA调试32位的so会出问题,32位的IDA调试64位的so目前没怎么试过,但最好是位数对应好,然后启动相应位数的IDA调试服务。
    选择Debugger——Attach——Remote ARMLinux/Android Debugger;
    在这里插入图片描述
    选择调试的包名
    到这里就可以下断点调试了,如下图,一般会把要调试的so用另一个IDA打开,找到代码偏移,然后加上此时调试时模块的首地址就是我们想调试的地址,下断点,然后F9便可。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下断点地址:B3D30000 + 7B04 = B3D37B04
    在这里插入图片描述
    有的时候会调试Jni_Onload这个函数,但是这个函数很早就调用了,用上面的步骤是没法调试到这个函数的,这是可以尝试先用JADB调试启动apk,然后用IDA附加,最后用JADB接管调试。操作步骤如下:
    (1)在cmd窗口中用:adb shell am start -D -n 包名/Activity名 命令调试启动应用;
    (2)启动IDA的服务,映射端口;
    (3)IDA附加进程;
    (4)jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    port可以换成ddsm中查看到的相应报名的端口;
    (5)之后在IDA中调试同上面非启动调试一样操作了。

    三. 技术总结

    (1)JEB和smalidea+IDEA用于安卓Java层调试,二者的各自优点主要如下:
    1)JEB调试时方便随时看JAVA代码,不过单步时还得跳回smali代码界面;
    2)smalidea+IDEA调试时相对较稳定,并且查看变量比较方便。
    (2)IDA主要用于调试安卓的so文件,当然IDA也可用于调试Linux中so和Mac中so,功能是飞航的强大。

    展开全文
  • App动态调试这也太详细了
  • 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

    在这里插入图片描述

    展开全文
  • App动态调试

    千次阅读 2018-10-25 18:05:07
    APK使用反编译工具AndroidKiller进行反编译后,在AndroidManifest.xml没有设置android:debuggable属性,没有该属性下debuggable默认是关闭,但是在模拟器或...来检测该值)可进行动态调试。 1.先查看AndroidManifes...
  • so文件是unix的动态连接库,我们知道Android系统是类linux,所以这里也沿用其动态链接库so,一般用c语言实现,是二进制文件,作用相当于windows下的.dll文件,在Android中调用动态库文件(*.so)都是
  • Android逆向系列之动态调试

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

    千次阅读 多人点赞 2019-08-24 18:36:38
    动态分析Android App之动态调试 这个系列一共有五篇左右,内容主要介绍如何动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,希望能给刚入门Android...
  • 这是作者网络安全自学教程系列,主要...这篇文章将讲解逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。基础性文章,希望对您有所帮助,如果存在错误或不足之处,还望告知,加油!
  • Android IDA So的动态调试大法

    万次阅读 多人点赞 2016-10-05 19:48:38
    下面就说关于在IDA中Android so的动态调试的问题以及在so的三个层次下断点的操作。 问题篇: 1.动态调试的作用以及与我们常说的脱壳区别之处? 2.IDA的下断点调试的原理? 3.有无反调试的步骤区别?以及原理? ...
  • 安卓APP动态调试技术

    千次阅读 2016-01-19 16:51:08
    0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域。越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ、游戏、导航地图、微博、微信、手机支付等等,尤其2015年春节期间各大厂商推出...
  • 之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结。 一、IDA常用快捷键总结 ...
  • Java 动态调试技术原理及实践

    千次阅读 多人点赞 2019-11-07 19:55:19
    总第367篇2019年 第45篇1. 动态调试要解决的问题断点调试是我们最常使用的调试手段,它可以获取...本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,接着介绍我们在Java动态调试领域的思...
  • 动态调试及LLDB技巧集合

    千次阅读 2018-09-29 14:10:51
    但是在未知源代码的情况下,想要精确定位一个功能点的实现位置及实现原理,就需要结合静态分析和动态调试来分析程序运行的动态和行为实现。 静态分析 静态分析是指在程序没有运行的情况下进行程序分析的一种方法,...
  • Android中的动态调试案例分析

    热门讨论 2016-05-20 13:17:17
    动态破解apk动态破解apk动态破解apk动态破解apk动态破解apk
  • iOS程序 防止动态调试

    千次阅读 2017-10-09 09:40:09
    如何防止你的应用被GDB附加进程?
  • Android逆向系列之动态调试1–入门篇

    千次阅读 2017-09-15 14:27:18
    一、什么是动态调试 动态的意思就是指通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄露测试等方面。 百度百科:动态调试是指软件作者利用集成环境(IDE)自带的调试器跟踪自己软件...
  • AS动态调试smali

    千次阅读 2018-01-14 17:17:00
    反编译后记得查看清单文件,在application标签里面要有 android:debuggable=”true” 这句代码,没有是不能调试apk的,有的apk中没有这句代码要自行添加上,再回编译apk,便于后续安装apk; 2.安
  • 动态调试反编译的apk

    千次阅读 2016-03-11 08:37:04
    跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运行看输出日志,这种方法费时费力,如果能够动态调试就最好了。下面就给大家介绍apk+eclipse来调试smali。 前期准备: ec
1 2 3 4 5 ... 20
收藏数 316,720
精华内容 126,688
关键字:

动态调试