1.AARCH64 开发系列1: AARCH64 环境搭建
2.Gcc 和 Clang
3.虚幻4(ue4)引擎加密pak解包教程(初学者向x64源码逆向)
AARCH64 开发系列1: AARCH64 环境搭建
在个人电脑的汇编源码x环境下搭建AARCH开发环境,对有兴趣深入Arm相关技术的汇编源码开发者来说是至关重要的。本文指导你如何快速搭建此开发环境,汇编源码以适应Arm服务器的汇编源码迅猛发展需求。
通过访问docker-hub,汇编源码可以找到名为dev4arm/aarch:ubuntu_._sve的汇编源码golang反向代理源码Docker镜像,这为AARCH环境搭建提供了方便。汇编源码通过提供的汇编源码命令,你可以轻松进入AARCH开发环境,汇编源码或者按照附录中的汇编源码步骤,手动创建开发环境。汇编源码
尽管官方发布的汇编源码gcc版本尚不支持SVE intrinsics,但在GitHub上,汇编源码一个名为gcc-mirror的汇编源码仓库提供了包含aarch/sve-acle-branch分支的源代码。通过手动编译此分支的汇编源码源代码,可以生成支持SVE intrinsics的gcc编译器,更多详情请查阅相关参考资料。本文所构建的AARCH开发环境已内嵌一个支持SVE intrinsics的gcc编译器,以满足这一需求。
使用此内置的activemq项目源码下载gcc_sve目录下的支持SVE intrinsics的编译器,你可以在开发环境中完成所有代码的测试、编译。实验代码已包含在dev4arm/aarch:ubuntu_._sve Docker镜像中。
接下来,我们将逐步介绍在AARCH环境中执行基本汇编编译与运行、Neon、Neon intrinsics、SVE以及SVE intrinsics的编译与运行。
在~/work/aarch_asm目录下,你可以找到一个用于测试AARCH基本汇编的内置程序。通过执行makefile,可以获取相关结果。Neon的测试代码位于~/work/neon目录下,提供了关于Neon编译与运行的实例。接下来,我们关注Neon intrinsics的编译与运行,以及SVE相关的编译与运行。
SVE的测试代码位于~/work/sve目录下,通过SVE指令计算字符串长度的小程序url源码示例展示了SVE汇编编译与运行的过程。在SVE intrinsics部分,我们提供了一个通过SVE intrinsics进行批量运算的示例。
对于希望手动构建AARCH开发环境的读者,附录提供了必要的指导,包括下载附件和在命令行上执行特定命令以创建环境。
在参考文献中,我们引用了几个关键资源,帮助读者深入了解AARCH开发环境搭建的各个细节,包括SVE在QEMU的使用、交叉编译支持SVE ACLE的gcc、qemu-user-static release以及Arm编译工具链下载等。
Gcc 和 Clang
GCC 编译器作为 Linux 系统下的主要 C/C++ 编译工具,广泛安装于多数 Linux 发行版中。其命令形式通常为“gcc”,并提供了丰富的选项来辅助编译过程。其中,常用选项包括:-E 仅执行预处理,-c 编译或汇编源文件但不执行链接,-S 完成编译但不汇编,内核 epoll源码详解仅生成汇编代码,-o 用于指定输出文件名。在 Linux 系统中,未指定输出文件名时,默认输出名为“a.out”,源文件后缀生成为“.o”,汇编文件后缀为“.s”。GCC支持多种环境的代码生成,如使用-m、-m、-m选项生成不同位数环境的代码,例如,-m下int、long和指针类型均为位,-m下int为位,long和指针类型为位,-m与-m类似,但在汇编文件开头添加了gcc汇编制导,用于运行位模式的javaweb实现登录源码二进制文件。
编译过程主要分为预处理、编译、汇编和链接四个阶段。下面以一段源码为例,详细分析每个阶段的内容。
首先,预处理过程会展开宏定义和条件编译,生成预处理文件。使用cpp命令执行预处理,得到的sample.i文件中,宏定义和条件编译已根据实际情况展开,宏引用被替换为实际值。通过-D指令可以自定义宏的值,进行预处理。在Linux系统下,通过“man gcc”可查询GCC命令的详细用法。
接着,GCC将预处理文件编译为汇编代码,生成汇编文件。汇编文件包含了核心的汇编代码,展示了编译过程中的汇编指令和数据操作。对比位机器和位机器汇编代码的差异,可以发现主要在于寄存器的位宽和指令的位宽不同。
汇编代码中,.cfi_startproc和.cfi_endproc用于初始化和结束本地数据结构,本地标签用于分支目的地标记。基本汇编指令如pushl、movl、subl、cmpl、je、addl、sall、ret、movl等,分别用于操作寄存器、存储数据、进行算术运算和逻辑运算、控制流程等。了解这些基本指令的用途有助于深入理解程序的执行流程。
使用GCC的-c选项编译源代码为机器代码,通过-o选项指定输出文件名。可以使用as命令得到机器语言,通过objdump指令查看目标文件的机器码,反汇编指令帮助理解机器码的含义。在程序中发现符号定义冲突时,可以使用nm命令列出目标文件中的符号,快速定位问题。
最后,链接器(ld)将编译生成的目标文件链接为可执行文件。链接过程中,链接器解析未定义的符号引用,将目标文件中的占位符替换为实际的符号地址。如果缺少必要的CRT文件,ld会生成警告。可通过查询/usr/lib/x_-linux-gnu路径找到CRT文件。C运行时文件(CRT)包含程序入口函数_start,负责调用__libc_start_main初始化libc,并调用main函数;_init函数在main函数前运行;_fini函数在main函数后运行。链接时使用-lc选项链接C标准库。
Clang 是一个基于LLVM的C/C++编译器,提供C/C++/Objective C/Objective C++语言的编译支持,旨在超越GCC。Clang预处理、生成汇编代码、生成目标文件、得到可执行文件的过程与GCC类似,但Clang提供了更多的特性,如更快的编译速度、更好的错误诊断和更先进的类型推断能力。使用Clang替代GCC进行C程序编译时,可以体验到这些额外的优势。
Clang编译过程包含预处理、生成位和位机器汇编代码、生成目标文件和得到可执行文件等步骤。使用Clang编译后的汇编代码、目标文件和可执行文件与GCC编译结果一致,但Clang在性能和语言支持方面可能具有优势。
虚幻4(ue4)引擎加密pak解包教程(初学者向x源码逆向)
文章总结:看雪论坛作者devseed分享了使用虚幻4(ue4)引擎的x源码逆向进行pak解包的教程,针对非魔改版和未加壳引擎,以ue 4.为例,初学者也能理解。教程从观察源码、定位切入点、分析函数与找到密钥,到最后解包的步骤详细展开,旨在帮助读者理解加密pak文件的解密过程。
步骤1:通过关键字"decrypt"在源码中找到FAES::Key结构,确定了AES-加密。确保游戏版本与源码同步,避免源码修改导致不匹配。
步骤2:在FPakFile::LoadIndex函数中,致命错误的log成为解密关键,通过xdbg定位到"Corrupted index offset in pak file."相关代码。
步骤3:在反汇编中,通过函数参数和编译器优化的特性,尤其是Jump指令,追踪DecryptData函数,找到与加密密钥相关的数据结构。
步骤4:经过调试,确认FPakPlatformFile::GetPakEncryptionKey和FAES::DecryptData的调用,解密密钥即在rcx和r8寄存器中找到,通常为bit的随机数据。
步骤5:使用加密密钥解包pak文件,通过Base转换和UnrealPak.exe工具,配合crypto.json文件,实现pak文件的解密和文件转换。
最后,读者可参考相关链接深入学习,逆向分析技术在游戏安全和开发领域具有实际应用价值。