Молчи и скрывайся. Прячем IAT от антивируса - «Новости» » Самоучитель CSS
Меню
Наши новости
Учебник CSS

Невозможно отучить людей изучать самые ненужные предметы.

Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3

Надо знать обо всем понемножку, но все о немногом.

Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы

Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)

Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода

Самоучитель CSS

Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5

Новости

Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости

Справочник CSS

Справочник от А до Я
HTML, CSS, JavaScript

Афоризмы

Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы

Видео Уроки


Наш опрос



Наши новости

       
7-09-2023, 00:02
Молчи и скрывайся. Прячем IAT от антивируса - «Новости»
Рейтинг:
Категория: Новости

Parsing PE File Headers with C++ (ired.team)


PE (Portable Executable): На стран­ных берегах («Хаб­рахабр»)


PE-фор­мат. Часть 1 — Базовая информа­ция (kaimi.io)


Те­перь ныр­нем в пучины интерне­та и поищем кас­томную реали­зацию GetProcAddress(). Я выб­рал самый акку­рат­ный и милый вари­ант.


FARPROC myGetProcAddress(HMODULE hModule, LPCSTR lpProcName) {
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((BYTE*)hModule + dosHeader->e_lfanew);
PIMAGE_EXPORT_DIRECTORY exportDirectory = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)hModule +
ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD* addressOfFunctions = (DWORD*)((BYTE*)hModule + exportDirectory->AddressOfFunctions);
WORD* addressOfNameOrdinals = (WORD*)((BYTE*)hModule + exportDirectory->AddressOfNameOrdinals);
DWORD* addressOfNames = (DWORD*)((BYTE*)hModule + exportDirectory->AddressOfNames);
for (DWORD i = 0; i < exportDirectory->NumberOfNames; ++i) {
if (strcmp(lpProcName, (const char*)hModule + addressOfNames[i]) == 0) {
return (FARPROC)((BYTE*)hModule + addressOfFunctions[addressOfNameOrdinals[i]]);
}
}
return NULL;
}

Фун­кция дос­таточ­но прос­та: при­нима­ет базовый адрес заг­рузки биб­лиоте­ки, а так­же имя фун­кции, адрес которой надо получить. Работа­ет так, как нам и нуж­но, — путем пар­синга EAT.


Пом­нишь, мы отклю­чили CRT? Поэто­му исполь­зование фун­кции strcmp() из это­го кода невоз­можно. К счастью, срав­нение двух строк — базовый алго­ритм, который пишут еще на пас­кале в седь­мом клас­се. На C++ я вынес его в отдель­ную фун­кцию custom_strcmp().


int custom_strcmp(const char* str1, const char* str2) {
while (*str1 || *str2) {
if (*str1 < *str2) {
return -1;
}
else if (*str1 > *str2) {
return 1;
}
str1++;
str2++;
}
return 0;
}

Ра­зоб­равшись, как и что делать, получа­ем сле­дующий код.


#include <Windows.h>
#include <winternl.h>
typedef int (WINAPI* MessageBoxWFunc)(
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType
);
int custom_strcmp(const char* str1, const char* str2) {
while (*str1 || *str2) {
if (*str1 < *str2) {
return -1;
}
else if (*str1 > *str2) {
return 1;
}
str1++;
str2++;
}
return 0;
}
FARPROC myGetProcAddress(HMODULE hModule, LPCSTR lpProcName) {
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((BYTE*)hModule + dosHeader->e_lfanew);
PIMAGE_EXPORT_DIRECTORY exportDirectory = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)hModule +
ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD* addressOfFunctions = (DWORD*)((BYTE*)hModule + exportDirectory->AddressOfFunctions);
WORD* addressOfNameOrdinals = (WORD*)((BYTE*)hModule + exportDirectory->AddressOfNameOrdinals);
DWORD* addressOfNames = (DWORD*)((BYTE*)hModule + exportDirectory->AddressOfNames);
for (DWORD i = 0; i < exportDirectory->NumberOfNames; ++i) {
if (custom_strcmp(lpProcName, (const char*)hModule + addressOfNames[i]) == 0) {
return (FARPROC)((BYTE*)hModule + addressOfFunctions[addressOfNameOrdinals[i]]);
}
}
return NULL;
}
int main() {
HMODULE user32Module = LoadLibrary(L"user32.dll");
MessageBoxWFunc MessageBoxWPtr = (MessageBoxWFunc)(myGetProcAddress(user32Module, "MessageBoxW"));
MessageBoxWPtr(NULL, L"HI", L"HI", MB_OK);
return 0;
}

Ком­пилиру­ем, запус­каем. Видим, что остался лишь один импорт.


Лишь один импорт

Чем же заменить LoadLibrary()? Если мы гля­нем на пос­ледова­тель­ность вызовов фун­кций, то уви­дим, что LoadLibrary() вызыва­ет LdrLoadDll(), она — LdrpLoadDll(), а та — еще одну фун­кцию... Про­цесс, ска­жу чес­тно, дос­таточ­но слож­ный. Вот кар­тинка, которая хорошо опи­сыва­ет пос­ледова­тель­ность вызовов при заг­рузке DLL.


Пос­ледова­тель­ность вызовов при заг­рузке DLL

Parsing PE File Headers with C (ired.team) PE (Portable Executable): На стран­ных берегах («Хаб­рахабр») PE-фор­мат. Часть 1 — Базовая информа­ция (kaimi.io) Те­перь ныр­нем в пучины интерне­та и поищем кас­томную реали­зацию GetProcAddress(). Я выб­рал самый акку­рат­ный и милый вари­ант. FARPROC myGetProcAddress ( HMODULE hModule , LPCSTR lpProcName ) _

Теги: CSS

Просмотров: 204
Комментариев: 0:   7-09-2023, 00:02
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

 
Еще новости по теме:



Другие новости по теме: