OllyDBG 将 ASM 翻译成 C

逆向工程 拆卸 ollydbg
2021-06-19 12:44:00

我正在尝试将库函数反向工程回 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;
}
1个回答

有问题的程序集定义了一些结构并操纵结构的一些成员

c/c++ 中的代码可能看起来类似于源窗口中显示的内容,并且您正在使用的反汇编在下面的屏幕截图中以蓝色突出显示

在此处输入图片说明