Unidbg模拟执行某段子so实操教程(二) LoadSo对比

news2024/11/26 20:30:44

一、目标

上篇文章里面,我们跑出来的结果有点不对头,多个一个 ABC

这次我们试试用 LoadSo的方式来排查下问题。

参考: [借鸡生蛋之SandHook的使用(一)]

二、步骤

我们先用Android Studio 4.0 来编译一个so

打开AS,然后用向导创建一个 Native C++ 工程。

然后创建 /xxx/app/src/main/jniLibs/armeabi-v7a 目录,把我们要分析的 libnet_crypto.so 复制进去

调用下试试

仿照 Jadx分析的结果,把 com.ixxixx.network.NetCrypto 类创建好

package com.ixxixxx.network;

public class NetCrypto {// static {public static void loadso(){try {System.loadLibrary("net_crypto");}catch(Throwable ex){ex.printStackTrace();}native_init();}public static native byte[] decodeAES(byte[] bArr, boolean z);public static native byte[] encodeAES(byte[] bArr);public static native String generateSign(byte[] bArr);public static native String getProtocolKey();public static native void native_init();public static native boolean registerDID(byte[] bArr);public static native void setProtocolKey(String str);public static native String sign(String str, byte[] bArr);
} 

编译一下,没问题,编译通过。

跑一下

java.lang.ClassNotFoundException: Didn't find class "com.ixxixx.common.base.BaseApplication" on path: DexPathList 

找不到 #BaseApplication# 这个类,我们也把他补齐

public class BaseApplication extends Application {private static Context context;public void onCreate() {super.onCreate();BaseApplication.context = getApplicationContext();}public static Context getAppContext() {return BaseApplication.context;}
} 

再运行一下,直接跑起来了,结果正常 v2-1ff7402d2b4fa9a4c39b3853262f18fd

这下尴尬了

我们之前用unidbg跑的出来的结果不正常,多一个 ABC, 现在直接LoadSo跑出来的结果是对的?为什么?

我们回忆一下,用Unidbg跑的时候,首先补齐了 BaseApplication,然后 补齐了 AppLogReporterandroid/os/Debug->isDebuggerConnected()

说明 Unidbg跑的时候被 so识别出来了不是真实环境, isDebuggerConnected 是判断程序有没有被调试器连接, 这个好验证呀,我们在调试模式下跑一下 LoadSo就行了。

java.lang.ClassNotFoundException: Didn't find class "cn.xiaochuankeji.tieba.common.debug.AppLogReporter" on path 

果然不出所料,在调试模式下,不仅结果输出 v2-ABC1ff7402d2b4fa9a4c39b3853262f18fd , 而且还提示 AppLogReporter 类不存在。

真相只有一个 so在执行过程中,判断是否是真实环境,比如是否被调试,是否是真机,如果发现环境不对,就在结果中加入ABC。

那好吧,可以收工了,还是按照昨天计划的玩法,Unidbg跑出结果之后,把 ABC 过滤掉。

继续分析

这次的so比较良心,也就加了个 ABC,而且长度和真实签名不一样,我们一眼都能看出来。

这要是让李老板来设计,发现环境不对之后,返回同样长度的签名串,到服务器也可以验证,这个是灰度用户,然后给他返回假数据。 那就比较棘手了。

所以正好继续拿这个so练练手,再分析分析,以后遇到类似的情况,也知道如何排雷了。

先把 AppLogReporter 类补齐,然后再用 SandHook 来hook这个 isDebuggerConnected

补齐 AppLogReporter

import android.util.Log;

public class AppLogReporter {public static void reportAppRuntime(String str, String str2) {String strOut = str + " ---- " + str2;Log.i("ZYDBG", strOut);}
} 

Hook isDebuggerConnected ,直接返回 False

@HookClass(Debug.class)
public class OsDebug {@HookMethodBackup("isDebuggerConnected")static Method onIsDebuggerConnectedBackup;@HookMethod("isDebuggerConnected")public static boolean onIsDebuggerConnected() throws Throwable {boolean rc = (boolean)SandHook.callOriginByBackup(onIsDebuggerConnectedBackup,null);Log.e("ZYDBG OsDebug", "hooked isDebuggerConnected success rc= " + rc );return Boolean.FALSE;}

} 

继续调试状态下运行, 结果还是带 ABC

这是为什么呢? 我们看看 Logcat

I/ZYDBG: runtiem ---- traced 

原来又被发现 traced ,这时我们回想一下,Unidbg跑的时候 reportAppRuntime 函数的输出是 “invalid application name: izxxyxx”

这个so还真是不错,反Unidbg的样本。 搞错了 还会用 reportAppRuntime 来提示我们错在哪?

敲黑板,留作业

那么正好给大家留个作业,把这个so的反Unidbg和反调试部分,分析清楚,最后用Unidbg跑出正确的结果。

方法就是 LoadSo和Unidbg两个工程互相对照。 比如 Unidbg里面跑的时候调用了 getSimpleName 来获取名称,我们模拟的时候就随便写了个 izxxyxx,被发现了。 那么就在 LoadSo 这个工程里面来 hook getSimpleName ,看看正确的结果是什么。

这样一步一步向真实靠拢。

三、总结

假到真时真亦假,安全对抗的时候就是比拼耐心,互相给对方挖坑埋雷。挖的坑要深点,雷要迷惑性强点。偶尔可以给对方一个甜头,让他以为搞定收工。实际后面还有千转百绕。

最后谁坚持不住放弃了,谁就输了。

那些花半秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯STM32G431RBT6学习——按键

蓝桥杯STM32G431RBT6学习——按键 前言 按键同样为每年的必考考点,国信长天开发板中的按键电路如下: 芯片的PA0、PB0、PB1、PB2作为按键输入引脚,并采用外部上拉连接,当对应引脚检测到低电平时,即按键被按下。 STM…

【2293. 极大极小游戏】

来源:力扣(LeetCode) 描述: 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则&#xf…

【自学Docker】Docker环境命令

Docker info命令 Docker info命令概述 用于查看 docker 容器的基本信息。 Docker info命令语法 haicoder(www.haicoder.net)# docker info案例 查看所有信息 使用 docker info 命令,查看当前 docker容器 的所有的信息。 haicoder(www.haicoder.net)# docker …

系分 - 案例分析 - 数据库设计(分布式)

个人总结,仅供参考,欢迎加好友一起讨论 文章目录系分 - 案例分析 - 数据库设计(分布式)分布式数据库系统透明性分类两阶段提交协议2PC分区分表分库分区技术数据库主从复制NoSQL非关系型数据库与关系型数据库对比类型缓存技术Redis…

git恢复误删除的代码模块

git恢复误删除的代码模块前言环境问题描述原先的仓库详情:最新的仓库详情:问题解决注意事项前言 寒假回家边聊天边进行代码上传,出现了冲突之后,不小心删除了一大片代码。这里记录一下解决方案。 环境 IDEA、Git 问题描述 代…

Cesium实战记录(八)三维风场+风速热力图(水平+垂直)

目录 老规矩首先看下效果 一、风场 1、数据 2、原理剖析 首先,第一步就是构造网格数据 然后,撒粒子 再然后,起风吧 二、热力场 老规矩首先看下效果 风场v1.0(平面版,只有U V 方向风速) 三维风场&am…

JS逆向之补环境过瑞数详解

JS逆向之补环境过瑞数详解 “瑞数” 是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!! 好在现在网上有很多讲解瑞数相关的文章,贴心的一步…

英伟达Flex-unity插件

好像有这么个库,可以用来流体仿真 官网是这个:NVIDIA FleX | NVIDIA 开发者 问题 但是现在好像没了: NVIDIA FleX for Unity (1.0 BETA) | 物理 | Unity Asset Store 百度 Unity 8.Oct.2021 Unfortunately, NVIDIA FleX for Unity (1.0 …

完美Crack:Froala Editor 4.0.16 Patch

基于 Web 的 JavaScript/HTML WYSIWYG 文本编辑器。 Froala Editor 是一个用 JavaScript 编写的轻量级 WYSIWYG HTML 编辑器,可为您的应用程序启用富文本编辑功能。使用简单,许多功能不必用数百个按钮让用户不知所措。编辑器的智能工具栏可以在一个简单的…

ESP-IDF:基于企业链表实现的循环链表实例,实现了初始,插入,循环打印的功能

例程: /* circle链表基于企业链表*/ // 链表节点 typedef struct CIRCLENODE { CIRCLENODE *next; } circleNode; typedef struct CIRCLELIST { circleNode head; int size; } circleList; circleList *Inital_CircleList() { circleList *cp (circleList *)mal…

LeakCanary简要原理

首先需要知道ReferenceQueue&#xff08;引用队列&#xff09;&#xff1a;public static void main(String[] args) {Activity activity new Activity(); // 模拟ActivityReferenceQueue<Activity> queue new ReferenceQueue<>(); // 引用队列WeakReference<…

从汇编的角度了解C++原理——new和malloc的区别

文章目录1、new和malloc的区别1.1、例程1.2、总结本文用到的反汇编工具是objconv&#xff0c;使用方法可以看我另一篇文章https://blog.csdn.net/weixin_45001971/article/details/128660642。 其它文章&#xff1a; 从汇编的角度了解C原理——类的储存结构和函数调用 从汇编的…

【索引】引用A survey on pickup and delivery problems的文章

1. Dynamic container drayage with uncertain request arrival times and service time windows⭐️ 具有不确定请求到达时间和服务时间窗口的动态集装箱运输 Container drayage plays a critical role in intermodal global container transportation, as it accomplishes th…

hud 1846巴什博弈(简单的解法 或 Sprague-Grundy解法)

各位勇敢者要玩的第一个游戏是什么呢&#xff1f;很简单&#xff0c;它是这样定义的&#xff1a; 1、 本游戏是一个二人游戏; 2、 有一堆石子一共有n个&#xff1b; 3、 两人轮流进行; 4、 每走一步可以取走1…m个石子&#xff1b; 5、 最先取光石子的一方为胜&#xff1b; 如…

不懂Token,就是别说自己是中级测试工程师

官方回答&#xff1a; Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证&#xff0c;服务端认证成功&#xff0c;那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。 基于工程师的理解&#xff1a; token就相当于客户…

Go语言初始

"当我回头&#xff0c;妄想找到幸福的线索&#xff0c;那束光拉长我的影子&#xff0c;逃离我。"一、Go简介Go&#xff08;又称 Golang&#xff09;是 Google 的 Robert Griesemer&#xff0c;Rob Pike 及 Ken Thompson 开发的一种静态强乐西、编译型语言。Go 语言语…

Unicorn反混淆:恢复被OLLVM保护的程序(一)

一、目标 现在很多程序利用ollvm的控制流平坦化来增加逆向分析的难度。 控制流平坦化 (control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程&#xff0c;例如下图是正常的执行流程 1:show1 经过控制流平坦化后的执行流程就如下图: 1:show2 …

RT-Thread系列--启动过程

一、目的RT-Thread是一个小而美的RTOS&#xff0c;所有的RTOS的都有一个特点&#xff0c;那就是存在调度器&#xff0c;像RT-Thread的调度器是一个实时抢占式调度器&#xff08;同优先级任务使用时间片调度方式&#xff09;。本篇不讲调度器相关的内容&#xff0c;着重讲解调度…

【博客591】LVS的DR和NAT模式下要注意的缺陷

LVS的DR和NAT模式下要注意的缺陷 1、DR模式和NAT模式的转发原理 2、LVS的DR和NAT模式下要注意的缺陷 缺陷1&#xff1a;DR模式下的realserver和 lvs的vip提供服务的端口必须一致。 例如vip的端口对外端口为 80&#xff0c;但后端服务的真实端口为8080&#xff0c;通过lvs的D…

SpringBoot快速上手

SpringBoot 概述 Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可以“直接运行”。 特征 创建独立的 Spring 应用程序 直接嵌入Tomcat&#xff0c;Jetty或Undertow&#xff08;无需部署WAR文件&#xff09; 提供固执己见的“入门”依赖项…