jeb动态调试,Log插桩

jeb动态调试,Log插桩

1.什么是动态调试

动态调试是指自带的调试器跟踪自己软件的运行,可以在调试的过程中知道参数或者局部变量的值以及履清代码运行的先后顺序。多用于爆破注册码。与静态分析(直接阅读反编译的代码)不同,动态调试允许实时监控内存、寄存器、变量值和执行流程,尤其适合分析复杂逻辑或加密/混淆后的代码。

  • 动态调试 vs 静态分析

    特性 动态调试 静态分析
    执行状态 程序正在运行 程序未运行,仅分析代码文件
    优势 观察实时数据流、内存变化,绕过部分反逆向技术 全面查看代码结构,无执行环境依赖
    劣势 需处理反调试机制,依赖运行环境 无法追踪运行时状态,难以分析动态逻辑
    典型工具 GDB、LLDB、IDA Pro、Frida、Android Studio JADX、Ghidra、IDA Pro、Binary Ninja

2.动态调试步骤

1.修改debug权限

方法一:在AndroidManifest.xml里添加可调试权限

1
android:debuggable="true"
  • 示例

    1.先提取安装包进行后续修改

    2.对文件进行修改

    3.将权限添加在application

    4.重新安装完成后即可得到一个可以调试的安装包。

方法二:XappDebug模块hook对应的app

项目地址

XappDebug

方法三:Magisk命令(重启失效)

1
2
3
4
5
6
7
1.  adb shell #adb进入命令行模式

2.  su #切换至超级用户

3.  magisk resetprop ro.debuggable 1

4.  stop;start; #一定要通过该方式重启

方法四:刷入MagiskHide Props Config模块

一般来说,在4选项中如果有ro.debuggable那就直接修改

没有的话就选5

修改ro.debuggable的值为1

2.端口转发以及开启adb权限

版本号点击七次开启开发者模式并开启adb调试权限

夜神模拟器:adb connect 127.0.0.1:62001(雷电模拟器自带端口转发)

3.下段点

ctrl+b下断点

4.debug模式启动

1
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity

adb shell am start -D -n

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

am start -n 表示启动一个activity

am start -D 表示将应用设置为可调试模式

Android修改ro.debuggable 的四种方法-CSDN博客

5.Jeb附加调试进程

激活jeb

在线python运行

https://tool.lu/coderunner/

  • 使用案例:

    1.查询到相关位置

    2.将内容编译为JAVA的形式进行分析

    3.通过初步分析判断关键点在chek()方法对我们输入的字符串进行了怎样的判断。

    4.双击进入到chek()代码,发现它是一个经过一串运算后进行base64编码与字符进行对比

    5.查找到关键中间字符的代码进行下断点(Ctrl+b)

    6.使用debug启动该软件,依次获取包名和启动类名

    去掉包名的部分,后边的一串属于是要填写的类名

    7.启动后返回界面出现下列提示说明已正常运行debug模式

    8.使用jeb对下断点的地方进行调试,我们检查调试端口和报名对应正确且进程存在,点击附上

算号代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 复制代码 隐藏代码
#https://bbs.pediy.com/
#!/usr/bin/env python
import os, sys, struct, time, binascii, hashlib

RC4_Key2= 'Eg\xa2\x99_\x83\xf1\x10'

def rc4(Key, inData):
    Buf = ""
    S = range(256)
    K = (map(lambda x:ord(x), Key) * (256 / len(Key) + 1))[:256]
    j = 0
    for i in range(256):
        j = (S[i] + K[i] + j) % 256
        S[i], S[j] = S[j], S[i]
    i, j = 0, 0
    for x in range(len(inData)):
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        Buf += chr(S[(S[j] + S[i]) % 256] ^ ord(inData[x]))
    return Buf

def Long2Int(longdata):
    lo = longdata & 0xFFFFFFFF
    hi = (longdata >> 32) & 0x7FFFFFFF
    return hi, lo

def KeygenSN(LicenseSerial, MachineID):
    mhi, mlo = Long2Int(MachineID)
    lhi, llo = Long2Int(LicenseSerial)
    hi_Key = (mhi - lhi + 0x55667788) & 0x7FFFFFFF
    lo_Key = (mlo + llo + 0x11223344) & 0xFFFFFFFF
    Z0, = struct.unpack('<Q', struct.pack('<LL', lo_Key, hi_Key))
    Z1 = int(time.time()) ^ 0x56739ACD
    s = sum(map(lambda x:int(x, 16), "%x" % Z1)) % 10
    return "%dZ%d%d" % (Z0, Z1, s)

def ParsePost(buf):
    Info = struct.unpack('<3L2Q4LQ3L', buf[:0x40])
    flag, CRC, UserSerial, LicenseSerial, MachineID, build_type, \
          Ver_Major, Ver_Minor, Ver_Buildid, Ver_Timestamp, \
          TimeOffset, Kclass, Random2 = Info
    SysInfoData = buf[0x40:]
    assert CRC == binascii.crc32(buf[8:]) & 0xFFFFFFFF
    return Info, SysInfoData

def DecodeRc4Str(buf):
    buf = buf.decode('hex')
    i, s = ParsePost(rc4(buf[:8] + RC4_Key2, buf[8:]))
    return i, s

def GetJebLicenseKey():
    licdata = ""
    if licdata:
        i, MachineID = DecodeRc4Str(licdata)
        SN = KeygenSN(i[3], i[4])
        print "JEB License Key:", SN
        return SN

GetJebLicenseKey()
raw_input("Enter to Exit...")

快捷键:

^F6进入方法

F6跳过方法

F7从方法中跳出来

R运行到光标处

3.Log插桩

定义:Log插桩指的是反编译APK文件时,在对应的smali文件里,添加相应的smali代码,将程序中的关键信息,以log日志的形式进行输出。

调用命令

1
2
3
 复制代码 隐藏代码

invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V

jeb动态调试,Log插桩
https://cc-nx.github.io/2025/03/23/ZJ5/jeb动态调试,Log插桩 1b1a6f4b4daf80a68a87f1bcc2c5232d/
作者
CC
发布于
2025年3月23日
许可协议