Ассемблер, основы для взлома игр.

123 Team
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
15 Апр 2021
Сообщения
24
Реакции
5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здраствуйте всем! С вами я DarkCryser. Часто сталкиваюсь в интернете с людьми которые не умеют реверсить. И даже не знают основы ассемблера для реверса. Так вот встречайте меня, я вам покажу, объясню что такое этот ваш "Ассемблер?" и научу основам и понятиям.

Начнем с первого: Что такое ассемблер? Ассемблер это машинно-ориентированный
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Первый ассемблер был написан на машинном коде. Поэтому он настолько низко уровневый, это не плохо, это даже хорошо! Так как мы можем практически работать с нашим процессором на уровне машинного кода. Это позволит процессору обрабатывать нашу программу куда быстрее, чем если-бы она была написана к примеру на C++, и понятно что мы можем больше написать чем на том же C++.

С этим разобрались. Теперь начнем с главного. Какой ассемблер учить? Давайте сначала разберемся с синтаксисом. У данного языка программирования два синтаксиса. Первый называется: AT&T. А второй: INTEL. для примера я приведу код отличия два данных синтаксиса:
Код:
Expand Collapse Copy
// AT&T
movl %eax, %ebx

; INTEL
mov eax, ebx
Ну а в чем же отличия? Какой синтаксис лучше? Давайте разберемся. AT&T и INTEL одинаковы. Правда по синтаксису AT&T нету уроков и гайдов в интернете а на INTEL есть. Тут очевидно INTEL лучше! Вот кому интереснее про эти синтаксисы:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Теперь давайте приступим к выбору ассемблера какой лучше? Есть ассемблеры (FASM, MASM, NASM, WASM, TASM и т.д). Дам совет и линуксойдам. Если вы на Linux без разборов выбирайте FASM. Ну а если вы на Windows как и я лучше выбрать MASM.

Теперь приступим к практике!

Давайте разберемся с базовым синтаксисом:
Код:
Expand Collapse Copy
; Комментарий.

; Помещение данных из регистра 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 битной иде, и видим такую картину:
18.04.2021 01_06_33.png

Смотрим скриншот и в иде нажимаем "Пробел" мы с дерево функций переместились на код. Нажимаем G и прыгаем по адресу 412470. Видим:
Код:
Expand Collapse Copy
.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
Это сама функция main нажимаем F5 и если ваша ида про имеет декомпилятор HexRays У вас появится C++-подобный код:
Код:
Expand Collapse Copy
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;
}
Скачать саму программу можно ниже. На этом пока что все. Во второй части мы отреверсим какую не-будь игрушку. С вами был DarkCryser. Пока!
 

Вложения

Последнее редактирование:
Вау, спасибо это первый реально полезный пост жду еще
 
Ну, давай начнём с того, что
Ассемблер это машинно-ориентированный язык программирования низкого уровня.
Уже неверно дано определение. То, что определил ты - это "Язык ассемблера". А ассемблер - транслятор из языка ассемблера в машинный код.
Придрался к этому, потому что тема громко названа.

;; xor - обнулить регистры.
Бред. Да, xor используется для обнуления регистра, но основное назначение этой инструкции абсолютно другое(исключающее или).
Про ;; adc тоже советую почитать.

Дальше:
У вас появится C++-подобный код:
Не C++-подобный, а C-подобный псевдокод



Я просто не понимаю, почему тема так названа, если она должна называться: "Что будет если нажать F5 в IDA". То есть привел результат дизассемблера, и вместо того, чтобы объяснить, что там происходит, просто "Нажмите F5". Самому не смешно?
 
Назад
Сверху Снизу