某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg

最近在学习中发现一个Chomper框架,Chomper 是一个模拟执行iOS可执行文件的框架,类似于安卓端大名鼎鼎的Unidbg。

这篇文章使用Chomper模拟执行某手的sig3算法,初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的hook操作、读取操作等。

框架搭建

chomper 使用python开发,这里直接使用pip安装 pip install chomper (mac的m系列芯片,可能需要再自己电脑编译unicorn并安装)

下载chomper中rootfs​ 放在项目录下 如下:

基础代码如下:

import os

from chomper import Chomper
from chomper.const import ARCH_ARM64, OS_IOS
from chomper.objc import ObjC
from chomper.utils import pyobj2nsobj
from chomper.os.ios.hooks import register_hook
from unicorn import arm64_const

base_path = os.path.abspath(os.path.dirname(__file__))


def trace_inst_callback(self, uc, address, size, user_data):
    for inst in self.cs.disasm_lite(uc.mem_read(address, size), 0):
        self.logger.info(
            f"Trace at {self.debug_symbol(address)}: {inst[-2]} {inst[-1]}"
        )

        message = ""
        for i in range(31):
            if message:
                message += ", "
            message += f"x{i}={hex(self.uc.reg_read(getattr(arm64_const, f'UC_ARM64_REG_X{i}')))}"
        self.logger.info(message)


Chomper.trace_inst_callback = trace_inst_callback #这里是用来trace代码
#加载ios基础库支持。
emu = Chomper(
    arch=ARCH_ARM64,
    os_type=OS_IOS,
    rootfs_path=os.path.join(base_path, "rootfs/ios"),
    enable_ui_kit=True, #开启ui_kit库支持,
)

objc = ObjC(emu)

某手核心算法调用

这里不再分析sig3怎么来的,以及如何构造的,如果需要请看兔哥公众号文章。https://mp.weixin.qq.com/s/JG56KxPC7s3oSvoGkQVBRQ

算法加载流程如下:根据frida-trace得

+[KWSecurity defaultInterface]
 22578 ms  -[KWSecurity atlasSign:/rest/app/square/home/mall/tab/dynamic/feed87fa757cb702565b6afa61de4f5f9617]
 22582 ms     | +[KWSecuritySignature atlasSignPlus:0x2852e18c0 isInner:0x0 sdkid:0x10eb67638 sdkName:0x10eb67638 ztconfigFilePath:0x10eb67638]
 22582 ms     |    | +[KWOpenSecurityGuardManager getInstance]
 22582 ms     |    | -[KWOpenSecurityGuardManager getSecureSignatureComp]
 22582 ms     |    |    | -[KWOpenSecurityGuardManager getComponent:0x0]
 22582 ms     |    |    |    | +[KWOpenComponentLibrary getInstance]
 22582 ms     |    |    |    | -[KWOpenComponentLibrary getComponent:0x0]
 22582 ms     |    |    |    |    | -[KWOpenComponentLibrary sdkDict]
 22582 ms     |    | +[KWOpenSecurityGuardParamContext createParamContextWithAppKey:d7b7d042-d4f2-4012-be60-d97ff2429c17 paramDict:nil requestType:0x1 input:{
   
   length = 75, bytes = 0x2f726573 742f6170 702f7371 75617265 ... 34663566 39363137 } wbindexKey:lD6We1E8i bInnerInvoke:0x0 sdkid: sdkName: ztconfigFilePath:]
 22589 ms     |    |    | -[KWOpenSecurityGuardParamContext setAppKey:0x100932dd8]
 22589 ms     |    |    | -[KWOpenSecurityGuardParamContext setWbindexKey:0x100932df8]
 22589 ms     |    |    | -[KWOpenSecurityGuardParamContext setParamDict:0x0]
 22590 ms     |    |    | -[KWOpenSecurityGuardParamContext setRequestType:0x1]
 22590 ms     |    |    | -[KWOpenSecurityGuardParamContext setInput:0x2876d4e70]
 22590 ms     |    |    | -[KWOpenSecurityGuardParamContext setOutput:nil
### 动实现 GCC-PHAT 算法 GCC-PHAT (Generalized Cross-Correlation with Phase Transform) 是一种用于估计两个信号之间时延的技术,在声源定位等领域有广泛应用。该方法通过计算两路音频信号之间的互相关函数并应用相位变换来提高延迟估计精度。 对于动实现 GCC-PHAT 的过程可以分为几个部分处理: - **傅里叶变换**:将输入的时间域信号转换到频域表示形式。 - **交叉谱密度计算**:基于频率响应求解两个信号间的交叉功率谱密度。 - **相位变换**:对得到的结果施加特定的权重因子,即 PHAT 权重。 - **逆傅里叶变换**:最后再把经过处理后的数据变回时间轴上以便找到最大值对应的位置作为估计出来的相对延迟量。 下面给出 Python 实现的一个简单例子[^1]: ```python import numpy as np from scipy import signal, fftpack def gcc_phat(sig, refsig, fs=1, max_tau=None, interp=16): ''' sig 和 refsig 应当是长度相同的向量序列 ''' # 计算FFT大小以及填充零的数量 n = sig.shape[0] m = refsig.shape[0] SIG = fftpack.fft(sig, n=n * interp) REFSIG = fftpack.fft(refsig, n=n * interp) R = SIG * np.conj(REFSIG) cc = fftpack.ifft(R / abs(R)) max_shift = int(interp * n / 2) if max_tau: max_shift = min(int(max_tau * fs), max_shift) cc = np.concatenate((cc[-max_shift:], cc[:max_shift + 1])) # 寻找峰值位置 shift = np.argmax(np.abs(cc)) - max_shift tau = shift / float(fs * interp) return tau, cc ``` 此代码片段实现了基本功能,可以根据实际应用场景调整参数设置以优化性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值