Ручная декомпиляция - это искусство превращения двоичного фрагмента программы в фрагмент на языке высокого уровня (как правило, С/С++) или псевдокод. В этом комплексе упражнений вам следует восстановить исходный код бинарного фрагмента в код на С/С++ или псевдокод.
Для примера рассмотрим следующий фрагмент:
Code:
mov ebx, offset src
push n
push c
push ebx
push offset dest
call _memccpy
add esp, 10h
После декомпиляции он приобретет следующий вид:
Code:
memcpy(dest,src,c,n);
В последующих заданиях, вам следует проделать такую же работу, как и с приведенным выше примером, т.е. из ассемблерного фрагмента воссоздать его представление в псевдокоде или представить его интерпретацию на языке C/C++.
Ручная декомпиляция – Упражнение 1
Проанализировать ассемблерный код и понять как он работает:
Code:
...
mov edx, Var1
mov ecx, Var2
mov eax, edx
imul ecx
mov edx, eax
imul edx, eax
mov Var3, ecx
...
Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 2
Ниже приведенный фрагмент кода - представляет собой простой цикл. Проанализировать его работу и понять как он работает:
Code:
...
mov dword ptr [esi], 1
xor edx, edx
mov [ebx], edx
jmp short loc_4012F1
loc_4012E8:
mov ecx, [esi]
imul ecx, [esi]
mov [esi], ecx
inc dword ptr [ebx]
loc_4012F1:
cmp dword ptr [ebx], 8
jl short loc_4012E8
...
Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 3
Ниже приведенный фрагмент кода - содержит два условных оператора ветвления. Проанализировать его работу и понять как он работает:
Code:
push sPassword ; line of code
call _strlen
pop ecx
mov esi, eax
mov ebx, offset sMyPassword; ; line of code
push ebx
call _strlen
pop ecx
cmp esi, eax ; small block of code
jz short loc_4012B2
xor eax, eax
jmp short end_proc
loc_4012B2:
push esi
push ebx ; line of code
push sPassword
call _strcmp
add esp, 8
test eax, eax ; small block of code
jnz short loc_4012CC
mov eax, 1
jmp short end_proc
loc_4012CC:
xor eax, eax
end_proc: ; end of function
pop esi
pop ebx
pop ebp
retn
Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Так же нужно объяснить какие конструкции следует изменить (пропатчить), что бы функция всегда возвращала положительный результат.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 4
Вы уже знаете, как реверсировать базовые коды.
Давайте возьмем следующий код:
Code:
push ebp
mov ebp, esp
add esp, -80h
push ebx
mov eax, V2
mov ebx, eax
mov ecx, V3
imul ebx, ecx
mov V4, ebx
mov edx, V1
add edx, eax
sub edx, ecx
mov V1, edx
add ebx, edx
mov V3, ebx
Рассмотрим его в следующем порядке:
Code:
push ebp --> создание стека
mov ebp, esp
add esp, -80h --> наш стек занимает 128 байт
push ebx --> сохраняем содержимое ebx
mov eax, V2 --> значение V2
mov ebx, eax --> дублируем значение V2
mov ecx, V3 --> значение V3
imul ebx, ecx --> считаем V2 * V3 в ebx
mov V4, ebx --> “V4 = V2 * V3”, в ebx записываем V4
mov edx, V1 --> значение V1
add edx, eax --> считаем (V1+V2) в edx
sub edx, ecx --> считаем (V1+V2) - V3
mov V1, edx --> “V1 = (V1+V2) - V3”
add ebx, edx --> считаем (V2*V3) + V1
mov V3, ebx --> “V3= V4+V1”
Таким образом, весь ассемблерный код может быть декомпилирован в следующий вид:
Code:
{
unsigned char buffer[128];
V4 = V2*V3;
V1 = V1+V2-V3;
V3 = V4+V1;
...
В этом упражнении вам нужно всего-лишь проанализировать ассемблерный фрагмент и понять почему был сформирован именно такой код на "С".
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 5
Проанализировать ассемблерный код и понять как он работает:
Code:
proc near
arg_0 = dword ptr 8
arg_4 = dword ptr 0Ch
arg_8 = dword ptr 10h
push ebp
mov ebp, esp
push ebx
push esi
mov ecx, [ebp+arg_8]
mov esi, [ebp+arg_0]
mov eax, [ebp+arg_4]
mov edx, esi
test ecx, ecx
jnz short loc_40125A
xor eax, eax
jmp short loc_401265
loc_401254:
mov bl, [eax]
inc eax
mov [edx], bl
inc edx
loc_40125A:
mov ebx, ecx
add ecx, -1
test ebx, ebx
jnz short loc_401254
mov eax, esi
loc_401265:
pop esi
pop ebx
pop ebp
retn
endp
Восстановить точный С/С++ код этого фрагмента.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 6
Проанализировать ассемблерный код и понять как он работает:
Code:
proc near
V1 = dword ptr 8
V2 = dword ptr 0Ch
V3 = dword ptr 10h
V4 = dword ptr 14h
push ebp
mov ebp, esp
push esi
push edi
mov edi, [ebp+V4]
mov esi, [ebp+V3]
mov edx, [ebp+V2]
mov eax, [ebp+V1]
test edi, edi
jnz short loc_40122C
xor eax, eax
jmp short loc_401237
loc_401219:
mov ecx, esi
cmp cl, [edx]
jz short loc_401227
mov cl, [edx]
mov [eax], cl
inc edx
inc eax
jmp short loc_40122C
loc_401227:
mov [eax], cl
inc eax
jmp short loc_401237
loc_40122C:
mov ecx, edi
add edi, -1
test ecx, ecx
jnz short loc_401219
xor eax, eax
loc_401237:
pop edi
pop esi
pop ebp
retn
endp
Восстановить точный С/С++ код этого фрагмента.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 7
Номера, указанные слева, представляют собой значения указателя стека в функции. Вам нужно восстановить точный код на С/С++ или псевдокод для этого фрагмента:
Code:
proc near
000 push ebx
004 push esi
008 xor ebx, ebx
008 mov [eax], ebx
008 mov ebx, ecx
008 dec ebx
008 test ebx, ebx
008 jl short loc_408135
008 inc ebx
loc_40810E:
008 mov ecx, [eax]
008 shl ecx, 4
008 movzx esi, byte ptr [edx]
008 add ecx, esi
008 mov [eax], ecx
008 mov ecx, [eax]
008 and ecx, 0F0000000h
008 test ecx, ecx
008 jz short loc_40812D
008 mov esi, ecx
008 shr esi, 18h
008 xor [eax], esi
loc_40812D:
008 not ecx
008 and [eax], ecx
008 inc edx
008 dec ebx
008 jnz short loc_40810E
loc_408135:
008 pop esi
004 pop ebx
000 retn
sub_408100 endp
После того, как код будет представлен в высокоуровневой интерпретации, вам следует определить используемый алгоритм и назвать его. Он относится к основам криптографии.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Упражнение 8
Проанализировать ассемблерный код и понять как он работает:
Code:
sub_408138 proc near
000 push ebx
004 push esi
008 mov esi, edx
008 dec esi
008 test esi, esi
008 jl short loc_40816F
008 inc esi
loc_408142:
008 xor edx, edx
008 mov dl, [eax]
008 xor ebx, ebx
008 mov bl, cl
008 add edx, ebx
008 test edx, edx
008 jge short loc_40815B
008 mov ebx, 100h
008 sub ebx, edx
008 mov edx, ebx
008 jmp short loc_408169
loc_40815B:
008 cmp edx, 100h
008 jle short loc_408169
008 sub edx, 100h
loc_408169:
008 mov [eax], dl
008 inc eax
008 dec esi
008 jnz short loc_408142
loc_40816F:
008 pop esi
004 pop ebx
000 retn
sub_408138 endp
Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Вы так же должны определить используемый алгоритм и назвать его соответствующим образом. Он относится к основам криптографии.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили:
Ручная декомпиляция – Анализ реального кода 9
Исследовать следующий фрагмент, взятый из моделируемой системы защиты, и проанализировать его:
Code:
procedure0 proc near
000 push 0
004 push procedure1
008 call EnumWindows
000 retn
procedure0 endp
------
procedure1 proc near
ClassName = byte ptr -204h
String = byte ptr -104h
hwnd = dword ptr -4
V1 = dword ptr 8
000 push ebp
004 mov ebp, esp
004 add esp, -204h
208 push ebx
20C push esi
210 push edi
214 mov edi, [ebp+V1]
214 push 100h
218 lea eax, [ebp+String]
218 push eax
21C push edi
220 call GetWindowTextA
214 mov [ebp+eax+String], 0
214 push 100h
218 lea eax, [ebp+ClassName]
218 push eax
21C push edi
220 call GetClassNameA
214 mov [ebp+eax+ClassName], 0
214 mov esi, 3
214 mov ebx, offset Address1
Label1:
214 lea eax, [ebp+ClassName]
214 call tolower
214 mov edx, [ebx]
214 call Sysutils::StrPos(char *,char *)
214 test eax, eax
214 jnz short Label2
214 lea eax, [ebp+String]
214 call tolower
214 mov edx, [ebx]
214 call Sysutils::StrPos(char *,char *)
214 test eax, eax
214 jz short Label3
Label2:
214 push 0
218 push offset aSyslistview32
21C push 0
220 push edi
224 call FindWindowExA
214 mov [ebp+hwnd], eax
214 push 0
218 push 0
21C push 1009h
220 mov eax, [ebp+hwnd]
220 push eax
224 call SendMessageA
214 push 0
218 push 0
21C push 0Fh
220 mov eax, [ebp+hwnd]
220 push eax
224 call SendMessageA
214 push 0
218 push 0
21C push 02h
220 push edi
224 call SendMessageA
214 push 0
218 push 0
21C push 10h
220 push edi
224 call SendMessageA
Label3:
214 add ebx, 4
214 dec esi
214 jnz short Label1
214 mov al, 1
214 pop edi
210 pop esi
20C pop ebx
208 mov esp, ebp
004 pop ebp
000 retn 8
procedure1 endp
aSyslistview32 db 'SysListView32'
Address1:
dd offset aRegmon ; "REGMON"
dd offset aFilemon ; "FILEMON"
dd offset aRegmonex ; "REGMONEX"
Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Во всех местах, где это нужно, заменить числовые значения на константы, определенные в MSDN или в Windows header files. Так же вам нужно дать детальное описание, представленного фрагмента, а так же описать его работу в рамках системы защиты от копирования.
Варианты решений, присылать на email: support@reverse4you.org
Данное задание успешно выполнили: