Windows逆向工程提升之二进制分析工具:HEX查看与对比技术

目录

十六进制查看工具

应用于逆向工程的知识点

​编辑

二进制对比工具

应用于逆向工程的知识点


十六进制查看工具

十六进制查看器是逆向工程的基础工具,它可以以十六进制格式显示文件内容,同时展示对应的ASCII字符表示。

cpp 复制代码
VOID HexAscii(const BYTE* data, SIZE_T offset, SIZE_T length)
{
    char ascii[17] = { 0 };
    ascii[16] = '\0';

    printf("%08X | ", offset);

    for (size_t i = 0; i < 16; i++)
    {
        if (i < length)
        {
            printf("%02X ", data[i]);
            ascii[i] = isprint(data[i]) ? data[i] : '.';
        }
        else
        {
            printf("   ");
            ascii[i] = ' ';
        }
    }

    printf(" |%s|\n", ascii);
}

这个函数接收数据缓冲区、偏移量和长度,以标准的十六进制转储格式输出。对于不可打印的字符,用点(.)替代,这是十六进制编辑器的常用做法。

HexDump函数则通过逐块读取文件内容,调用HexAscii函数处理每一块数据:

cpp 复制代码
VOID HexDump(CONST CHAR* fileName)
{
    FILE* pFile = fopen(fileName, "rb");
    if (!pFile)
    {
        printf("fopen failed -> %s\r\n", fileName);
        return;
    }

    BYTE buffer[16] = { 0 };
    SIZE_T byteRead = 0;
    SIZE_T offset = 0;

    while ((byteRead = fread(buffer, 1, sizeof(buffer), pFile)) > 0)
    {
        HexAscii(buffer, offset, byteRead);
        offset += byteRead;
    }
}

应用于逆向工程的知识点

  1. 文件格式分析:通过十六进制查看可以识别文件头、魔数等特征,如PE文件的MZ头(0x4D5A)。
  2. 字符串提取:能够快速定位程序中的明文字符串,这些字符串常常揭示程序功能或API调用。
  3. 代码段识别:帮助分析机器码和数据区的边界,为反汇编提供参考。
  4. 数据结构分析:通过二进制模式识别复杂数据结构的布局。

二进制对比工具

二进制对比工具用于识别两个PE文件之间的差异,这在分析软件补丁、不同版本间的变化或恶意软件变种时非常有用。

该工具首先验证输入文件是否为有效的PE文件:

cpp 复制代码
BOOL IsPeFile(CONST CHAR* filePath)
{
    FILE* pFile = fopen(filePath, "rb");
    if (!pFile) return FALSE;

    WORD dosSignature = NULL;
    if (fread(&dosSignature, sizeof(WORD), 1, pFile) != 1)
    {
        fclose(pFile);
        return FALSE;
    }

    if (dosSignature != IMAGE_DOS_SIGNATURE/*0x5A4D*/)
    {
        fclose(pFile);
        return FALSE;
    }

    fclose(pFile);
    return TRUE;
}

对比过程中,工具逐字节比较两个文件,并以彩色高亮显示差异:

cpp 复制代码
VOID CompareFileByBin(CONST CHAR* file1path, CONST CHAR* file2path)
{
    // 文件打开和检查代码...

    // 循环读取并比较文件内容
    while (1)
    {
        SIZE_T byteRead1 = fread(szBuffer1, 1, USN_PAGE_SIZE, pFile1);
        SIZE_T byteRead2 = fread(szBuffer2, 1, USN_PAGE_SIZE, pFile2);

        if (byteRead1 == 0 && byteRead2 == 0) break;

        if (byteRead1 != byteRead2)
        {
            SetConsoleColor(CON_RED);
            printf("警告: 文件长度不相等 OFFSET -> 0x%08llx\r\n", 
                   dwOffset + (byteRead1 < byteRead2 ? byteRead1 : byteRead2));
            SetConsoleColor(CON_WHITE);
            break;
        }

        for (size_t i = 0; i < byteRead1 && i < byteRead2; i++)
        {
            if (szBuffer1[i] != szBuffer2[i])
            {
                SetConsoleColor(CON_RED);
                printf("0x%08llX | 0x%02X  | 0x%02X  | %c - %c \r\n",
                    dwOffset + i,
                    szBuffer1[i],
                    szBuffer2[i],
                    (szBuffer1[i] >= 32 && szBuffer1[i] <= 126) ? szBuffer1[i] : '.',
                    (szBuffer2[i] >= 32 && szBuffer2[i] <= 126) ? szBuffer2[i] : '.');
                SetConsoleColor(CON_WHITE);
                dwDifferences++;
            }
        }

        dwOffset += byteRead1;
    }
}

应用于逆向工程的知识点

  1. PE文件结构 :程序通过检查DOS头部的MZ签名(0x5A4D)来验证文件是否为合法的PE文件。PE文件是Windows可执行文件的标准格式,包含代码、数据和资源。

  2. 补丁分析:通过比较软件不同版本,可以快速定位被修改的代码段,这在分析安全补丁时特别有用。

  3. 内存映射:理解PE文件的内存布局对于动态分析至关重要。每个节区(section)都有其在内存中的虚拟地址和权限。

相关推荐
小+不通文墨2 小时前
GPIO口输入
stm32·单片机·嵌入式硬件
卓豪终端管理2 小时前
安全事件实时预警:构筑企业终端安全的“智能防线”
网络·安全·web安全
挨踢攻城3 小时前
网络安全 | 如何防御勒索软件?
安全·web安全·网络安全·php·厦门微思网络·防疫勒索软件
love530love3 小时前
【笔记】解决 ComfyUI 安装节点 ComfyUI-Addoor (葵花宝典)后启动报错:No module named ‘ComfyUI-Addoor’
linux·运维·前端·人工智能·windows·笔记·python
love530love3 小时前
【笔记】ComfyUI KeyError: ‘tensorrt‘ 错误的完整解决方案
windows·笔记·python·pycharm
ZJU_统一阿萨姆3 小时前
Windows系统VSCode配置Rust开发环境(超详细保姆级教程)
windows·vscode·rust
zzywxc7873 小时前
解锁 Rust 开发新可能:从系统内核到 Web 前端的全栈革命
开发语言·前端·python·单片机·嵌入式硬件·rust·scikit-learn
叱咤少帅(少帅)4 小时前
windows10 C 盘瘦身路径
windows·1024程序员节
JohnYan4 小时前
安全密钥(Security Key)和认证技术相关词汇表
后端·安全·设计模式
小莞尔5 小时前
【51单片机】【protues仿真】基于51单片机秒表计时器系统(带存储)
c语言·stm32·单片机·嵌入式硬件·物联网·51单片机