понедельник, 23 октября 2017 г.

Reverse Engineering Example

Крис_Касперски_-_Образ_мышления_-_дизассемблер_IDA._Том_1.pdf


Мы имеем программу написанную на языке Си. 

/*СТЕК - Объем памяти, задействованный под автоматические переменные, возрастает и уменьшается.
КУЧА (СВОБОДНОЕ ХРАНИЛИЩЕ)- динамически выделенная память*/

//ПРИМЕР - ГДЕ ЧТО НАХОДИТСЯ В ПАМЯТИ 

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

int static_store = 30;
const char * pcg = "Строковый литерал";

int main()
{
int auto_store = 40;
char auto_string[] = "Автоматический массив char";
int * pi;
char * pc1;
/*Строка кода выделяет в памяти пространство, достаточное для хранения запрошенного кол-ва элементов и затем присваивает 
 адрес этого блока указателю pi*/
pi = (int *) malloc(sizeof(int));
*pi = 35;
/*Строка кода выделяет в памяти пространство, достаточное для хранения запрошенного кол-ва элементов и затем присваивает 
 адрес этого блока указателю pc1*/
pc1 = (char *) malloc(strlen("Динамическа строка") +1); 
strcpy(pc1, "Динамическая строка");
printf(" static_store: %d по адресу %p \n", static_store, &static_store);
printf(" auto_store: %d по адресу %p \n", auto_store, &auto_store);
printf(" *pi: %d по адресу %p \n", *pi, pi);
printf(" %s по адресу %p \n", pcg, pcg);
printf("%s по адресу %p \n", auto_string, auto_string);
printf(" %s по адресу %p \n", pc1, pc1);
printf(" %s по адресу %p \n", "Строка в кавычках", "Строка в кавычках");
free(pi); //free() восстанавливает память в пуле
free(pc1);
getchar();
getchar();
return 0;
}

----------------------------------------
//Вывод на экран

        static_store: 30 по адресу 00407000
        auto_store: 40 по адресу 0028ff04
                *pi: 35 по адресу 00550dd8
                Строковый литерал по адресу 00408024
Автоматический массив char по адресу 0028fee9
                Динамическая строка по адресу 00550df8
                Строка в кавычках по адресу 004080ba

Использую дизассемблер IDA pro 6.6 или другой версии получаем длинный машинный код из которого находим код нашей программы. 

byte - 8 бит
dword - doubleword = 4 байта = 32 бита 

.text:00401369 ; --------------- S U B R O U T I N E ---------------------------------------
.text:00401369
.text:00401369 ; Attributes: bp-based frame
.text:00401369
.text:00401369 sub_401369      proc near               ; CODE XREF: sub_401000+F8 p
.text:00401369
.text:00401369 var_40          = dword ptr -40h ;Инициализация переменной var_40, byte - размер, ptr - указатель
.text:00401369 var_3C          = dword ptr -3Ch ;Инициализация переменной var_3C, dword - размер, ptr - указатель
.text:00401369 var_38          = dword ptr -38h
.text:00401369 var_28          = dword ptr -28h
.text:00401369 var_23          = dword ptr -23h
.text:00401369 var_1F          = dword ptr -1Fh
.text:00401369 var_1B          = dword ptr -1Bh
.text:00401369 var_17          = dword ptr -17h
.text:00401369 var_13          = dword ptr -13h
.text:00401369 var_F           = word ptr -0Fh
.text:00401369 var_D           = byte ptr -0Dh
.text:00401369 var_C           = dword ptr -0Ch
.text:00401369 var_8           = dword ptr -8
.text:00401369 var_4           = dword ptr -4
.text:00401369
.text:00401369                 push    ebp
.text:0040136A                mov     ebp, esp
.text:0040136C                and     esp, 0FFFFFFF0h
.text:0040136F                sub     esp, 40h        ; void *
.text:00401372                 call    sub_401AB0 ;Вызов функции
.text:00401377                 mov     [esp+40h+var_C], 28h
.text:0040137F                 mov     [esp+40h+var_28+1], 0EEF2E2C0h
.text:00401387                 mov     [esp+40h+var_23], 0E8F2E0ECh
.text:0040138F                 mov     [esp+40h+var_1F], 0EAF1E5F7h
.text:00401397                 mov     [esp+40h+var_1B], 0EC20E9E8h
.text:0040139F                 mov     [esp+40h+var_17], 0E8F1F1E0h
.text:004013A7                 mov     [esp+40h+var_13], 686320E2h
.text:004013AF                 mov     [esp+40h+var_F], 7261h
.text:004013B6                 mov     [esp+40h+var_D], 0
.text:004013BB                 mov     [esp+40h+var_40], 4
.text:004013C2                 call    malloc ;вызов функции malloc()
.text:004013C7                 mov     [esp+40h+var_4], eax
.text:004013CB                 mov     eax, [esp+40h+var_4]
.text:004013CF                 mov     dword ptr [eax], 23h
.text:004013D5                 mov     [esp+40h+var_40], 13h
.text:004013DC                 call    malloc ;вызов функции malloc()
.text:004013E1                 mov     [esp+40h+var_8], eax
.text:004013E5                 mov     eax, [esp+40h+var_8]
.text:004013E9                 mov     dword ptr [eax], 0E0EDE8C4h
.text:004013EF                 mov     dword ptr [eax+4], 0E5F7E8ECh
.text:004013F6                 mov     dword ptr [eax+8], 0FFE0EAF1h
.text:004013FD                 mov     dword ptr [eax+0Ch], 0F0F2F120h
.text:00401404                 mov     dword ptr [eax+10h], 0E0EAEEh
.text:0040140B                 mov     eax, dword_407000
.text:00401410                 mov     [esp+40h+var_38], offset dword_407000 
.text:00401418                 mov     [esp+40h+var_3C], eax ;40h - функция записи в файл
.text:0040141C                 mov     [esp+40h+var_40], offset unk_408038
.text:00401423                 call    sub_401340
.text:00401428                 mov     eax, [esp+40h+var_C]
.text:0040142C                 lea     edx, [esp+40h+var_C]
.text:00401430                 mov     [esp+40h+var_38], edx
.text:00401434                 mov     [esp+40h+var_3C], eax
.text:00401438                 mov     [esp+40h+var_40], offset unk_40805C
.text:0040143F                 call    sub_401340
.text:00401444                 mov     eax, [esp+40h+var_4]
.text:00401448                 mov     eax, [eax]
.text:0040144A                 mov     edx, [esp+40h+var_4]
.text:0040144E                 mov     [esp+40h+var_38], edx
.text:00401452                 mov     [esp+40h+var_3C], eax
.text:00401456                 mov     [esp+40h+var_40], offset unk_40807B
.text:0040145D                call    sub_401340
.text:00401462                 mov     edx, off_407004
.text:00401468                 mov     eax, off_407004
.text:0040146D                 mov     [esp+40h+var_38], edx
.text:00401471                 mov     [esp+40h+var_3C], eax
.text:00401475                 mov     [esp+40h+var_40], offset unk_408094
.text:0040147C                call    sub_401340
.text:00401481                 lea     eax, [esp+40h+var_28+1]
.text:00401485                 mov     [esp+40h+var_38], eax
.text:00401489                 lea     eax, [esp+40h+var_28+1]
.text:0040148D                mov     [esp+40h+var_3C], eax
.text:00401491                 mov     [esp+40h+var_40], offset unk_4080A8
.text:00401498                call    sub_401340
.text:0040149D                mov     eax, [esp+40h+var_8]
.text:004014A1                mov     [esp+40h+var_38], eax
.text:004014A5                mov     eax, [esp+40h+var_8]
.text:004014A9                mov     [esp+40h+var_3C], eax
.text:004014AD                mov     [esp+40h+var_40], offset unk_408094
.text:004014B4                 call    sub_401340
.text:004014B9                 mov     [esp+40h+var_38], offset unk_4080BA
.text:004014C1                 mov     [esp+40h+var_3C], offset unk_4080BA
.text:004014C9                 mov     [esp+40h+var_40], offset unk_408094
.text:004014D0                 call    sub_401340
.text:004014D5                 mov     eax, [esp+40h+var_4]
.text:004014D9                 mov     [esp+40h+var_40], eax
.text:004014DC                call    free
.text:004014E1                 mov     eax, [esp+40h+var_8]
.text:004014E5                 mov     [esp+40h+var_40], eax
.text:004014E8                 call    free
.text:004014ED                call    getchar
.text:004014F2                 call    getchar
.text:004014F7                 mov     eax, 0
.text:004014FC                leave
.text:004014FD                retn
.text:004014FD sub_401369      endp
.text:004014FD

Комментариев нет:

Отправить комментарий