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

article/2025/10/17 0:40:18

前言
经过之前的学习,相信你已经能熟练的使用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后,按如下流程依次点击:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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;@endCHDeclareClass(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"];   // 设置headerrequest.HTTPBody = body;    // 注意,HTTPBody是一个16进制数据,一般直接16进制输出,再转换成文本查看NSURLSession *session = [NSURLSession sharedSession];   // 获取网络对象NSURLSessionTask *task = [session dataTaskWithRequest:requestcompletionHandler:^(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的包名:
在这里插入图片描述

编辑插件扩展信息(可选):
在这里插入图片描述

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

在电脑端打开控制台工具:
在这里插入图片描述
在这里插入图片描述

这时启动被注入deb插件的App后,看到的日志如下:
在这里插入图片描述

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

An empty identity is not valid when signing a binary for the product type ‘Dynamic Library’.
在这里插入图片描述
解决办法:
在这里插入图片描述
在这里插入图片描述

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文件夹:
在这里插入图片描述
在这里插入图片描述
切换到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进行签名后,即可在越狱或非越狱机上安装使用了。运行后的日志如下:
在这里插入图片描述
3.Framework插件开发
1. 创建插件工程

启动Xcode后,按如下流程依次点击:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 编写插件代码

创建AppHelper类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建完成后的目录结构如下:
在这里插入图片描述
在这。我们使用之前的deb插件编写方式来写。先把CaptainHook.h文件的所有内容复制到AppHelper.h:
在这里插入图片描述
复制整个头文件的内容到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;@endCHDeclareClass(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"];   // 设置headerrequest.HTTPBody = body;    // 注意,HTTPBody是一个16进制数据,一般直接16进制输出,再转换成文本查看NSURLSession *session = [NSURLSession sharedSession];   // 获取网络对象NSURLSessionTask *task = [session dataTaskWithRequest:requestcompletionHandler:^(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
在这里插入图片描述
在这里插入图片描述
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文件夹:
在这里插入图片描述
在这里插入图片描述
切换到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插件相关的教程,希望该文章对你有所帮助。deb格式的叫插件,其实dylib和framework文件,在iOS里,叫动态库。就和安卓的so文件类似。在这之所以都叫插件,是因为市场需要。


http://chatgpt.dhexx.cn/article/l4GbqjdK.shtml

相关文章

iOS逆向工程开发技巧

1. 将xib文件转成nib文件 ibtool --errors --warnings --output-format human-readable-text --compile ~/Desktop/001.nib ~/Desktop/HWTipsView.xib 2. 给framework添加指令集合并 lipo -create [地址&#xff1a;name1.framework/name1] [地址&#xff1a;name2.framewor…

iOS逆向动态调试

1.拷贝越狱手机/Developer/usr/bin目录下的debugserver到Mac电脑&#xff0c;在mac端输入 scp -P 2222 rootlocalhost:/Developer/usr/bin/debugserver ~/debugserver2.对debugserver进行瘦身(iOS11可以不用瘦身,因为只支持64位构架的程序)&#xff0c;在debugserver所在目录输…

ios逆向学习环境安装(一)

1、Xcode 历届版本&#xff1a;https://developer.apple.com/documentation/xcode-release-notes AppStore中搜并安装XCode & 在网页下载https://developer.apple.com/xcode 2、class-dump class-dump&#xff0c;是可以把Objective-C运行时的声明的信息导出来的工具。其实…

ios android 逆向 对比,iOS逆向开发--APP重签名

签名原理 在非越狱手机上要调试一个三方的APP&#xff0c;我们首先要对其重签名&#xff0c;跑在我们的手机上&#xff0c;我们才能对其进行进一步的动态和静态调试 要对一个APP包进行重签名&#xff0c;要有一个越狱的APP包&#xff0c;这个可以去PP助手上下载&#xff0c;也可…

IOS逆向-抓帧分析

背景 分析图形学、游戏等的时候&#xff0c;很多时候需要抓帧分析 步骤 动态调试APP点击 点击FPS&#xff0c;触发渲染&#xff0c;查看面板是否有数据点击&#x1f4f7;按钮&#xff0c;触发渲染再次点击&#x1f4f7;按钮&#xff0c;结束抓帧 问题 FPS数据面板没有数据…

IOS逆向-动态调试

文章目录 LLDBXcode重新签名版本调试(手动) ✅重新签名版本调试(自动)不重新签名版本调试 LLDB Xcode -> Attach -> 点击 || 按钮 -> 使用lldb终端 手机/Developer/usr/bin/debugserver localhost:2233 /var/containers/Bundle/Application/*/*/xxxx电脑 lldb -> …

IOS逆向初探

前言 这些文章用于记录学习路上的点点滴滴&#xff0c;也希望能给到刚入门的小伙伴们一点帮助。爱而所向&#xff0c;不负所心。 环境 iphone 6 MacOS Monterey 12.3.1 一、IOS开发语言 Objective-C Objective-C是iOS操作系统运用的软件开发语言。Objective-C的流行完全是因…

移动App入侵与逆向破解技术-iOS篇

如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单介绍ios二进制文件结构与入侵的原理介绍入侵常用的工具和方法,包括pc端和手机端讲解黑客技术中的静态分析和…

C#应用程序与MATLAB联合编程

本文主要结合C#编写应用程序方便强大和MATLAB在工业科学界的广泛应用&#xff0c;结合两者的优点&#xff0c;利用C#编写的windows桌面应用程序作为UI交互接收用户配置&#xff0c;并根据用户在前端应用界面的操作自动控制MATLAB运行&#xff0c;并将MATLAB计算的结果返回桌面应…

编程输出中文变问号的解决办法

问题是出现在windows的dos显示设置上。 如何解决这个问题&#xff1f; 1.打开运行&#xff0c;输入cmd&#xff1b; 2.界面顶部右键&#xff0c;option中选择默认值&#xff1b; 3.将437&#xff08;OEM-美国&#xff09;改为936&#xff08;ANSI/OEM-简体中文GBK&#xff09; …

Python入门(二)-编程环境

本章重点介绍 Python 编程环境的搭建&#xff0c;包括各个平台下 Python 的下载和安装&#xff0c;常见 IDE 的使用&#xff0c;如何运行 Python 程序等。我还会亲自带着大家编写并运行第一个 Python 程序&#xff0c;让大家认识一下最简单的 Python 代码。 本章的后半部分还介…

数模混合信号建模语言Verilog-AMS

混合信号建模语言Verilog-AMS 很多人做模拟电路的朋友&#xff0c;都希望有一款“模拟FPGA”&#xff0c;希望有一个“模拟的Verilog”&#xff0c;但现实是没有“模拟的Verilog”只有混合信号建模语言-Verilog-AMS&#xff0c;今天就简单介绍一下-Verilog-AMS。 为了便于物理系…

Java入门-Java语言概述

1、Java语言基本概述 1.1、什么是计算机编程语言 人与人之间是如何沟通的呢&#xff1f;从小父母就教会我们说话&#xff0c;在长期的熏陶和自我学习中&#xff0c;我们就学会了普通话&#xff0c;学会了表达自己的需求&#xff0c;父母收到我们的信号或者听到我们的要求也会尽…

Python 批量下载BiliBili视频 打包成软件

文章目录 一、项目概述1.项目背景2.环境配置下载ffmpeg设置环境变量 二、项目实施1.导入需要的库2.设置请求参数3.基本处理4.下载视频5.视频和音频合并成完整的视频6.3种下载方式的分别实现7.主函数 三、项目分析和说明1.结果测试改进说明2.软件打包3.改进分析4.合法性说明 如有…

Java 之父 James Gosling 最新访谈:JIT 很好,但不适合所有语言

计算机编程确实是一门艺术。 James Gosling&#xff0c;“Java 之父”, 完成了 Java 的原始设计&#xff0c;并实现了 Java 最初版本的编译器和虚拟机。 90年代初&#xff0c;James Gosling和一群技术人员合作“绿色计划”&#xff0c;创建了一个名为Oak的项目&#xff0c;旨在…

Python语言概述及其运行机制详解

即日起&#xff0c;我们将打开一个新的编程世界的大门——Python语言。Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独…

go语言开发环境搭建

Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go语言专门针对多处理器系统应用程序的编程进行了优化&#xff0c;使用Go编译的程序可以媲美C或C代码的速度&#xff0c;而且更加安全、支持并行进程。 学习Go一部分是兴趣&#xff0c;一部分是…

汇编语言程序运行过程分析

实验项目程序运行过程分析综合性实验2020年11月 18日 一、实验综述 1.实验目的及要求 &#xff08;1&#xff09;掌握程序执行具体过程 &#xff08;2&#xff09;构建汇编语言的运行环境 &#xff08;3&#xff09;掌握汇编语言的编译连接过程 &#xff08;4&#xff09;掌…

【x86汇编】第六章 输出/输出和win32编程

文章目录 输入/输出指令和数据的传送方式输入/输出指令输入指令IN输出指令OUT串输入指令INS串输出指令OUTS 数据的传送方式无条件传送查询传送直接存储器中断传送 中断与异常中断的概念不可屏蔽中断 NMI可屏蔽中断 INTR除法出错溢出调试异常&#xff08;单步&#xff09;软中断…

总算编译通过了《自制编程语言》一书里的代码!

起初按照书里的说明来搭建Windows下的环境&#xff0c;卡在下载和编译正则表达式库“鬼车”的地方&#xff0c;后来留言给作者&#xff0c;才知道这个库已经转移到github上了&#xff08;2018年4月25时点&#xff1a;https://github.com/kkos/oniguruma&#xff09;&#xff0c…