You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求资深开发者协助编译运行IDA生成的C代码

解决IDA生成C代码的编译运行问题

我不是编程新手,但对C语言细节不熟。现在有一段IDA生成的C代码片段,编译运行时遇到了困难,试过用AI平台理解运行也没成功,因为对C语言不熟悉,没法排查问题和解读代码,求资深C语言开发者帮忙指导,让这段代码能成功编译执行,谢谢!

原代码片段

int fastcall sub_2A84(int a1, int a2, int a3)
{
  int v6; // r0
  int v7; // r12
  int v8; // r1
  char v9; // r2
  unsigned int v10; // t1
  unsigned int v11; // r3
  FILE *v12; // r0
  FILE *v13; // r7
  FILE *v14; // r0
  FILE *v15; // r5
  _DWORD v17[17]; // [sp+4h] [bp-44h] BYREF

  v17[0] = -549955056;
  v17[1] = 942652330;
  v17[2] = 1601953408;
  v17[3] = -1922941098;
  v6 = -904764173;
  v17[4] = -904764173;
  v17[5] = -31309516;
  v17[6] = -655969042;
  v17[7] = 943924076;
  if ( a2 )
  {
    v7 = a1 - 1;
    v8 = 0;
    do
    {
      v10 = *(unsigned __int8 *)++v7;
      v9 = v10;
      ++v8;
      v11 = v10 + (v10 >> 5);
      if ( v8 <= 31 )
        v6 = 0;
      if ( v8 > 31 )
        v6 = 1;
      if ( a2 <= v8 )
        v6 |= 1u;
      *((_BYTE *)v17 + (v11 & 0x1F)) ^= v9;
    }
    while ( !v6 );
  }
  v12 = (FILE *)fopen64("/tmp/test-123456-test.txt", "w");
  v13 = v12;
  if ( !v12 )
    return -1;
  fwrite(v17, 0x20u, 1u, v12);
  fclose(v13);
  v14 = popen("md5sum /tmp/test-123456-test.txt | awk '{print $1}'", "r");
  v15 = v14;
  if ( !v14 )
    return -1;
  fscanf(v14, "%32[^\n]", a3);
  pclose(v15);
  system("rm -rf /tmp/test-123456-test.txt");
  return 0;
}

代码修复要点

  • 替换非标准函数与类型:
    • 将fopen64替换为标准fopen,现代系统默认支持大文件操作,无需特殊64位文件函数。
    • 把IDA专属的_DWORD替换为标准uint32_t(需包含stdint.h),fastcall在GCC下用__attribute__((fastcall))声明,Windows下可直接用__fastcall。
    • a3参数实际是存储MD5字符串的缓冲区,原声明为int错误,需改为char*。
  • 补全必要头文件:代码用到了文件操作、进程控制、标准库函数,必须添加stdio.h、stdlib.h、stdint.h。
  • 优化循环逻辑:原循环中v6的赋值可以合并,减少冗余判断,不影响功能但提升可读性。
  • 确保缓冲区安全:调用函数时,a3指向的缓冲区至少要有33字节(32个MD5字符+1个终止符)。

修复后的可编译代码

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// GCC下的fastcall声明,Windows下替换为__fastcall
int __attribute__((fastcall)) sub_2A84(uintptr_t a1, int a2, char *a3)
{
    int v6;
    uintptr_t v7;
    int v8;
    char v9;
    unsigned int v10;
    unsigned int v11;
    FILE *v12;
    FILE *v13;
    FILE *v14;
    FILE *v15;
    uint32_t v17[17];

    // 把负数转换为无符号十六进制,可读性更好
    v17[0] = 0xDF00DF00;  // -549955056
    v17[1] = 0x385F862A;  // 942652330
    v17[2] = 0x5F684300;  // 1601953408
    v17[3] = 0x8C2D18CE;  // -1922941098
    v6 = -904764173;
    v17[4] = 0xC75F6843;  // -904764173
    v17[5] = 0xFD00DF04;  // -31309516
    v17[6] = 0xD75F6842;  // -655969042
    v17[7] = 0x3861D86C;  // 943924076

    if (a2)
    {
        v7 = a1 - 1;
        v8 = 0;
        do
        {
            v10 = *(unsigned char *)++v7;
            v9 = v10;
            ++v8;
            v11 = v10 + (v10 >> 5);
            
            // 合并v6的判断逻辑
            v6 = (v8 > 31) ? 1 : 0;
            if (a2 <= v8)
                v6 |= 1u;
                
            *((unsigned char *)v17 + (v11 & 0x1F)) ^= v9;
        } while (!v6);
    }

    v12 = fopen("/tmp/test-123456-test.txt", "w");
    v13 = v12;
    if (!v12)
        return -1;
    fwrite(v17, 0x20u, 1u, v12);
    fclose(v13);

    v14 = popen("md5sum /tmp/test-123456-test.txt | awk '{print $1}'", "r");
    v15 = v14;
    if (!v14)
        return -1;
    fscanf(v14, "%32[^\n]", a3);
    pclose(v15);

    system("rm -rf /tmp/test-123456-test.txt");
    return 0;
}

// 测试主函数
int main()
{
    char md5_buffer[33] = {0};
    // 示例:传入空输入(a2=0),若要传入字符串,a1指向字符串首地址,a2为字符串长度
    sub_2A84(0, 0, md5_buffer);
    printf("计算得到的MD5值:%s\n", md5_buffer);
    return 0;
}

编译运行步骤

  1. 将修复后的代码保存为ida_code_test.c
  2. 使用GCC编译:gcc ida_code_test.c -o ida_code_test
  3. 运行程序:./ida_code_test

内容的提问来源于stack exchange,提问作者doooge holy holydoooge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:47:11