某车联网App 通讯协议加密分析(四) Trace Code

一、目标

之前我们已经通过Trace Block 来比对了Unidbg和App跑的结果。现在他们运行的流程都差不多了,但是结果还是不对,今天我们就要通过Trace Code进行更细致的对比。

v6.1.0

二、步骤

缩小Trace的范围

Trace Code那么好使,我们为什么不一上来就Trace一遍?

因为Trace Code的粒度太细了,一上来就搞,跑出几百万行结果,根本没法看。

我们通过Trace Block已经在逐步缩小范围了。

JNIEnv->GetStringUtfChars("FlK6XicivmCwPSE3sk6b71m9WbWd/gYZtlajqGXhEXXjmWEZziR51rVWSEDwUUi4UN9RnoCGbLNmqI80Fiog4Sw==") was called from RX@0x4002b744[libencrypt.so]0x2b744sub_2b8b8sub_2b800sub_2b800sub_2b800sub_2b800sub_2b828sub_ab6csub_a528sub_ab9csub_a848sub_a7e8sub_a7c4sub_8ee4sub_7334sub_8f40sub_95e0
 ........sub_a7c4sub_8ee4sub_7334sub_8f40sub_96bcsub_9a2csub_9268sub_a818sub_a90csub_a928sub_2b854
JNIEnv->ReleaseStringUTFChars("FlK6XicivmCwPSE3sk6b71m9WbWd/gYZtlajqGXhEXXjmWEZziR51rVWSEDwUUi4UN9RnoCGbLNmqI80Fiog4Sw==") was called from RX@0x4002b86c[libencrypt.so]0x2b86c 

我们的目标大概率是在 0x7000 → 0xa000 这个地址范围之类。

定位Trace Code目标

翻一翻IDA里面的导出表

1:ida

比较合眼缘的就这三个了,0x7184 ,0x77A4 貌似都没有被Trace Block命中,感觉幕后大boss应该就是这个 0x8EE4

Tip:

可以在怀疑的几个函数上加个hook,看看是否命中。

Unidbg Trace Code

emulator.attach().addBreakPoint(module.base + 0x8EE4, new BreakPointCallback() {@Overridepublic boolean onHit(Emulator<?> emulator, long address) {System.out.println(" ====== traceCode ====== ");UnidbgPointer pX = UnidbgPointer.register(emulator, Arm64Const.UC_ARM64_REG_X1);byte[] bData = pX.getByteArray(0,16);String strLabel = String.format("x0值 0x%08x", pX.peer);Inspector.inspect(bData,strLabel);try {emulator.traceCode(module.base + 0x8EE4, module.base + 0x9C0C).setRedirect(new PrintStream(new File("traceCodeCar.log")));} catch (IOException e) {throw new IllegalStateException(e);}return true;});

} 

先在 0x8EE4 加个断点,然后开始Trace Code。 参数是Trace的起始地址和结束地址,已经保存的结果文件。

从这个Trace结果来看,每16个字节去做解密。典型的AES。

Frida Trace Code

Stalker的好处很多,最大的功能是可以过反调试,所以基于Stalker去写Trace Code,写了好几个版本,一直不大满意。

前几天发现了

github.com/IIIImmmyyy/…

比较帅,拿来改了改。效果很好。(只支持Arm64)

let moduleBase;
let isFirstIn = true;
let pre_regs;
let infoMap = new Map();
let detailInsMap = new Map();

function parserNextAddr(ins) {let s = JSON.stringify(ins);let address = ins.address;// log("address:"+address)let offset = address - moduleBase;let s1 = (offset).toString(16);let entity = {};entity.address = offset;return s1;
}

const byteToHex = [];
for (let n = 0; n <= 0xff; ++n) {const hexOctet = n.toString(16).padStart(2, "0");byteToHex.push(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值