【iOS逆向与安全】iOS插件开发入门

这篇具有很好参考价值的文章主要介绍了【iOS逆向与安全】iOS插件开发入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
经过之前的学习,相信你已经能熟练的使用Frida-trace、IDA Pro等逆向工具。不过,仅仅到这肯定是不够的。接下来,学会把你逆向的结果打包成插件并运行,那iOS逆向,你也就真正的入门了。

一、目标
把逆向的结果制作成插件并运行

二、工具

mac系统

Xcode:插件开发工具

已越狱iOS设备:运行deb插件

optool:动态库注入工具,下载地址:optool
MonkeyDev:越狱插件开发集成神器,下载地址:MonkeyDev

三、流程
iOS端的插件按设备分为

越狱插件:扩展名为.deb,类似于安卓的xposed插件

优点:独立于ipa文件,ipa可单独升级(前提是相关的 hook代码逻辑没变)

缺点:必须要越狱设备

非越狱插件:扩展名为.dylib或.framework,类似于安卓的so文件

优点:可在非越狱机上运行。由于非越狱机,App自然也就检测不到越狱状态,但仍然可以检测ipa包的完整性

缺点:ipa无法单独升级,必须要砸壳,动态库注入,重签名后,才能完成升级操作。

注:不管是deb格式、dylib格式还是framework格式,都支持使用c、c++和OC语言进行开发

MonkeyDev,原有iOSOpenDev的升级,非越狱插件开发集成神器!

可以使用Xcode开发CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,这是原	来iOSOpenDev功能的迁移和改进。
只需拖入一个砸壳应用,自动集成class-dump、restore-symbol、Reveal、Cycript和注入的动态库并重签名安装	到非越狱机器。
支持调试自己编写的动态库和第三方App
支持通过CocoaPods第三方应用集成SDK以及非越狱插件,简单来说就是通过CocoaPods搭建了一个非越狱插件商店。
所以在本教程中,deb插件和dylib插件,主要使用MonkeyDev来完成,安装教程参考官方即可。而framework插件,则直接使用Xcode开发。

deb插件开发

  1. 创建插件工程

启动Xcode后,按如下流程依次点击:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门

【iOS逆向与安全】iOS插件开发入门

【iOS逆向与安全】iOS插件开发入门

【iOS逆向与安全】iOS插件开发入门

至此,插件已经创建完毕:

【iOS逆向与安全】iOS插件开发入门

2. 编写插件代码

创建完这是MonkeyDev作者写的使用步骤

// Objective-C runtime hooking using CaptainHook:

// 1. declare class using CHDeclareClass()

// 2. load class using CHLoadClass() or CHLoadLateClass() in CHConstructor

// 3. hook method using CHOptimizedMethod()

// 4. register hook using CHHook() in CHConstructor

// 5. (optionally) call old method using CHSuper()

咱按以上步骤编写完的插件代码如下:

#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif

// 导入常用的UI框架和Foundation框架
#import "AppHelper.h"	// 注意,一定要导入这,因为这头文件里有Monkey dev定义的宏
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

// 导入MonkeyDev提供的头文件,这头文件,后边我们创建framework插件时也可使用
#import "CaptainHook/CaptainHook.h"

/*
 定义你需要Hook的类及需要Hook的方法。
 */
@interface DetailViewController : NSObject

// 需要Hook的实例方法
- (void)loginButtonDidClick:(UIButton *)sender;

// 以下两个方法并不存在,在这只是为了演示如何hook多个参数的方法和hook类方法
- (NSString *)loginWithPhone:(NSString *)phone password:(NSString *)pwd;
+ (id)factory:(id)arg1;

@end

CHDeclareClass(DetailViewController); // 步骤1、申明需要Hook的类

/*
 步骤3、你的勾子函数,Hook函数被调用时,会执行到这

 CHOptimizedMethod的参数说明
 第一个参数:固定写死self即可
 第二个参数:返回值类型,无返回值写void。c语言的类型,直接写对应的类型即可(int,float,double...)。其他类型,直接写id即可,如果你知道具体的类型,也可写具体的类型
 第三个参数:类名
 第四个参数:方法名
 // 方法名有一个参数时
 第五个参数:第一个入参的类型,和第二个参数写法类型
 第六个参数:第一个入参的形参名
 // 方法名有两个参数时
 第七个参数:第二个入参的类型,和第二个参数写法类型
 第八个参数:第二个入参的形参名
 ...
*/
CHOptimizedMethod1(self, void, DetailViewController, loginButtonDidClick, UIButton*, sender) {
    CHSuper1(DetailViewController, loginButtonDidClick, sender);  // 调用原方法
    NSLog(@"witchan =该方法的入参为:%@", sender);
}

// Hook两个入参的实例方法
CHOptimizedMethod2(self, id, DetailViewController, loginWithPhone, NSString *, p, password, NSString*, pwd) {
    id result = CHSuper2(DetailViewController, loginWithPhone, p, password, pwd); // 调用原方法
    NSLog(@"witchan =该方法的第一个入参为:%@", p);
    NSLog(@"witchan =该方法的第二个入参为:%@", pwd);
    NSLog(@"witchan =该方法的返回值为:%@", result);

    return result;
}

// Hook一个入参的类方法,相对于实例方法,只是在Method前多了个Class单词。其他操作完全一样
CHOptimizedClassMethod1(self, id, DetailViewController, factory, id, arg1) {
    id result = CHSuper1(DetailViewController, factory, arg1);  // 调用原方法
    NSLog(@"witchan =该方法的入参为:%@", arg1);
    NSLog(@"witchan =该方法的返回值为:%@", result);
    
    /* 
     由于deb格式、dylib格式还是framework格式,都支持使用c、c++和OC语言进行开发。
     以下代码为oc语法的简单示例。
     注意:整个插件的写法,和ios开发完全一致,你可以创建新类,也可以调用oc提供的类及相关方法
     如果你不熟悉oc语法,请看我公众号的另一篇文章,iOS快速入门:https://mp.weixin.qq.com/s/g89Sdyqc4ONlyAWtXTCwRA
     */
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"微信公众号"] = @"移动端Android和iOS开发技术分享";
    params[@"QQ群"] = @"812546729";
    
    NSData *body = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
    
    // 调用登录接口
    NSURL *loginURL = [NSURL URLWithString:@"https://127.0.0.1:9080/login"];    // 接口
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:loginURL]; // 请求对象
    request.HTTPMethod = @"POST";    // 请求方式
    [request setValue:@"d83kd9d323" forHTTPHeaderField:@"x-sign"];   // 设置header
    request.HTTPBody = body;    // 注意,HTTPBody是一个16进制数据,一般直接16进制输出,再转换成文本查看
    
    NSURLSession *session = [NSURLSession sharedSession];   // 获取网络对象
    NSURLSessionTask *task = [session dataTaskWithRequest:request
                                        completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 请求结果会调到这
        
        if (error != nil) {
            NSLog(@"witchan =网络请求出错了");
        } else {
            NSLog(@"witchan =网络请求成功");
        }
        
    }]; // 创建请求任务
    [task resume];  // 发起网络请求
    
    return result;
}

// 入口函数
CHConstructor
{
	@autoreleasepool
	{
        NSLog(@"witchan =FirsDeb hook success!=");    // 一般在入口函数输出一条日志,确定你的插件是否加载成功
        CHLoadLateClass(DetailViewController);  // 步骤2、加载需要Hook的类
        CHHook1(DetailViewController, loginButtonDidClick); // 步骤4、注册你需要hook的实例方法
        CHHook2(DetailViewController, loginWithPhone, password);
        CHClassHook1(DetailViewController, factory);    // 注册需要hook的类方法
	}
}

填写目标ipa的包名:
【iOS逆向与安全】iOS插件开发入门

编辑插件扩展信息(可选):
【iOS逆向与安全】iOS插件开发入门

3. 编译插件
编译:依次选择菜单栏的Product → Build
【iOS逆向与安全】iOS插件开发入门
编译后的结果是这样的:
【iOS逆向与安全】iOS插件开发入门
打开目录,就能看到你需要的deb文件了
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
*安装方式1:**拿到deb文件后,你可以用爱思或ssh工具,把deb文件换过血到手机,再使用Filza工具找到对应的文件,安装即可:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
安装方式2: 如果你是mac电脑,那你可使用隔空投送功能来把deb文件传输至手机并安装:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
**安装方式3:**是不是觉得上边的安装方式有点麻烦,如果是自己真机调试,那你可以这样玩:
【iOS逆向与安全】iOS插件开发入门
然后依次选择菜单栏的Product → Build或快捷键command+b,这次编译完成后,没有报错。并且你的手机已自动注销了。打开cyida查看你最近安装的deb,就会发现刚编写的插件已经安装成功,简单吧。

在电脑端打开控制台工具:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门

这时启动被注入deb插件的App后,看到的日志如下:
【iOS逆向与安全】iOS插件开发入门

如果你编辑时,遇到这错误:

An empty identity is not valid when signing a binary for the product type ‘Dynamic Library’.
【iOS逆向与安全】iOS插件开发入门
解决办法:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门

2.dylib插件使用

在deb插件开发教程中,我们已经同时得到了deb插件和dylib插件,所以在本教程中,则教大家如何把dylib插件注入到ipa,注入工具为optool,该工具主要有两条命令:

注入:optool install -c load -p “@executable_path/Frameworks/aaa.framework/aaa” -t demo.app/demo

卸载:optool uninstall -p “@executable_path/Frameworks/aaa.framework/aaa” -t demo.app/demo

把ipa文件的扩展名改为zip,解压后,得到Payload文件夹:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
切换到Payload目录cd Desktop/Payload,然后执行注入命令optool install -c load -p “@executable_path/Frameworks/FirstDeb.dylib” -t ExampleCode.app/ExampleCode,至此,我们的dylib文件已经注入完成:

witchan@witchandeMacBook-Air Payload % optool install -c load -p "@executable_path/Frameworks/FirstDeb.dylib" -t ExampleCode.app/ExampleCode
Found thin header...
Inserting a LC_LOAD_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_DYLIB command for arm64
Writing executable to ExampleCode.app/ExampleCode...
witchan@witchandeMacBook-Air Payload %

接下来将Payload文件夹压缩成zip包,然后把扩展名改为ipa,然后用爱思,或其他重签名工具对该ipa进行签名后,即可在越狱或非越狱机上安装使用了。运行后的日志如下:
【iOS逆向与安全】iOS插件开发入门
3.Framework插件开发
1. 创建插件工程

启动Xcode后,按如下流程依次点击:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
2. 编写插件代码

创建AppHelper类
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
创建完成后的目录结构如下:
【iOS逆向与安全】iOS插件开发入门
在这。我们使用之前的deb插件编写方式来写。先把CaptainHook.h文件的所有内容复制到AppHelper.h:
【iOS逆向与安全】iOS插件开发入门
复制整个头文件的内容到AppHelper.h即可。然后把deb插件.m文件的全部代码复制到AppHelper.m,再在.m文件的顶部引入AppHelper.h文件,然后剩下的代码编写方式就和deb的编写完全一样。

最终的AppHelper.h的完整代码如下:

由于该文件较大,在这进行删除,完整代码请看文末。
AppHelper.m的完整代码如下(和deb相比,只多了#import “AppHelper.h”):

#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif

// 导入常用的UI框架和Foundation框架
#import "AppHelper.h"	// 注意,一定要导入这,因为这头文件里有Monkey dev定义的宏
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

// 导入MonkeyDev提供的头文件,这头文件,后边我们创建framework插件时也可使用
#import "CaptainHook/CaptainHook.h"

/*
 定义你需要Hook的类及需要Hook的方法。
 */
@interface DetailViewController : NSObject

// 需要Hook的实例方法
- (void)loginButtonDidClick:(UIButton *)sender;

// 以下两个方法并不存在,在这只是为了演示如何hook多个参数的方法和hook类方法
- (NSString *)loginWithPhone:(NSString *)phone password:(NSString *)pwd;
+ (id)factory:(id)arg1;

@end

CHDeclareClass(DetailViewController); // 步骤1、申明需要Hook的类

/*
 步骤3、你的勾子函数,Hook函数被调用时,会执行到这

 CHOptimizedMethod的参数说明
 第一个参数:固定写死self即可
 第二个参数:返回值类型,无返回值写void。c语言的类型,直接写对应的类型即可(int,float,double...)。其他类型,直接写id即可,如果你知道具体的类型,也可写具体的类型
 第三个参数:类名
 第四个参数:方法名
 // 方法名有一个参数时
 第五个参数:第一个入参的类型,和第二个参数写法类型
 第六个参数:第一个入参的形参名
 // 方法名有两个参数时
 第七个参数:第二个入参的类型,和第二个参数写法类型
 第八个参数:第二个入参的形参名
 ...
*/
CHOptimizedMethod1(self, void, DetailViewController, loginButtonDidClick, UIButton*, sender) {
    CHSuper1(DetailViewController, loginButtonDidClick, sender);  // 调用原方法
    NSLog(@"witchan =该方法的入参为:%@", sender);
}

// Hook两个入参的实例方法
CHOptimizedMethod2(self, id, DetailViewController, loginWithPhone, NSString *, p, password, NSString*, pwd) {
    id result = CHSuper2(DetailViewController, loginWithPhone, p, password, pwd); // 调用原方法
    NSLog(@"witchan =该方法的第一个入参为:%@", p);
    NSLog(@"witchan =该方法的第二个入参为:%@", pwd);
    NSLog(@"witchan =该方法的返回值为:%@", result);

    return result;
}

// Hook一个入参的类方法,相对于实例方法,只是在Method前多了个Class单词。其他操作完全一样
CHOptimizedClassMethod1(self, id, DetailViewController, factory, id, arg1) {
    id result = CHSuper1(DetailViewController, factory, arg1);  // 调用原方法
    NSLog(@"witchan =该方法的入参为:%@", arg1);
    NSLog(@"witchan =该方法的返回值为:%@", result);
    
    /* 
     由于deb格式、dylib格式还是framework格式,都支持使用c、c++和OC语言进行开发。
     以下代码为oc语法的简单示例。
     注意:整个插件的写法,和ios开发完全一致,你可以创建新类,也可以调用oc提供的类及相关方法
     如果你不熟悉oc语法,请看我公众号的另一篇文章,iOS快速入门:https://mp.weixin.qq.com/s/g89Sdyqc4ONlyAWtXTCwRA
     */
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"微信公众号"] = @"移动端Android和iOS开发技术分享";
    params[@"QQ群"] = @"812546729";
    
    NSData *body = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
    
    // 调用登录接口
    NSURL *loginURL = [NSURL URLWithString:@"https://127.0.0.1:9080/login"];    // 接口
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:loginURL]; // 请求对象
    request.HTTPMethod = @"POST";    // 请求方式
    [request setValue:@"d83kd9d323" forHTTPHeaderField:@"x-sign"];   // 设置header
    request.HTTPBody = body;    // 注意,HTTPBody是一个16进制数据,一般直接16进制输出,再转换成文本查看
    
    NSURLSession *session = [NSURLSession sharedSession];   // 获取网络对象
    NSURLSessionTask *task = [session dataTaskWithRequest:request
                                        completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 请求结果会调到这
        
        if (error != nil) {
            NSLog(@"witchan =网络请求出错了");
        } else {
            NSLog(@"witchan =网络请求成功");
        }
        
    }]; // 创建请求任务
    [task resume];  // 发起网络请求
    
    return result;
}

// 入口函数
CHConstructor
{
	@autoreleasepool
	{
        NSLog(@"witchan =FirsFramework hook success!=");    // 一般在入口函数输出一条日志,确定你的插件是否加载成功
        CHLoadLateClass(DetailViewController);  // 步骤2、加载需要Hook的类
        CHHook1(DetailViewController, loginButtonDidClick); // 步骤4、注册你需要hook的实例方法
        CHHook2(DetailViewController, loginWithPhone, password);
        CHClassHook1(DetailViewController, factory);    // 注册需要hook的类方法
	}
}

3.编译Framework

然后依次选择菜单栏的Product → Build或快捷键command+b。再选择菜单栏的Product → Show Build Folder in Finder
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
4.framework插件使用

使用optool工具把framework插件注入到ipa,该工具主要有两条命令:

注入:optool install -c load -p “@executable_path/Frameworks/aaa.framework/aaa” -t demo.app/demo

卸载:optool uninstall -p “@executable_path/Frameworks/aaa.framework/aaa” -t demo.app/demo

把ipa文件的扩展名改为zip,解压后,得到Payload文件夹:
【iOS逆向与安全】iOS插件开发入门
【iOS逆向与安全】iOS插件开发入门
切换到Payload目录cd Desktop/Payload,然后执行注入命令optool install -c load -p “@executable_path/Frameworks/FirstFramework.framework/FirstFramework” -t ExampleCode.app/ExampleCode,至此,我们的framework文件已经注入完成:

witchan@witchandeMacBook-Air Payload % optool install -c load -p "@executable_path/Frameworks/FirstFramework.framework/FirstFramework" -t ExampleCode.app/ExampleCode
Found thin header...
Inserting a LC_LOAD_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_DYLIB command for arm64
Writing executable to ExampleCode.app/ExampleCode...
witchan@witchandeMacBook-Air Payload %

接下来将Payload文件夹压缩成zip包,然后把扩展名改为ipa,然后用爱思,或其他重签名工具对该ipa进行签名后,即可在越狱或非越狱机上安装使用了。运行后的日志如下:
【iOS逆向与安全】iOS插件开发入门
总结
以上就是iOS插件相关的教程,希望该文章对你有所帮助。deb格式的叫插件,其实dylib和framework文件,在iOS里,叫动态库。就和安卓的so文件类似。在这之所以都叫插件,是因为市场需要。文章来源地址https://www.toymoban.com/news/detail-485930.html

到了这里,关于【iOS逆向与安全】iOS插件开发入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 图形学、02 推导证明 | 任意一点经过透视投影后 z 坐标相对于之前有什么变化

    齐次坐标知识点: (begin{bmatrix} x \\\\ y \\\\ z \\\\ 1 \\\\end{bmatrix} Rightarrowbegin{bmatrix} nx \\\\ ny \\\\ nz \\\\ n \\\\end{bmatrix}) 两个都表示同一个点 透视投影:先将远截面按一定规则缩放到跟近截面一样大,然后再正交投影 缩放规则: 远截面 缩放后 (z) 不变,缩放过后大小同近截面相同。 截

    2024年02月08日
    浏览(9)
  • 【iOS逆向与安全】好用的一套 TCP 类

     初始化  发送数据 源码类 配置端口

    2024年02月07日
    浏览(8)
  • 【iOS逆向与安全】使用ollvm混淆你的源码

    【iOS逆向与安全】使用ollvm混淆你的源码

    当你在研究别人源码的时候,是不是期望着别人代码没有进行任何的防护和混淆。这时的你,是不是应该考虑一下自己代码的安全.本篇文章将告诉你,如何使用ollvm来混淆iOS端的代码【此文为入门贴,大佬请绕道】。 编译ollvm工具,并在Xcode中来混淆你的ipa或动态库,增加别

    2023年04月19日
    浏览(7)
  • 【iOS逆向与安全】越狱检测与过检测附ida伪代码

    首先在网上查找一些检测代码 放入项目运行,用 ida 打开后 F5 得到下面的 用 frida hook hook stat hook md5 frida-trace -UF -i \\\"CC_MD5\\\" -f xxxxxxx.xxx.xxxx fishhook 下面是网上找的源码

    2024年02月03日
    浏览(6)
  • 75.网游逆向分析与插件开发-背包的获取-背包结构与指针的逆向分析

    75.网游逆向分析与插件开发-背包的获取-背包结构与指针的逆向分析

    内容参考于:易道云信息技术研究院VIP课 上一个内容:物品名称与物品编号的映射关系分析-CSDN博客 通过上一个内容已经可以通过物品的id得到一个名字,知道了它的算法,它的算法自己封装好了,我们直接用就好,接下来要用到物品的指针了,所以接下来分析物品的指针怎

    2024年01月21日
    浏览(12)
  • 61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

    61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

    内容来源于: 易道云信息技术研究院VIP课 上一节内容:游戏公告功能的逆向分析与测试-CSDN博客 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:63e04cc40f649d10ba2f4fa313ca65cc78f46516 代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-游戏红字公告功能的逆

    2024年01月23日
    浏览(12)
  • WEB攻防-JS应用&算法逆向&三重断点调试&调用堆栈&BP插件发包&安全结合

    WEB攻防-JS应用&算法逆向&三重断点调试&调用堆栈&BP插件发包&安全结合

    1、JavaScript-作用域调用堆栈 2、JavaScript-断点调试全局搜索 3、JavaScript-Burp算法模块使用 简单来说就是运行后相关的数据值 简单来说就是代码的执行逻辑顺序 这四种方法针对不同对象(搜索一般用来对付简单的,复杂点的就得用断点了) -代码全局搜索 -文件流程断点(执行的代码

    2024年02月05日
    浏览(21)
  • 73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

    73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

    内容参考于: 易道云信息技术研究院VIP课 上一个内容:72.网游逆向分析与插件开发-背包的获取-项目需求与需求拆解-CSDN博客 然后首先找切入点: 通过药物来当切入点,药物比较好使用,然后鼠标放到药物上它有名字、种类、说明、数量等,除了数量我们都改不了,所以毫

    2024年01月18日
    浏览(7)
  • 80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据

    80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据

    内容参考于: 易道云信息技术研究院VIP课 上一个内容:升级Notice类获得背包基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:3be017de38c50653b1d98bae6eb6db0fcff7bd54 代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-自动化助手显示物

    2024年01月25日
    浏览(10)
  • [免费专栏] Android安全之APK逆向入门介绍

    [免费专栏] Android安全之APK逆向入门介绍

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球 感谢大家一直以来对我CSDN博客的关注和支持,但

    2023年04月08日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包