unidbg HookZz与Debug调试

写在最前面

本文章依旧只介绍使用,逆向分析的具体过程不记录。详情请关注 逆向lin狗 的公众号

HookZz

使用ida打开so层分析,有处时间的方法。为了方便调试,要将时间固定,以便分析。


image.png
  • hook gettimeofday 代码如下
    public void fixedTime() {
        HookZz instance = HookZz.getInstance(emulator);
        instance.wrap(module.findSymbolByName("gettimeofday"), new WrapCallback<HookZzArm32RegisterContext>() {
            UnidbgPointer tv = null;  // 初始化Pointer指针

            @Override  // hook前
            public void preCall(Emulator<?> emulator, HookZzArm32RegisterContext ctx, HookEntryInfo info) {
                tv = ctx.getPointerArg(0);  // 将指针赋值给tv
            }

            @Override // hook后
            public void postCall(Emulator<?> emulator, HookZzArm32RegisterContext ctx, HookEntryInfo info) {
                if (tv != null) {
                    byte[] before = tv.getByteArray(0, 12);
                    Inspector.inspect(before, "gettimeofday tv");
                }
                System.out.println("====++++====");
                // 固定时间
                long currentTimeMillis = 1668083944037L;
                long tv_sec = currentTimeMillis / 1000;
                long tv_usec = (currentTimeMillis % 1000) * 1000;
                System.out.println("=======");
                System.out.println(currentTimeMillis);
                System.out.println(tv_sec);
                System.out.println(tv_usec);
                // 创建TimeVal32时间对象,并传入指针
                TimeVal32 TimeVal = new TimeVal32(tv);
                TimeVal.tv_sec = (int) tv_sec;
                TimeVal.tv_usec = (int) tv_usec;
                TimeVal.pack();  // 替换
            }
        });
    }
image.png

image.png

时间已经固定

hook 0x10E18

    public void hook_sub_10E18(){
        HookZz instance = HookZz.getInstance(emulator);
        // 此so是32位的,所以地址要+1,64位的不需要+1
        instance.wrap(module.base + 0x10E18 +1, new WrapCallback<HookZzArm32RegisterContext>() {

            @Override  
            public void preCall(Emulator<?> emulator, HookZzArm32RegisterContext ctx, HookEntryInfo info) {
                System.out.println("+++++10E18++++");
                UnidbgPointer arg0 = ctx.getPointerArg(0);
                int arg1 = ctx.getIntArg(1); 
                UnidbgPointer arg2 = ctx.getPointerArg(2);
                int arg3 = ctx.getIntArg(3);
                System.out.println("arg0: "+new String(arg0.getByteArray(0, 32)));
                System.out.println("arg1: " + arg1);
                System.out.println("arg2:  "+new String(arg2.getByteArray(0, arg3)));
                System.out.println("arg3:  " + arg3);
            }

            @Override
            public void postCall(Emulator<?> emulator, HookZzArm32RegisterContext ctx, HookEntryInfo info) {
            }
        });
    }
image.png

Debug 调试

  • unidgb 3种调试模式
    源码写得很清楚了,分别是 CONSOLE、GDB_SERVER、ANDROID_SERVER_V7
package com.github.unidbg.debugger;
public enum  DebuggerType {
    /**
     * console debugger
     */
    CONSOLE,
    /**
     * gdb server
     */
    GDB_SERVER,
    /**
     * ida android server v7.x
     */
    ANDROID_SERVER_V7
}

  • 开启调试模式
    Debugger attach = emulator.attach(DebuggerType.CONSOLE);
    attach.addBreakPoint(module.base + 0x10EA4, new BreakPointCallback() {
            @Override
            public boolean onHit(Emulator<?> emulator, long address) {
                return false;  // 为true是,是不会断住的,只有为false才会断住
            }
        });
  • 调试方法
    运行得时候,就会自动断点了,控制台模式最重要得是知道命令:(在控制台输入错误命令 unidbg会有提示的)
c: continue
n: step over
bt: back trace

st hex: search stack
shw hex: search writable heap
shr hex: search readable heap
shx hex: search executable heap

nb: break at next block
s|si: step into
s[decimal]: execute specified amount instruction
s(blx): execute util BLX mnemonic, low performance

m(op) [size]: show memory, default size is 0x70, size may hex or decimal
mr0-mr7, mfp, mip, msp [size]: show memory of specified register
m(address) [size]: show memory of specified address, address must start with 0x

wr0-wr7, wfp, wip, wsp <value>: write specified register
wb(address), ws(address), wi(address) <value>: write (byte, short, integer) memory of specified address, address must start with 0x
wx(address) <hex>: write bytes to memory at specified address, address must start with 0x

b(address): add temporarily breakpoint, address must start with 0x, can be module offset
b: add breakpoint of register PC
r: remove breakpoint of register PC
blr: add temporarily breakpoint of register LR

p (assembly): patch assembly at PC address
where: show java stack trace

trace [begin end]: Set trace instructions
traceRead [begin end]: Set trace memory read
traceWrite [begin end]: Set trace memory write
vm: view loaded modules
vbs: view breakpoints
d|dis: show disassemble
d(0x): show disassemble at specify address
stop: stop emulation
run [arg]: run test
gc: Run System.gc()
threads: show thread list
cc size: convert asm from 0x40010ea4 - 0x40010ea4 + size bytes to c function
  • 常用的命令介绍
    c - F8 (上一步)
    n - F9 (下一步)
    d - Varibles 窗口
d
image.png

m 指令

  • mr0


    image.png
  • msp


    image.png
  • m+地址 [长度]


    image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 给大家介绍一下反调试汇总的原理及实现方式,以及各种反调试的扩展 反调试汇总: 针对于一些大型apk 反调试不一定是...
    乐天听雨丶阅读 4,272评论 0 0
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,467评论 2 59
  • 动态调试 一、什么是动态调试 动态调试就是将程序运行起来,通过打断点、打印等方式,查看参数、返回值、函数调用流程等...
    冰风v落叶阅读 9,604评论 0 3
  • 在互联网飞速发展的今天,相信很多程序开发者对 GitHub 很熟悉,我们在这里学习知识、分享自己的开源库或者开源代...
    腾飞Tenfay阅读 8,595评论 0 6
  • 本章中我们会在越狱手机上对APP进行调试,我们将进行下面几个内容的探索:1、将自定义.cy文件引入到手机磁盘,连接...
    Jax_YD阅读 3,982评论 0 1