我正在尝试将库函数反向工程回 C/C++ 代码。但是我反转的功能已经快完成了,我只需要一点点帮助就可以让它完成。
这是汇编代码:
0002BB46 | 8B 45 F4 | mov eax,dword ptr ss:[ebp-C] |
0002BB49 | 8B 88 EC 00 00 00 | mov ecx,dword ptr ds:[eax+EC] |
0002BB4F | 89 4D EC | mov dword ptr ss:[ebp-14],ecx |
0002BB52 | 8B 55 F4 | mov edx,dword ptr ss:[ebp-C] |
0002BB55 | 8B 82 F0 00 00 00 | mov eax,dword ptr ds:[edx+F0] |
0002BB5B | 89 45 F0 | mov dword ptr ss:[ebp-10],eax |
0002BB5E | 83 7D EC 00 | cmp dword ptr ss:[ebp-14],0 |
0002BB62 | 0F 8E BA 00 00 00 | jle TestDLL.2BC22 |
0002BB68 | C7 45 E8 00 00 00 00 | mov dword ptr ss:[ebp-18],0 |
0002BB6F | EB 09 | jmp TestDLL.2BB7A |
0002BB71 | 8B 4D E8 | mov ecx,dword ptr ss:[ebp-18] |
0002BB74 | 83 C1 01 | add ecx,1 |
0002BB77 | 89 4D E8 | mov dword ptr ss:[ebp-18],ecx |
0002BB7A | 8B 55 E8 | mov edx,dword ptr ss:[ebp-18] |
0002BB7D | 3B 55 EC | cmp edx,dword ptr ss:[ebp-14] |
0002BB80 | 0F 8D 9C 00 00 00 | jge TestDLL.2BC22 |
0002BB86 | 8B 45 FC | mov eax,dword ptr ss:[ebp-4] |
0002BB89 | 50 | push eax |
0002BB8A | 6A 01 | push 1 |
0002BB8C | 6A 04 | push 4 |
0002BB8E | 8B 4D E8 | mov ecx,dword ptr ss:[ebp-18] |
0002BB91 | 6B C9 14 | imul ecx,ecx,14 |
0002BB94 | 03 4D F0 | add ecx,dword ptr ss:[ebp-10] |
0002BB97 | 51 | push ecx |
0002BB98 | FF 15 38 E1 02 00 | call dword ptr ds:[<&fwrite>] |
0002BB9E | 83 C4 10 | add esp,10 |
0002BBA1 | 8B 55 FC | mov edx,dword ptr ss:[ebp-4] |
0002BBA4 | 52 | push edx |
0002BBA5 | 6A 01 | push 1 |
0002BBA7 | 6A 04 | push 4 |
0002BBA9 | 8B 45 E8 | mov eax,dword ptr ss:[ebp-18] |
0002BBAC | 6B C0 14 | imul eax,eax,14 |
0002BBAF | 8B 4D F0 | mov ecx,dword ptr ss:[ebp-10] |
0002BBB2 | 8D 54 01 04 | lea edx,dword ptr ds:[ecx+eax+4] |
0002BBB6 | 52 | push edx |
0002BBB7 | FF 15 38 E1 02 00 | call dword ptr ds:[<&fwrite>] |
一点说明: - 您在 0002BB46 行看到汇编代码: mov eax,dword ptr ss:[ebp-C]
[ebp - C] 表示这是一个结构。
和 0002BB86 的一部分,你会看到: mov eax,dword ptr ss:[ebp-4] [ebp - 4] 表示这是一个文件*
但这就是我所知道的,我只需要一个小例子来说明这部分的作用。ASM 1:
0002BB46 | 8B 45 F4 | mov eax,dword ptr ss:[ebp-C] |
0002BB49 | 8B 88 EC 00 00 00 | mov ecx,dword ptr ds:[eax+EC] |
0002BB4F | 89 4D EC | mov dword ptr ss:[ebp-14],ecx |
0002BB52 | 8B 55 F4 | mov edx,dword ptr ss:[ebp-C] |
0002BB55 | 8B 82 F0 00 00 00 | mov eax,dword ptr ds:[edx+F0] |
0002BB5B | 89 45 F0 | mov dword ptr ss:[ebp-10],eax
第二个:
0002BB8E | 8B 4D E8 | mov ecx,dword ptr ss:[ebp-18] |
0002BB91 | 6B C9 14 | imul ecx,ecx,14 |
0002BB94 | 03 4D F0 | add ecx,dword ptr ss:[ebp-10] |
0002BB97 | 51 | push ecx
我知道它需要变量 ebp18 并将其与 0x14 相乘。并将其添加到 ebp10。但我不知道 ebp10 是什么。我认为它是一个结构或其他东西。
我希望有人可以帮助我,向我解释。
曼尼谢谢。
这是我从程序集中获得的源代码。
typedef struct _EDX
{
DWORD offset0; // edx 0x0 -> needs tp be checked
DWORD offset4; // edx 0x4
char offset64[0x64]; // edx 0x64
char offsetC8[0x20]; // -> new added
DWORD offsetE8; //
DWORD offsetEC; // edx 0xEC
char* offsetF0; // edx 0xF0
char first[0x64];
} EDX, *PEDX;
bool _cdecl WriteAdptInfo(char* filName, PEDX ebpc)
{
if(ebpc != NULL)
{
FILE* file = fopen(filName, "wb");
if(file != NULL)
{
size_t size1 = fwrite(&ebpc->offset4 , sizeof(DWORD), 0x01 ,file);
DWORD var8 = 0;
for(var8; var8 <= ebpc->offset4; var8++)
{
DWORD a = var8 * 0xF4;
PEDX ebpC = ebpc;
ebpC->offset0 += a;
size_t size2 = fwrite(ebpC->first, sizeof(char), sizeof(ebpC->first), file);
size_t size3 = fwrite(ebpC->offset64, sizeof(char), sizeof(ebpC->offset64), file);
size_t size4 = fwrite(ebpC->offsetC8, sizeof(char), sizeof(ebpC->offsetC8), file);
size_t size5 = fwrite(&ebpC->offsetE8, sizeof(DWORD), 0x1, file);
size_t size6 = fwrite(&ebpC->offsetEC, sizeof(DWORD), 0x1, file);
DWORD var14 = ebpC->offsetEC;
char* var10 = ebpC->offsetF0;
if(var14 >= 0)
{
DWORD var18 = 0;
for(var18; var18 <= var14; var18++)
{
DWORD counter = (var18 * 0x14);
// ptr , size, count, file
size_t size7 = fwrite((counter + var10), sizeof(char*), 0x1, file);
size_t size8 = fwrite(var10 +counter + 0x4, sizeof(char*), 0x1, file);
size_t size9 = fwrite(var10 + counter + 0x8, sizeof(char*), 0x1, file);
size_t sizeA = fwrite(var10 + counter + 0xC, sizeof(char*), 0x1, file);
size_t sizeB = fwrite(var10 + counter + 0x10, sizeof(char*), 0x1, file);
}
}
}
}
fclose(file);
return true;
}
return false;
}
