将伪代码转换为 C/C++ 源代码

时间:2021-05-24 17:29:51

标签: c pseudocode

我已经学习了很多关于反编译函数和其他一些东西的知识,但我陷入了一个特定的情况;我在玩我的 C 代码,我从一个特定的函数中得到了一个伪代码。

这个函数被调用

int seekANDReplace(char *string, int size,
                          const char *seek, const char *replace)

从之前的函数中,我使用 HEXRAY Decompiler 得到了这样的结果:

__int64 __fastcall seekANDReplace(_BYTE *a1, int a2, _BYTE *a3, _BYTE *a4)
{
  char v4; // al
  _BYTE *v6; // r12
  char v7; // r8
  _BYTE *v8; // rbx
  int v9; // ebx
  __int64 v10; // r14
  _BYTE *v11; // rbx
  unsigned int i; // esi
  int v13; // er13
  int v14; // ebx
  _BYTE *v15; // rax
  int v16; // edi
  __int64 v17; // r10
  __int64 v18; // r11
  __int64 v19; // rax
  __int64 v20; // r10
  __int64 v21; // rdx
  _BYTE *v22; // r8
  __int64 v23; // r8

  v4 = *a3;
  v6 = a4;
  v7 = *a4;
  if ( v4 )
  {
    v8 = a3;
    do
      ++v8;
    while ( *v8 );
    v9 = (_DWORD)v8 - (_DWORD)a3;
    v10 = v9;
    if ( !v7 )
    {
      v14 = -v9;
      v13 = 0;
      goto LABEL_9;
    }
  }
  else
  {
    v10 = 0i64;
    if ( !v7 )
      return 0;
  }
  v11 = a4;
  do
    ++v11;
  while ( *v11 );
  i = 0;
  if ( !v4 )
    return i;
  v13 = (_DWORD)v11 - (_DWORD)a4;
  v14 = (_DWORD)v11 - (_DWORD)a4 - v10;
LABEL_9:
  if ( *a1 )
  {
    v15 = a1;
    do
      ++v15;
    while ( *v15 );
    a2 -= (_DWORD)v15 - (_DWORD)a1;
  }
  v16 = a2 - 1;
  for ( i = 0; ; ++i )
  {
    v19 = __strstri(a1, a3);
    v20 = v19;
    if ( !v19 )
      break;
    if ( v16 < v14 )
      return ~i;
    if ( v14 )
    {
      v21 = v19 + v10;
      v16 -= v14;
      if ( *(_BYTE *)(v19 + v10) )
      {
        v22 = (_BYTE *)(v19 + v10);
        do
          ++v22;
        while ( *v22 );
        v23 = (int)v22 - (int)v21 + 1;
      }
      else
      {
        v23 = 1i64;
      }
      __memmove(v19 + v10 + v14, v21, v23);
    }
    __memmove(v20, v6, v13);
    a1 = (_BYTE *)(v17 + v18);
  }
  return i;
}

问题在于它不是纯 C 或 C++ 源代码,远非如此...我想显示更具可读性的代码。我怎样才能实现这样的目标并获得一些 C 代码以进行调试?

1 个答案:

答案 0 :(得分:4)

这实际上是可编译的 C 代码。

所有变量都没有名称,因为该信息不在可执行文件中(除非它是使用调试设置编译的)。所使用的类型是某些整数类型的 typedefs,大概反编译器可以作为头文件使用。因此,鉴于该标头,您可以重新编译此源文件。

相关问题