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 == кнопка, например, вообще любой объект, засылающий родительскому окну нечто)

Обфускация в Python: python -OO -m py_compile <source.py>

 

Unix System Calls for Networking:

socket | connect | bind | recv, read, recvfrom | send, write, sendfrom

Strace for utility:

strace -e {trace=network, read, write} {/path/to/app args}

Dtrace (as root only):

dtrafe -s traceconnect.d

traceconnect.d source code: https://books.google.ru/books?id=kLgrDwAAQBAJ&pg=PT57&lpg=PT57&dq=traceconnect.d+dtrace&source=bl&ots=PWvr3eBvFq&sig=j5QKg5R_3AZ1ewnPrPwJ1R1X6fI&hl=ru&sa=X&ved=2ahUKEwjFm4-0y5LdAhUF3SwKHU68DTEQ6AEwAXoECAkQAQ#v=onepage&q=traceconnect.d%20dtrace&f=false

Variable Binary Length Data:
— Terminated Data == 0x00 (NULL) at the end
— Bounded Data == ‘, «, ` — surrounded, like: «asd», ‘asd’, etc.
— Length-Prefixed Data == [Len][Data], like: [0x05][‘H’][‘e’][‘l’][‘l’][‘o’]
— Implicit-Length Data == [Size][Val-1][Val-2], like: [0x07][‘\x80\x00’][‘Hello’]
— Padded Data == [Data][padding_till_fixed_len], like: [‘Hello’][‘$$$’] (filled until 8-bytes)

Tag, Length, Value (TLV) pattern:
[Tag][Len][Value] or [Len][Tag][Value]
[08][03][‘Aha’] or [04][08][‘Aha’]

Enabling Routing on Windows:
Find ‘IPEnableRouter’ and set to 1 in HKLM

Enabling Routing on *Nix:
sysctl net.ipv4.conf.all.forwarding=1
sysctl net.ipv6.conf.all.forwarding=1

Enabling Routing on MacOS:
sysctl -w net.inet.ip.forwarding=1

DHCP-Spoofing:
1) ettercap -G
2) sniff -> United Sniffing
3) Interface -> OK
4) Mitm -> Dchp spoofing
5) Set pool value
6) Start -> Start Sniffing

ARP-Poisoning:
1) United Sniffing
2) Iface
3) Hosts -> Scan For Hosts, later — Hosts -> Host List
4) Add to Target k
5) Mitm -> ARP poisoning

Traffic-Producing Application: SuperFunkyChat

Dissecting the Protocol with Python:
1. Binary Conversion
2. Handling Inbound Data
3. Digging into the Unknown Parts of the Protocol
4. Calculating the Checksum
5. Discovering a Tag Value

.NET Disassembling: ILSpy / .NET Reflector
JAVA Disassembling: jd-gui

Capturing traffic with tshark:
tshark -i $INTERFACE -w $FILENAME (tcp port $NUMBER)

Windows Debug and Page Heap:
gflags.exe -i $APPNAME.EXE +hpa

Active Network Capture:
Canape | Canape Core | Mallory

Fuzzing:
AFL | Scapy | Sulley

Spoofing:
DNSMasq | Ettercap

Reverse