1.Hikari源码分析 - AntiDebug
2.五分钟拆解流媒体入门项目 MJPG-Streamer
Hikari源码分析 - AntiDebug
一、框架分析 针对PASS的具体实现进行深入分析。该PASS旨在提升编译后程序的抵抗调试能力,其核心逻辑包括两个主要方面: 链接预编译的反调试IR代码 特定于平台的内联汇编注入 针对Darwin操作系统上的AArch架构,若未找到ADBCallBack和InitADB函数,PASS会尝试直接注入内联汇编代码。拇指射箭源码该代码片段可能利用系统调用,如ptrace,来检测是否处于调试环境。 此外,配置允许用户指定预编译反调试IR文件的路径和函数混淆概率。 具体实现包括: 检查预编译IR路径,源码包启动用构建默认路径并链接预编译的IR文件。 修改ADBCallBack和InitADB函数属性,确保它们在编译和链接阶段表现出反调试行为。 初始化标志和目标三元组信息,准备为每个模块提供初始化和链接预编译IR的过程。 模块处理和函数处理涉及应用概率值来决定是否对模块和函数应用反调试混淆。 预编译的反调试IR文件包含了一系列用于反调试的函数和结构,如检测调试器的代码、修改执行路径以规避调试跟踪、以及插桩代码以检测异常行为。 通过LLVM工具链中的求签公众号源码llvm-dis工具,可以将.bc文件转换为可读的LLVM IR文件。该文件结构包含多个结构体定义、全局声明、函数实现和属性。 函数ADBCallBack简单地终止程序并执行无法到达的指令。函数InitADB执行系统调用和检查来检测调试状态,可能涉及进程信息查询、动态库加载、系统调用、内存分配、异常端口检查等操作。超级直播壳源码 系统调用声明确保了程序能调用各种底层函数进行操作,如sysctl、dlopen、dlsym、task_get_exception_ports、isatty、ioctl等。 总结,通过在编译器优化阶段插入反调试逻辑,相较于源代码实现,基于LLVM Pass的如何分辨源码补码AntiDebug方法提供了更好的隐蔽性、可移植性、灵活性、维护性和混淆程度。然而,这种方法需要对LLVM框架有深入理解,可能增加构建和调试复杂度。五分钟拆解流媒体入门项目 MJPG-Streamer
MJPG-Streamer 是一个用于传输 JPEG 文件的流媒体工具,主要应用于摄像头数据采集和通过 HTTP 服务器提供图像数据。它能够将多帧 JPEG 图像连续显示,形成动态视频。MJPG 编码格式相较于 JPEG 的静态,具有低性能处理器即可传输 MJPG 视频流的优点,但传输带宽要求较高,不考虑前后帧数据的变化。
MJPG-Streamer 可以被简单理解为一个管道,将图像源作为输入,将图像展示作为输出。输入和输出被抽象为插件,输入插件负责从摄像头采集图像,输出插件启动 HTTP 服务器提供图像数据给浏览器查看。用户可以通过浏览器输入指定的 URL 来查看图像。
使用 MJPG-Streamer 非常简单,依赖较少,编译过程也相对简单。常见的使用方法是使用输入插件(如 input_uvc.so)从摄像头采集图像,指定设备节点、分辨率和帧率;输出插件(如 output_http.so)启动 HTTP 服务器。启动 MJPG-Streamer 后,用户即可通过浏览器访问指定 URL 查看图像。
MJPG-Streamer 的核心设计遵循了 UNIX 的设计理念,保持简单实用。系统通过主线程调度输入和输出插件,输入插件线程负责采集图像并存储在缓冲区,输出插件线程负责启动 HTTP 服务器并从缓冲区读取图像发送给客户端。每一个插件都需要实现初始化、停止工作和运行工作这三个接口。插件最终被编译为动态库,主程序通过 dlopen 和 dlsym 来统一调度使用。
MJPG-Streamer 的核心框架由输入插件和输出插件的抽象数据结构组成,这些结构确定了系统的整体框架。了解插件的实现方式,例如 input_uvc.so 如何采集摄像头数据,只需要理解其 init()、stop() 和 run() 函数的实现即可。如果希望增加 MJPG-Streamer 的功能,例如支持 live 进行流媒体传输,需要了解 live 的用法,并将其封装为 init()、stop()、run() 接口供系统调用。
总结来说,MJPG-Streamer 适用于训练 Linux 系统下的网络和多线程编程,设计遵循简单实用的原则。欢迎大家分享更多类似的开源项目,后续会分享更多源码剖析。虽然 MJPG-Streamer 已经多年未更新,但依然被广泛使用,说明其代码品质较好,可读性高,扩展性好。股市波动不定,但技术总能带给我们稳定和希望。