汇编运行与调试 on macOS

ARM64架构下macOS恶意软件逆向分析:反调试对抗与行为解密实战 恶意软件分析是网络安全领域的核心技术之一,涉及对潜在威胁程序的逆向工程与行为解析。其原理在于通过静态与动态分析相结合的方法,深入理解恶意代码的执行逻辑、数据流和系统交互机制。这项技术的核心价值在于能够提前发现安全威胁、提取攻击特征并制定有效防御策略,广泛应用于威胁情报收集、安全产品研发和应急响应等场景。在macOS平台,随着Apple Silicon芯片的普及,基于ARM64架构的恶意软件日益增多,同时其反分析(Anti-Analysis)和反调试(Anti-Debugging)技术也日趋复杂。本文聚焦于A 阅读详情

声明:本文优快云作者原创投稿文章,未经许可禁止任何形式的转载,原文链接

0. 工具准备

  • 工具:Sublime Text 3;GDB;Nasm;
  • 环境:macOS 10.15.4
  • 处理器:Intel Core i5

上面👆三个工具下载好配置好就行,只说一点我踩的坑:gdb调试需要关闭SIP。

1. 编写程序代码

SECTION .data
 
; 在显示器上输出hello, world
; _main的前段系统调用了write,后半段系统调用了exit
; write(int fd, const void *buffer, size_t nbytes)
; exit(int status)


msg: db "HelloWorld!", 0x0a ;0x0a就是C语言的'\0'字符串结束符
len: equ $-msg ;变量len等于msg的长度
 
SECTION .text
global _main
 
_main:
    mov rax,0x2000004  ;0x2000004 表示 syscall 调用号 write
    mov rdi,1          ;第一个参数:文件描述符(fd),1代表标准输出stdout,也就是fd的值
    mov rsi,msg        ;第二个参数:要输出的字节序列(buffer),syscall 调用会到 rsi 来获取字符
    mov rdx,len        ;第三个参数:字节序列的长度
    syscall
 
    mov rax,0x2000001  ;0x2000001 表示退出 syscall
    mov rdi,0
    syscall
; 通过 syscall 指令进行系统调用时,约定的传递参数的寄存器依次为 rdi 、 rsi 、 rdx 、 rcx 。
; 根据位数不同,寄存器也有不一样的名字。16位寄存器有ax,bx,cx,dx,bp,si,sp,ip等,32位在这些前面加了前缀e即eax等等,64位用的不是e而是r即rax等等。

保存为test.asm。

2. 编译、链接、运行

在终端将工作目录移动到test.asm下,进行编译:

nasm -f macho64 -o test.o -g test.asm

编译完成以后会生成test.o链接文件,下面进行链接:

ld -o test -e _main test.o -macosx_version_min 10.15 -static

链接完成以后会生成test二进制可执行文件。

直接执行test文件,可以看到结果:

f@fdeMBP test % ./test 
HelloWorld!
f@fdeMBP test % 

3. 调试

调试需要工具GDB。

依然将工作目录移动到test.asm下,执行以下命令进入调试环节:

gdb test

顺利的话,可以看到(gdb)的标识符。

先在main函数处设置一个断点:

(gdb) b main

可以得到输出

Breakpoint 1 at 0x100000fd9

说明main函数的地址就在0x100000fd9。

接下来运行程序:

(gdb) r

程序会在我们设置的端点处停下,并得到如下输出:

Starting program: /path/to/test

[New Thread 0x2703 of process 8812]

[New Thread 0x1b03 of process 8812]

Thread 2 hit Breakpoint 1, 0x0000000100000fd9 in main ()

0x0000000100000fd9 in main ()说明运行到main函数在内存中的0x0000000100000fd9处指令停止,此指令并未运行。

此时可以查看寄存器的值:

(gdb) info registers

得到如下输出:

rax 0x0 0

rbx 0x0 0

rcx 0x0 0

rdx 0x0 0

rsi 0x0 0

rdi 0x0 0

rbp 0x0 0x0

rsp 0x7ffeefbffa10 0x7ffeefbffa10

r8 0x0 0

r9 0x0 0

r10 0x0 0

r11 0x0 0

r12 0x0 0

r13 0x0 0

r14 0x0 0

r15 0x0 0

rip 0x100000fd9 0x100000fd9

eflags 0x202 [ IF ]

cs 0x2b 43

ss

ds

es

fs 0x0 0

gs 0x0 0

fs_base

gs_base

寄存器名字和16位寄存器稍有不同,这个在最上面的程序注释中已经说明,主要是因为64位寄存器在前面加了个r。

得到的输出中,第一个是寄存器名字,第二个是寄存器的16进制值,第三个是其10进制值。

接下来运行一条指令:

(gdb) nexti

0x0000000100000fde in main ()

再查看寄存器的值:

rax 0x2000004 33554436

rbx 0x0 0

rcx 0x0 0

rdx 0x0 0

rsi 0x0 0

rdi 0x0 0

rbp 0x0 0x0

rsp 0x7ffeefbffa10 0x7ffeefbffa10

r8 0x0 0

r9 0x0 0

r10 0x0 0

r11 0x0 0

r12 0x0 0

r13 0x0 0

r14 0x0 0

r15 0x0 0

rip 0x100000fde 0x100000fde <main+5>

eflags 0x302 [ TF IF ]

cs 0x2b 43

ss

ds

es

fs 0x0 0

gs 0x0 0

fs_base

gs_base

可以看到rax已经变成了汇编代码#16行传入的0x2000004。

可以使用指令来查看某一寄存器的值,如:

(gdb) print/x $rax

$1 = 0x2000004

同样,可以使用指令查看内存的值:

(gdb) x/17xb 0x100000fd9

0x100000fd9 <main>: 0xb8 0x04 0x00 0x00 0x02 0xbf 0x01 0x00

0x100000fe1 <main+8>: 0x00 0x00 0x48 0xbe 0x00 0x10 0x00 0x00

0x100000fe9 <main+16>: 0x01

指令用法会在后面提到。

接下来就调试或者直接运行结束即可,这里直接运行结束:

(gdb) continue

Continuing.

HelloWorld!

[Inferior 1 (process 8812) exited normally]

4. GDB中命令x的用法

  • 命令 x :查看内存地址中的值

格式:x/<n/f/u> <addr>

  • n:正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容,一个内存单元的大小由第三个参数u定义。

  • f:addr指向的内存内容的输出格式,s对应输出字符串,此处需特别注意输出整型数据的格式:

    • x 按十六进制格式显示变量
    • d 按十进制格式显示变量
    • u 按十六进制格式显示无符号整型
    • o 按八进制格式显示变量
    • t 按二进制格式显示变量
    • a 按十六进制格式显示变量
    • c 按字符格式显示变量
    • f 按浮点数格式显示变量
  • u:以多少个字节作为一个内存单元,默认为4。当然u还可以用被一些字符表示,如b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.

  • <addr>:内存地址。

整合这个命令的诠释:就是以addr为起始地址,返回n个单元的值,每个单元对应u个字节,输出格式是f。

如:x/17xb 0x100000fd9 表示:以地址0x100000fd9为起始地址,返回17个单元的值,每个单元有一个字节,输出格式为无符号十六进制。

也就是说返回了17个字节的数据,以十六进制输出,这17个字节的数据,每一个字节为一个单元输出,共输出17个单元。

(gdb) x/17xb 0x100000fd9

0x100000fd9 <main>: 0xb8 0x04 0x00 0x00 0x02 0xbf 0x01 0x00

0x100000fe1 <main+8>: 0x00 0x00 0x48 0xbe 0x00 0x10 0x00 0x00

0x100000fe9 <main+16>: 0x01

以字节编址,故0x100000fd9为0xb8,0x100000fda为0x04等。

5. macOS的系统调用(Syscall)

可以看到在上面的汇编代码中用了两个系统调用,比如0x2000004表示 syscall 调用号 write,这个Apple已经在这里开源了macOS所有的系统调用表,在里面可以看到write函数的系统调用:

4 AUE_NULL ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); }

可是这里系统调用号是4而不是我们在代码里面所写的0x2000004,在这里Apple也给出了解释,再通俗的说一下。

在macOS系统中,所有系统调用都通过syscall指令进入系统内核,但是macOS有不同类型的系统调用,比如Mach系统调用,BSD系统调用等等。严格定义如下:

#define SYSCALL_CLASS_NONE  0   /* Invalid */
#define SYSCALL_CLASS_MACH  1   /* Mach */  
#define SYSCALL_CLASS_UNIX  2   /* Unix/BSD */
#define SYSCALL_CLASS_MDEP  3   /* Machine-dependent */
#define SYSCALL_CLASS_DIAG  4   /* Diagnostics */

上面的标记称为系统调用的类枚举标记。

macOS系统中有一个SYSCALL_CLASS_SHIFT,就是将系统调用的类枚举标记左移24位得到的值,所以进行不同的系统调用需要加上那个值。

所以,我们进行BSD类型的系统调用需要2<<24+4就是0x2000004。

MacOS 中 ARM64 汇编 ldr =address 伪指令导致运行时崩溃的原因及解决 在本篇博文中,我们详细讨论了 MacOS as 汇编器(ARM64)中 ldr = 伪指令的功能,并介绍了为什么不能用它来获得标签(Label)的地址,并提供解决方法。 阅读详情

相关推荐

MACOS下QT5启用调试

设置lldb默认python版本为2: defaults write com.apple.dt.lldb DefaultPythonVersion 2 输入密码 C++代码调试 汇编调试

719

or1200开发环境的使用

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书 1、一个简单的汇编程序       上一节安装好了GNU编译工具,还设置了虚拟机与宿主机的共享文件夹,下面我们就小试牛刀,写一个简单的程序,需要读者朋友们了解的是本书所有的测试代码都是很简单的汇编程序,因为即使最简单C语言代码(如:HelloWorld)经过编译后也会得到大量目标代码,而我们的目的是了解处理器内部的工作过程

leishangwen的专栏 2860

dosbox和MASM和debug(mac可用).zip

汇编DosBox、debug和MASM5.0(含macOS用的软件),Windows和macOS只有DosBox平台不同的区别,debug和masm是通用的。该压缩包含有分别支持两个系统的软件,macOS用户不用担心。更多教程查看:https://blog.youkuaiyun.com/qq_33973359/article/details/105328161

GNU C内联汇编(AT&T语法)

如果在内联汇编中使用了没有在输入输出中定义的任何内存位置,必须标记为被破坏的。占位符是前面加%的数字, 可以在内联汇编中引入输入和输出, 可以在对于编译器方便的任何寄存器或者内存位置中声明输入和输出。按照内联汇编中列出的每个输入值和输出值在列表中的顺序被赋予一个从0开始的数字,然后可以在汇编代码中使用占位符表示值。程序把movs需要的三个输入值作为输入: 要复制的字符串的位置存放在esi中, 目标位置存放在edi中,要复制的字符串长度存放在ecx中. 输出值已被定义为输入值之一, 所以没有专门定义输出值。

m0_74282605的博客 564

Mac汇编工具:debug,edit,MASM,LINK

Mac汇编工具:debug,edit,MASM,LINK。 工具都能用。

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

JLink提示错误信息read:@0x02000004

一、问题背景 开发环境:Keil MDK v5.29 使用JLink下载程序时,弹出错误提示窗: The firmware of the connected J-Link(S/N:20090928) does not support the following memory access: Read @ 0x2000004 Flags:via AHB-AP. 点击OK之后程序可以烧录进单片机,但每次烧录都会弹出这个窗口。 二、原因 经网上查阅,MDK 5.24之后的版本会出现这个问题 三、解决办法 使

William_Zhang_优快云的博客 2200

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

macOS上的汇编入门(十二)——调试

随着我们编写的汇编程序越来越复杂,往往就需要调试。对于汇编语言而言,常见的调试器有LLDB和GDB. 由于我比较喜欢用LLVM系列的产品,因此,在这篇文章中我主要介绍的是LLDB来调试汇编语言的方法。关于详细的LLDB的使用方法,大家可去官网lldb.llvm.org查看。 同时,在新版本的macOS上使用GDB是一件比较麻烦的事,需要证书签名。关于使用方法请参见我之前的文章在macOS10.14...

EvianZhang的博客 905

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场”

本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。

weixin_30655569的博客 426

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 881

MacBook Pro运行深度学习代码——Tensorflow_macos

电脑配置 先说一下电脑的配置,本人还是非常想尝鲜M1芯片机器的测试,但是只有MacBook Pro16’的机器,只怪上半年买的机器,下半年就上新M1,性能还是质的飞跃,生气(看窗外风景30分钟后~) 还有一张不知道效果咋样的显——AMD Radeon Pro 5300M 安装环境——Tensorflow_macos tensorflow_macos 基于tensorflow2.4版本 github主页 tensorflow_macos下载 有两种方式下载安装: 官方给出的快捷方式 /bin/bash

BishopJ的博客 5041

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 510

【汇编】新_Windows和MacOS配置8086汇编语言环境

文章目录1. 获取工具2. 安装Dos环境3. 尝试3.1 编写代码3.2 挂载目录挂载切换虚拟磁盘简单指令3.3 开始汇编确保环境汇编和链接3.4 使用DEBUG工具启动常用命令4. 示例代码截图 1. 获取工具 Windows和Mac都下载这个,仅Dos环境有区别,汇编时用到的文件是通用的 链接: https://pan.baidu.com/s/1KWMNPnrbNGPytZ9FZNM8GA ...

K。的博客 1万+

最新CobaltStrike4.8/CobaltStrike4.9、CS4.9/CS4.8、 Windows/Linux/Mac版下载

Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器。自3.0以后已经不在使用Metasploit框架而作为一个独立的平台使用,分为客户端与服务端,服务端是一个,客户端可以有多个,非常适合团队协同作战,多个攻击者可以同时连接到一个团队服务器上,共享攻击资源与目标信息和sessions,可模拟APT做模拟对抗,进行内网渗透。 Cobalt Strike集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成,

weixin_43167326的博客 7972

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+

探索 macOS 平台的汇编语言学习利器: Assembly-on-macOS

探索 macOS 平台的汇编语言学习利器: Assembly-on-macOS 在这个数字化时代,深入理解计算机底层运作原理是提升技术水平的重要一步,而汇编语言的学习无疑是通往这一目标的直接路径。今天,我们要向大家推荐一个专为 macOS 用户设计的开源项目:。它是一个简洁、实用的教程,旨在帮助开发者和爱好者在苹果操作系统上快速入门汇编编程。 项目简介 Assembly-on-macOS 是由 E...

gitblog_00088的博客 451

基于 YOLO26 的车辆实时检测与计数系统

本文提出了一种基于YOLO26的车辆实时检测与计数系统。系统采用CSPDarknet53作为主干网络,结合特征金字塔和多尺度预测实现高精度车辆检测。通过DeepSORT算法进行目标跟踪,并统计车辆数量、行驶方向和交通流量。实验表明,该系统在保持实时性能的同时,检测精度达到92.3%,可有效应用于智能交通管理。系统采用Python实现,支持GPU加速,适用于多种交通场景下的车辆监测需求。

一键难忘的博客 909

MacOS汇编语言入门

macOS上汇编语言试验,为后续研究打基础

曲折旅程,艰难人生 995

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

macos vscode+dosbox 8086汇编语言开发调试环境搭建方法 包含所有相关的工具的下载和安装配置方法

在学习汇编语言的过程中如何搭建汇编语言的开发环境是非常重要的,以下是个人在macos系统中搭建汇编语言开发环境的方法记录由于我们学习的汇编语言8086/8088是16位的,这个属于最古老的dos里面操作系统了。对于现代的操作系统最低也时32位的了, 所以我们的汇编语言的开发学习环境的搭建一般都使用dosbox这个第三方的dos模拟工具来进行, 这个工具可以运行在目前主流的操作系统里面,包括windows, macos等系统。1. 汇编用到的小工具: 汇编程序 masm.exe, tasm.exe ; 链接

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 2791

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

macOS上的汇编入门(五)——第一个汇编程序

通过前几篇文章,我们逐步建立了学习汇编语言之前需要的基础知识。接下来,在这篇文章中,我们开始编写我们的第一个汇编程序了。 编辑器,汇编器与链接器 工欲善其事,必先利其器。我们编写汇编语言,至少需要编辑器、汇编器和链接器。编辑器,就是提供语法高亮、智能缩进、自动补全等功能的文本编辑软件,汇编器与链接器则是汇编语言需要的核心装备,其功能我会在接下来的几篇文章中提到。我使用的编辑器是Visual Stu...

EvianZhang的博客 1557

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汇编:Mac系统搭建DOSBox汇编环境

Debug是一个DOS实用程序,是供程序员使用的程序调试工具,苹果的Mac系统上是没有DOS程序的,所以我们要下载一个名为DOSBOX的软件进行配置。

chenzimin_blog 4892

Bit-Slicer:macOS平台上的高级内存分析与调试工具

在macOS游戏开发和技术研究领域,Bit-Slicer作为一款专业的游戏训练器和内存分析工具,为开发者和高级用户提供了强大的内存操作能力。这款基于Cocoa和Mach内核API构建的工具,不仅支持游戏数值修改,更是一个全面的内存调试和逆向工程平台。 ## 🎯 诊断:游戏数据访问的常见挑战 在macOS环境下,开发者和研究人员经常面临内存数据访问的复杂挑战。游戏数据通常存储在进程的虚拟内存空

gitblog_01138的博客 962

VS Code在arm架构的macOS上调试CMake项目

VS Code在arm架构的macOS上调试CMake项目 VS Code有一个CMake Tools扩展,支持快速调试CMake项目,但在arm架构的macOS上无法启动调调试目标,如下图所示: 下面是解决方法: 安装CodeLLDB扩展 添加一个LLDB调试配置 添加后会自动打开.launch.json,修改文件内容如下(你可以直接复制粘贴,不需要做任何修改): { // Use IntelliSense to learn about possible attributes

ocfbnj的博客 1383

汇编语言 VSCode编辑器的下载、安装与配置使用

本文介绍了VSCode代码编辑器的下载安装,以及用于编写汇编语言程序的方法。有代码高亮和自动对齐等功能,比用记事本舒服很多!

Dr_Cheeze的博客 1万+

gdb调试段错误_在macOS10.14上使用GDB的教程

背景在macOS上,用于debug的工具有lldb和gdb. 其中lldb作为一种可复用的组件,参与了大型llvm项目库的构成;同时,lldb也是Xcode默认的调试工具, 支持Windows, macOS, iOS, Linux和FreeBSD. 而gdb是GNU项目的调试器,支持Windows和大多数UNIX变种,也包括macOS.相比而言,lldb是苹果的"亲儿子",所以当我们调试Objec...

weixin_32407355的博客 372
上一篇: DOSBox自动挂载盘符on macOS/Linux/Windows
下一篇: 数据可视化--实验一:可视化开发环境及搭建
BlingblingFu
博客等级 码龄8年 138粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值