将伪代码转换为 C/C++ 源代码
Converting pseudo-code into C/C++ source code
我已经学习了很多关于反编译函数和其他一些东西的知识,但我被困在一个特定的情况下;我正在玩我的 C 代码,我从一个特定的函数中得到了一个伪代码。
调用此函数
int seekANDReplace(char *string, int size,
const char *seek, const char *replace)
从之前的函数中,我使用 HEXRAY 反编译器得到了类似的东西:
__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 代码以便调试?
这实际上是可编译的 C 代码。
None 的变量有名称,因为该信息不在可执行文件中(除非它是使用调试设置编译的)。所使用的类型是某些整数类型的 typedef,反编译器可能已将其用作 header 文件。所以鉴于 header 你可以重新编译这个源文件。
我已经学习了很多关于反编译函数和其他一些东西的知识,但我被困在一个特定的情况下;我正在玩我的 C 代码,我从一个特定的函数中得到了一个伪代码。
调用此函数
int seekANDReplace(char *string, int size,
const char *seek, const char *replace)
从之前的函数中,我使用 HEXRAY 反编译器得到了类似的东西:
__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 代码以便调试?
这实际上是可编译的 C 代码。
None 的变量有名称,因为该信息不在可执行文件中(除非它是使用调试设置编译的)。所使用的类型是某些整数类型的 typedef,反编译器可能已将其用作 header 文件。所以鉴于 header 你可以重新编译这个源文件。