二进制插装vs断点调试

    科技2025-02-16  12

    1. 二进制插装(binary instrumentation)

    代码插装(code instrumentation), 顾名思义,就是往已有代码中插入一些代码或指令,用于性能分析、日志统计、错误定位等等。

    根据插装对象,分为源代码插装和二进制插装,源代码插装就是已知源代码,二进制插装未知源代码。

    动态二进制插桩(dynamic binary instrumentation ,DBI)技术是一种通过注入插桩代码,来分析二进制应用程序在运行时的行为的方法。目前,应用广泛的动态二进制分析平台有Pin,DynamoRIO和Frida等。

    DPI工具一般会在正在运行的程序和底层操作系统之间重新引入了一个层,该层会提供一些在程序执行时检查和修改用户级程序指令的机会。

    在JIT模式下,原始二进制文件或可执行文件实际上从未被修改或执行过。因为,此时二进制文件被视为数据,修改后的二进制文件副本将在新的内存区域中生成,此时执行的就是这个修改后的文件副本。

    2. 断点调试

    软件断点是一条特定的指令(在x86中是int 3),当程序执行到INT 3指令时,会引发软件中断。 OS 就会停止进程,在 Linux上, OS 会发送给进程一个信号 —— SIGTRAP。

    这个时候调试器可以做以下工作:

    在目标地址,用原来的正常执行指令替换掉 int 3 指令将被追踪进程的指令指针回退一步。这是因为现在指令指针位于刚刚执行过的 int 3 之后。 允许用户以某些方式与进程交互,因为该进程仍然停止在特定的目标地址。这里你的调试器可以让你取得变量值,调用栈等等。当用户想继续运行,调试器会小心地把断点放回目标地址去(因为它在第 1 步时被移走了)。

    3. 反调试技术

    3.1 进程状态检测

    正常启动的进程和调试启动的进程的某些初始信息是不同的,比如进程环境块PEB、STARTUPINFO等,这些信息使用方便,经常被广泛应用于反调试技术。 IsDebuggerPresent函数 CheckRemoteDebuggerPresent函数

    3.2 调试环境监测

    窗口检测即通过查找当前系统中运行的程序窗口名称是否包含敏感程序来进行反调试。 程序正常启动(双击)时,其父进程为exeplorer.exe,调试启动时其父进程为调试器,所以检查其父进程是否为explorer.exe也可以作为一个反调试手段。但是这种检测方式容易误判,因为程序也可能是由其他正常进程通过CreateProcess正常启动。

    3.3 时钟监测

    调试的时候,势必会影响程序执行的速度,这个是肯定的。所以时钟监测也是用的比较多的一种方法。

    比如:记录一段操作前后的时间戳,然后比较两个时间戳,如果存在滞后,我们可以认为我们被调试了。

    3.4 其他

    Windows下反反调试技术汇总

    4. 加壳

    "壳"是专门的压缩工具.软件加壳是在程序中加入一程保护作用的代码, 它改变代码本来的面目, 如将原来的代码和数据加密, 以保护程序不被轻易修改, 窃取和反编译, 延长破解时间, 消耗破解者经历. 当加了壳的软件运行时, 壳首先在内存中获取执行权, 对软件解压或解密, 还原软件的原本面目, 然后把执行全交给软件, 软件正常执行.

    参考

    调试程序时,设置断点的原理是什么? 调试器工作原理 动态二进制插桩的原理和基本实现过程 加壳脱壳初步学习总结与简单实战 加壳与脱壳的原理

    Processed: 0.013, SQL: 8