Reverse

OllyDBG

Для Win7+ только 2.1

ESP указывает на самое верхнее значение стека.
EIP указывает на текущую инструкцию.
EBP указывает на стоковый фрейм. Стековый фрейм — часть стека, выделяемая процедуре в момент её активации для хранения локальных переменных.

GetWindowTextA(W) — в eax возвращает длину прочитанной строки,

PUSHAD == push EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

MOV DWORD PTR DS:[$addr$], EAX — 4 байта
MOV AX, WORD PTR DS:[$addr$] — 2 байта
MOV AL, BYTE PTR DS:[$addr$] — 1 байт
MOVSX == содержимое второго операнда в первый, причем первый вдвое больше, чем второй (exp: movsx eax, bx). Заполнение FFFFF
MOVZX == аналогично, но заполнение 0000

LEA == MOV, но первый операнд — регистр, а второй — память. В регистр размещается АДРЕС, а не содержимое по адресу.

TEST — логическое И. Типичное использование:
Test a, a — сравнение на a = 0
Test a, b — сравнение на равенство.

LODS — данные, на которые указывает ESI в аккумулятор (то бишь eax)

if ( *(_WORD *)a2 ) обычно равносильно if (a2[0] != 0)
Тогда b = (*(_WORD *)(a2 + 2*v5)) равносильно b = a2[2*v5];
Здесь и далее под a2[] понимается массив со случайным именем, для которого a2 является указателем на нулевой элемент массива.

Быстрое деление на 10:
mov eax, 66666667h ; магическое число для деления на 2,5
imul ecx ; EDX:EAX ← EAX (в edx — результат деления на 2,5)
sar edx, 2 ; результат делится на 4. получается edx = ecx / 10

IDA:
Если переменная заполняется отрицательным значением — это локальная переменная. Если положительным — это переменная из вызова функции.
Голубая стрелка — циклы
Красная — false
Зеленая — true

Почему смещения обычно прибавляются к ebp: функция выгружается в стек, ebp указывает на начало стека. Т.е. lea eax, [ebp + var_144] равносильно eax = &var_144
Еще один традиционный метод: esi + edi. esi обычно счетчик (и далее будет ин(де)крементирован), edi — буффер. Т.е. mov [esi+edi], al равносильно edi[esi] = al

0Dh = ‘\r’
0Ah = ‘\n’

Сравнение реестра до и после установки приложений

RegDiff:
Иногда не может прочитать HLM\Software. Потенциально — надо ручками все отдельно перебирать.

Можно не сравнивать (маловероятно наличие изменений):
HLM\bcd0000…
HLM\hardware
HLM\sam
HLM\config
HLM\system

Обязательно проверить:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_USERS
HKEY_CURRENT_CONFIG
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001
HLM\Software\{название_компании|продукта}
HLM\Software\Microsoft\Windows NT\CurrentVersion\

Автоматизированное решение: cuckoo (online-версия: https://malwr.com)

IDA:
https://github.com/isislab/Fentanyl/pull/12/files?diff=split&short_path=04c6e90
(Python with the idautils module !!!)

Messages Codes:
http://www.mazama.net/scheme/v12/w32message.scm
Стандартный старт проверок:
10h -> 110h -> 111h (111 == WM_COMMAND == кнопка, например, вообще любой объект, засылающий родительскому окну нечто)

Reverse