- Статус
- Оффлайн
- Регистрация
- 15 Апр 2021
- Сообщения
- 24
- Реакции
- 5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здраствуйте всем! С вами я DarkCryser. Часто сталкиваюсь в интернете с людьми которые не умеют реверсить. И даже не знают основы ассемблера для реверса. Так вот встречайте меня, я вам покажу, объясню что такое этот ваш "Ассемблер?" и научу основам и понятиям.
Начнем с первого: Что такое ассемблер? Ассемблер это машинно-ориентированный
С этим разобрались. Теперь начнем с главного. Какой ассемблер учить? Давайте сначала разберемся с синтаксисом. У данного языка программирования два синтаксиса. Первый называется: AT&T. А второй: INTEL. для примера я приведу код отличия два данных синтаксиса:
Ну а в чем же отличия? Какой синтаксис лучше? Давайте разберемся. AT&T и INTEL одинаковы. Правда по синтаксису AT&T нету уроков и гайдов в интернете а на INTEL есть. Тут очевидно INTEL лучше! Вот кому интереснее про эти синтаксисы:
Теперь давайте приступим к выбору ассемблера какой лучше? Есть ассемблеры (FASM, MASM, NASM, WASM, TASM и т.д). Дам совет и линуксойдам. Если вы на Linux без разборов выбирайте FASM. Ну а если вы на Windows как и я лучше выбрать MASM.
Теперь приступим к практике!
Давайте разберемся с базовым синтаксисом:
Давайте разберемся что такое опкоды? Опкоды это код функций.
Ну а теперь попробуем отреверсить не большой участок программы написаной на C++ x86, которая выводит "Hello World!". Для этого качаем программу IDA Pro 7.2 с HexRays. Открываем программу в 32 битной иде, и видим такую картину:
Смотрим скриншот и в иде нажимаем "Пробел" мы с дерево функций переместились на код. Нажимаем G и прыгаем по адресу 412470. Видим:
Это сама функция main нажимаем F5 и если ваша ида про имеет декомпилятор HexRays У вас появится C++-подобный код:
Скачать саму программу можно ниже. На этом пока что все. Во второй части мы отреверсим какую не-будь игрушку. С вами был DarkCryser. Пока!
Начнем с первого: Что такое ассемблер? Ассемблер это машинно-ориентированный
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Первый ассемблер был написан на машинном коде. Поэтому он настолько низко уровневый, это не плохо, это даже хорошо! Так как мы можем практически работать с нашим процессором на уровне машинного кода. Это позволит процессору обрабатывать нашу программу куда быстрее, чем если-бы она была написана к примеру на C++, и понятно что мы можем больше написать чем на том же C++.С этим разобрались. Теперь начнем с главного. Какой ассемблер учить? Давайте сначала разберемся с синтаксисом. У данного языка программирования два синтаксиса. Первый называется: AT&T. А второй: INTEL. для примера я приведу код отличия два данных синтаксиса:
Код:
// AT&T
movl %eax, %ebx
; INTEL
mov eax, ebx
Пожалуйста, авторизуйтесь для просмотра ссылки.
Теперь давайте приступим к выбору ассемблера какой лучше? Есть ассемблеры (FASM, MASM, NASM, WASM, TASM и т.д). Дам совет и линуксойдам. Если вы на Linux без разборов выбирайте FASM. Ну а если вы на Windows как и я лучше выбрать MASM.
Теперь приступим к практике!
Давайте разберемся с базовым синтаксисом:
Код:
; Комментарий.
; Помещение данных из регистра eax в ebx.
mov eax, ebx
;;;;;Базовые Команды;;;;;;
;; mov - перемещение данных.
;; push - положить в стэк.
;; pop - взять из стэка.
;; inc - инкримент.
;; int - Вызов прерывания.
;; xor - обнулить регистры.
;; adc - сложение.
;; call - вызов функции.
;; jmp - Безусловная передача управления - опкод: 0xE9.
;; nop - ничего не делать - опкод: 0x90.
;;;;;;;;;;;;;;;;;;;;;;;;;;
Ну а теперь попробуем отреверсить не большой участок программы написаной на C++ x86, которая выводит "Hello World!". Для этого качаем программу IDA Pro 7.2 с HexRays. Открываем программу в 32 битной иде, и видим такую картину:
Смотрим скриншот и в иде нажимаем "Пробел" мы с дерево функций переместились на код. Нажимаем G и прыгаем по адресу 412470. Видим:
Код:
.text:00412470 sub_412470 proc near ; CODE XREF: sub_411325↑j
.text:00412470
.text:00412470 var_C0 = byte ptr -0C0h
.text:00412470
.text:00412470 push ebp
.text:00412471 mov ebp, esp
.text:00412473 sub esp, 0C0h
.text:00412479 push ebx
.text:0041247A push esi
.text:0041247B push edi
.text:0041247C lea edi, [ebp+var_C0]
.text:00412482 mov ecx, 30h
.text:00412487 mov eax, 0CCCCCCCCh
.text:0041248C rep stosd
.text:0041248E mov ecx, offset unk_41E029
.text:00412493 call sub_411370
.text:00412498 push offset Str ; "Hello World!\n"
.text:0041249D mov eax, ds:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:004124A2 push eax ; int
.text:004124A3 call sub_41119F
.text:004124A8 add esp, 8
.text:004124AB xor eax, eax
.text:004124AD pop edi
.text:004124AE pop esi
.text:004124AF pop ebx
.text:004124B0 add esp, 0C0h
.text:004124B6 cmp ebp, esp
.text:004124B8 call sub_411285
.text:004124BD mov esp, ebp
.text:004124BF pop ebp
.text:004124C0 retn
.text:004124C0 sub_412470 endp
Код:
int sub_412470() // int main()
{
sub_411370(&unk_41E029);
sub_41119F(std::cout, "Hello World!\n"); // std::cout << "Hello World!\n";
return sub_411285(); // return 0;
}
Вложения
Последнее редактирование: