吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 662|回复: 7
收起左侧

[其他求助] unidbg模拟执行so返回null 大佬帮看看

[复制链接]
还在学习呢 发表于 2024-5-29 14:52
25吾爱币


小白不太懂 大佬帮忙看看

用unidbg模拟执行so中的方法返回空


类:  com.tencent.mobileqq.qsec.qsecurity.QSec 方法:  getXwDebugID 签名:  (Ljava/lang/String;)[B 函数地址:  0x7f6396454c 模块名:  libfekit.so 函数偏移:  0xd554c


[Java] 纯文本查看 复制代码
public String getXwDebugID(String user) {
        ByteArray result_string = Class_QSec.newObject(null).callJniMethodObject(emulator, "getXwDebugID(Ljava/lang/String;)[B"
                , new StringObject(vm, user)
        );
        return result_string == null ? "加密错误" : byteToHex(result_string.getValue());
    }



IDA pro
[Java] 纯文本查看 复制代码
__int64 __fastcall sub_D554C(jobject a1)
{
  unsigned __int64 v2; // x1
  __int64 v3; // x0
  __int64 v4; // x19
  __int64 v5; // x3
  _BYTE *v6; // x4
  unsigned __int8 v8; // [xsp+0h] [xbp-20h]
  _BYTE v9[7]; // [xsp+1h] [xbp-1Fh] BYREF
  unsigned int v10; // [xsp+8h] [xbp-18h]
  void *ptr; // [xsp+10h] [xbp-10h]
  __int64 v12; // [xsp+18h] [xbp-8h]

  v12 = *(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);
  sub_647A4();
  if ( (v8 & 1) != 0 )
    v2 = v10;
  else
    v2 = v8 >> 1;
  v3 = (*(*a1 + 1408LL))(a1, v2);
  v4 = v3;
  if ( (v8 & 1) != 0 )
    v5 = v10;
  else
    v5 = v8 >> 1;
  if ( (v8 & 1) != 0 )
    v6 = ptr;
  else
    v6 = v9;
  (*(*a1 + 0x680LL))(a1, v3, 0LL, v5, v6);
  if ( (v8 & 1) != 0 )
    operator delete(ptr);
  return v4;
}


unidbg中的返回值
[Java] 纯文本查看 复制代码
JNIEnv->FindClass(com/tencent/mobileqq/qsec/qsecest/QsecEst) was called from RX@0x4007e8c4[libfekit.so]0x7e8c4
JNIEnv->NewGlobalRef(class com/tencent/mobileqq/qsec/qsecest/QsecEst) was called from RX@0x4007eabc[libfekit.so]0x7eabc
JNIEnv->GetStaticMethodID(com/tencent/mobileqq/qsec/qsecest/QsecEst.p(Landroid/content/Context;I)Ljava/lang/String;) => 0x747ab66c was called from RX@0x4007e97c[libfekit.so]0x7e97c
Find native function Java_com_tencent_mobileqq_qsec_qsecurity_QSec_getXwDebugID => RX@0x400d554c[libfekit.so]0xd554c
JNIEnv->NewByteArray(0) was called from RX@0x400d55a0[libfekit.so]0xd55a0
JNIEnv->SetByteArrayRegion([B@0x, 0, 0, unidbg@0xbffff6b1) was called from RX@0x400d55dc[libfekit.so]0xd55dc

res1  --->  


最后出现了NewByteArray(0)和SetByteArrayRegion([B@0x, 0, 0, unidbg@0xbffff6b1)

求大佬帮助{:301_972:}


最佳答案

查看完整内容

恩对,用emulator.getbackend()hook patch一下

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

4561fef 发表于 2024-5-29 14:52
恩对,用emulator.getbackend()hook  patch一下
 楼主| 还在学习呢 发表于 2024-5-29 15:03
4561fef 发表于 2024-5-29 16:51
返回值不是你那样拿的
      byte[] b = (byte[]) Class_QSec.newObject(null).callJniMethodObject(emulator, "getXwDebugID(Ljava/lang/String;)[B"
                , new StringObject(vm, user)
        ).getValue();
System.out.println(new String(b));      
0.97版本的unidbg
 楼主| 还在学习呢 发表于 2024-5-29 17:14
4561fef 发表于 2024-5-29 16:51
返回值不是你那样拿的
      byte[] b = (byte[]) Class_QSec.newObject(null).callJniMethodObject(emula ...

同样时返回空,在ida看感觉是v8的原因   是不是缺少初始化什么的
4561fef 发表于 2024-5-29 17:39
你这个样本简单,这个函数看不需要调用他初始化函数,直接patch就可以
 楼主| 还在学习呢 发表于 2024-5-29 21:25
4561fef 发表于 2024-5-29 17:39
你这个样本简单,这个函数看不需要调用他初始化函数,直接patch就可以

大佬可以帮忙看看吗, 刚接触逆向实在不懂,这种情况网上也没有案例

链接:https://pan.baidu.com/s/1ptNr0JyWh3zS2E09FVsX3g?pwd=zw5m
提取码:zw5m
4561fef 发表于 2024-5-29 21:50
正常情况你得先去用frida hook一下 ,看看  ida中看到那个v8在运行时候的值是多少。
把下面这段写在 loadlibrary后面
        emulator.getBackend().addBreakPoint(0x400d5584L, new BreakPointCallback() {
            @Override
            public boolean onHit(Emulator<?> emulator, long address) {
                emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_W9,100);
                return true;
            }
        },false);
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-11 16:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表