###### tags: `module11` `revers` `programming language` `c` `process`
[ToC]
# Занятие 2. Понятие процесса и исполняемого файла. Основы языка C.
## Видеозапись урока
{%youtube 828j5XtlYOo %}
### timecodes
00:00:00 Ждем
00:07:55 что было и что будет сегодня
00:09:00 Вступление
00:15:50 Функциональность Windows
00:19:45 Структурные компоненты
00:27:00 Типы данных
00:32:55 Структуры и указатели
00:36:45 Union
00:38:40 Циклы в Си
00:41:00 Ветвления
00:43:50 Типы WinAPI
00:49:10 Вызовы функции
00:53:20 Перерыв
00:59:05 Visual Studio
01:13:20 Структура PE
01:18:25 Dos & PE headers
01:23:11 File & Optional headers
01:31:25 Export & Import
01:34:00 Важные секции в PE
01:39:50 Используемые библиотеки
01:45:00 Перерыв
02:00:20 Текущее состояние процесса
02:13:25 Process explore
02:15:55 Системные процессы
`---`
02:25:50 Методы создания процесса
02:33:25 Стартовые функции исполняемых файлов
02:36:20 Импорт функций
02:38:55 Прототипирование функций
02:49:00 Практика
03:05:00 Запустили дебаг
03:14:25 Второй проект
03:19:45 Вопросы
## ОС Windows
### Функциональность
Функциональность Windows дают широкие возможности как для пользователя, так и доя атакующего
• Управление процессами и потоками
злоумышленники часто могут разделять нагрузки по потокам
• Параллелизм
• Устройства ввода - вывода
стараются перехватить все события
• Управление памятью
работа с чужим адресным пространством
• Работа с файлами
• Распределенные системы и сети
### Структурные компоненты

## Основы языка С
### Типы переменных
```c=
Тип Размер в байтах Интервал
char 1 (8) от -128 до 127
unsigned char 1 (8) от 0 до 255
int 2 (16) от -32768 до 32767
unsigned int 2 (16) от 0 до 65535
short int 2 (16) от -32768 до 32767
unsigned short int 2 (16) от 0 до 65535
long int 4 (32) от -2147483648 до 2147483647
unsigned long int 4 (32) от 0 до 4294967295
char * строка
```
### Типы и указатели
```c=
// при создание этих масивов по умолчанию не будут
// нули и там может оказать любой мусор из кучи или стэка
int a[100];
char b[20];
// тут же при создание мы сразу определяем значения
//для каждого элемнта
int c[5] = {0,1,2,3,4};
//для всех
char d[8] = {0};
```
### Структуры
обычная структура обращение идет через **.**

ссылка на структуру - обращение через **->**

union

### Циклы

### Ветвления
### Типы WinAPI
```c
Тип Определение
BOOL typedef int BOOL
BYTE typedef unsigned char BYTE
CHAR typedef char CHAR
DWORD typedef unsigned long DWORD
INT typedef int INT
LPCSTR typedef __nullterminated CONST CHAR *LPCSTR
LPWSTR typedef WCHAR *LPWSTR
WORD typedef unsigned short WORD
PVOID typedef void *PVOID
```
unsigned - число без знака,
в случае выхода значения за диапазон и получим переполнение
### Вызовы функции

docs.microsoft.com - искать тут
A - функция получает ASCI символы
W - получает unicode
### Visual Studio
Полезные hotkey
• Ctrl + Shift + B: сборка проекта
• F9: поставить/снять брейкпоинт
• F5: запуск приложения
• F10: шаг отладки без захода в функцию
• F11: шаг отладки с заходом в функцию
• F12: перейти к определению функции или переменной
## Исполняемый файл
исполняемые файлы .exe .dll .scr .msi .com .sys
### Структура PE
• Заголовок DOS
для обратной совместимости
всегда начинаться с MZ
• Заглушка DOS
• Заголовок PE
описывает внутренности файла для какой архитектуры, время компиляции, dll или exe, консольной или оконное
описание директорий данных импорт-экспорт
• Заголовки секций
• Секции
код, данные свои и импортированные


для 64 и 32 разрядов структуры разные
для 32 - 4 байт отступ
для 64 - 8 байт
переслушать часть

AddressOfEntryPoint - входная точка программы.
BaseOfCode - адрес начала кода
ImageBase - важен для библиотек,
ImageDataDirectory каталоги данных Импорта, Экспорт, переменные для разных потоков
Секция импорта - функции которые когда-либо будут использованы из другой библиотеки
экспорт описывает функции, которые могут быть вызваны из этой библиотеки
Секция импорта позволяет нам увидеть какие функции приложения собирается использовать и \это может нам понят какие возможности будут у приложения

DataDirectory[0] - export
DataDirectory[1] - import

соответственно анализ экспорта позволяет быстро понять, что библиотека отдает наружу
### Секции PE
• .text: Код
• .data: Инициализированные данные
все что уже точно определено и задано еще при компиляции
• .bss: Неинициализированные данные
все что определили, но не задали
• .rdata: Константные данные
эти две секции могут быть необязательно
• .edata: Дескрипторы экспорта
• .idata: Дескрипторы импорта
• .reloc: Таблица релокации
используя предпочтительный адрес из хедера ImageBase можем посчитать адреса, если возникли проблемы с размещением в памяти (так вроде понял)
• .rsrc: Ресурсы
иконки, манифесты и прочая ерунда. Любят использовать злоумышленники, так в ресурсы можно спрятать еще один исполняемый файл.
• .tls: __declspec(thread) данные
данные которые шарят между потоками. Ни какой связи с сертификатами
### Используемые библиотеки
```c=
Библиотеки Функциональность
kernel32.dll Содержит основную функциональность, связанную с доступом и обработкой памяти,
файлов и аппаратного обеспечения
advapi32.dll Предоставляет расширенный доступ к основным компонентам Windows, таким как менеджер служб и реестр; **шифрования**
shell32.dll Предоставляет элементы оболочки Win32. програмный аналог explorer
user32.dll Содержит все компоненты UI: кнопки, окна, действия пользователя
gdi32.dll Отображает и обрабатывает графику
ntdll.dll Предоставляет интерфейс доступа к ядру. большинство библиотек выше используют эту библиотеку. плохо документирована и может быть использованна продвинутыми злоумышлинниками
wsock32.dll и ws2_32.dll Отвечает за низкоуровневый доступ к сети (голые сокеты)
wininet.dll и winhttp.dll Отвечает за высокоуровневый доступ к сети (HTTP/HTTPS/FTP)
```
## Понятие процесса
### Текущее состояние процесса
• код запущенной программы
• статические данные для запущенной программы
• динамические данные, находящиеся в куче (heap), и указатель на кучу
• указатель на следующую исполняемую инструкцию
• стек (stack) с цепочкой вызовов функций(FILO)
раскручивая цепочку стека вниз можно понять какие функции вызывались и с какими параметрами
• значения CPU-регистров
• набор системных ресурсов
выделенная память, файлы, библиотеки


***PEB** - регион в памяти в который хранит данные о всех исполняемых файлах, загруженных внутрь в процесса
Злоумышленник может используя эту структуру, может не прописывать к себе в зловред нужные функции из kernel32.dll или других библиотек, он может их найти в памяти и вызвать напрямую.
rundll32.exe может запускать библиотеки и также используется злоумышленниками для запуска своих
## Системные процессы
• System - само ядро и потоки режима ядра .sys(драйвера)
• smss.exe - диспетчер сеансов rdp, smb etc
• csrss.exe - клиент-сервер винды. **без родителя** есть одно кратковременное исключение
• wininit.exe -
• services.exe - фоновый процессы и службы.
• svchost.exe - оболочка для запуска служб.
Оба приложения выше очень любят злоумышленники. Смотреть обязательно откуда запущена служба
+ RuntimeBrocker.exe - прокси процесс для универсальных приложений винды из магазина. Позволяет запустить приложение независимо от архитектуры. Для каждого универсально приложения будет запущен этот процесс
• taskhostw.exe - хост процесс планировщика задач. Запущен под svchost
• lsass.exe - отвечают за подсистему локальной аутентификации. Проверка пароля и вход в систему
• lsaiso.exe - дополнение в 10 , позволяет хранить креды изолированно от других процессов. Мешает приложениям типа мимикатз
• winlogon.exe - обрабатывает пользовательские входы - выходы, загружает окружение пользователя, обращается к lsa для проверки логина и пароля
• explorer.exe - обычно один на пользователя

---
02:13:20 Alexey Polyakov: 0x80000000
02:18:19 Alexey Polyakov: rundll32
02:18:32 Михаил: периферия?
02:27:08 Alexey Polyakov: mimikatz
02:39:19 Alexey Polyakov: dll-h
02:52:15 Михаил: А где этот файл взять?
02:52:33 Temir: Какой файл отркрыть?
03:02:50 Михаил: HMODULE откуда такой тип?
03:03:02 Михаил: из заголовочного файла?
03:03:59 Михаил: Понял, спасибо
03:04:46 Alexey Polyakov: f12
03:09:17 Alexey Polyakov: f5
03:09:29 Михаил: мы предполагаем, что файл со зловредным кодом, который передаем на вход функции?
03:10:31 Alexey Polyakov: f10
03:16:48 Михаил: Не совсем понял для чего мы сделали прототипирование функций. Без этого мы не смогли бы использовать оригинальные функции напрямую из dll?
03:17:50 Михаил: Понял))
03:18:01 Михаил: Чтобы обфусцировать
03:19:04 Alexey Polyakov: C:\Windows\SysWOW64
03:19:21 Alexey Polyakov: system32 sysWOW64
03:19:28 Михаил: Разрядность
03:20:06 Eduard Kolibabchuk: SysWOW == Windows on Windows64
03:20:07 Виктор Зварыкин: мдааа, Денис
03:34:25 Михаил: Хорошего вечера, спасибо!