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)都有其在内存中的虚拟地址和权限。

相关推荐
嵌入小生007几秒前
硬件 --- GPIO/中断/定时器/蜂鸣器
单片机·嵌入式硬件·定时器·pwm·gpio·蜂鸣器·中断
木梯子14 分钟前
以科技筑牢安全新基线,金鸿星智能全自动防洪闸新品重磅发布
人工智能·科技·安全
forAllforMe32 分钟前
LAN9252 从机模式寄存器的配置代码示例
stm32·单片机·嵌入式硬件
不想起床&33 分钟前
51单片机
单片机·嵌入式硬件·51单片机
极客小云40 分钟前
【Electron-Vue 企业级安全启动模板:electron-vue-theme-template 使用指南】
vue.js·安全·electron
我在人间贩卖青春40 分钟前
单片机复位源
单片机·嵌入式硬件·复位源
oyzz12043 分钟前
Windows 上彻底卸载 Node.js
windows·node.js
项目題供诗44 分钟前
51单片机入门-温度传感器DS18B20(十三)
单片机·嵌入式硬件·51单片机
闭关苦炼内功1 小时前
Win10 安装 MySQL5.7.36 数据库记录
数据库·windows·mysql
德迅云安全杨德俊1 小时前
直面 DDoS 威胁:从现状到解决方案
网络·安全·web安全·https·ddos