ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Пишем свой инжектор с выгрузкой [LoadLibraryA] (https://forum.antichat.xyz/showthread.php?t=1334101)

CleanLegend 09.05.2019 01:27

Привет, сегодня напишем простой инжектор с выгрузкой, с использованием функций LoadLibraryA и FreeLibrary

Алгоритм инжекта:

- получаем хэндл процесса в который будем инжектить

- получаем путь до нашей dll

- выделяем память для нашего пути

- записываем его

- получаем адрес LoadLibraryA и вызываем его через CreateRemoteThread​
- ожидаем завершения выполнения DllMain DLL_PROCESS_ATTACH

получаем id процесса:

C++:





Код:

DWORD
GetProcId
(
const
char
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
strcmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}



C++:





Код:

// получаем хэндл процесса
HANDLE hProcess
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
GetProcId
(
"gta_sa.exe"
)
)
;
// Указываем путь до нашей dll
const
char
*
DllPath
=
"C:\\test.dll"
;
// получаем размер строки нашего пути
size_t SizePatch
=
strlen
(
DllPath
)
+
1
;
// выделяем память в gta_sa с размером нашей строки
LPVOID pDllPath
=
VirtualAllocEx
(
hProcess
,
NULL
,
SizePatch
,
MEM_COMMIT
,
PAGE_READWRITE
)
;
// записываем наш путь в выделенную память
WriteProcessMemory
(
hProcess
,
pDllPath
,
(
LPVOID
)
DllPath
,
SizePatch
,
NULL
)
;
HMODULE kernel
=
GetModuleHandleA
(
"Kernel32.dll"
)
;
// Получаем адрес kernel32
DWORD Adr
=
(
DWORD
)
GetProcAddress
(
kernel
,
"LoadLibraryA"
)
;
// получаем адрес функции LoadLibraryA
// Вызываем LoadLibraryA в gta_sa.exe с аргументом "C:\\test.dll" и возвращаем адрес нашего потока
HANDLE hThread
=
CreateRemoteThread
(
hProcess
,
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
Adr
,
pDllPath
,
0
,
0
)
;
// Ожидаем завершение нашего потока(ждем завершения DllMain с аргументом DLL_PROCESS_ATTACH)
WaitForSingleObject
(
hThread
,
INFINITE
)
;
// Закрываем дескриптор потока
CloseHandle
(
hThread
)
;
// Освобождаем выделенную память
VirtualFreeEx
(
hProcess
,
pDllPath
,
SizePatch
,
MEM_RELEASE
)
;
// Закрываем дескриптор процесса
CloseHandle
(
hProcess
)
;



Алгоритм выгрузки:

- получаем хэндл процесса в который будем инжектить

- получаем адрес нашей загруженной библиотеки

- получаем адрес FreeLibrary и вызываем его через CreateRemoteThread

- ожидаем завершения выполнения DllMain DLL_PROCESS_DETACH

функция для получения адреса dll в другом процессе:

C++:





Код:

HMODULE
GetModuleHandleExtern
(
const
char
*
szModuleName
,
DWORD dwProcessId
)
{
if
(
!
szModuleName
||
!
dwProcessId
)
{
return
NULL
;
}
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
dwProcessId
)
;
if
(
hSnap
==
INVALID_HANDLE_VALUE
)
{
return
NULL
;
}
MODULEENTRY32 me
;
me
.
dwSize
=
sizeof
(
MODULEENTRY32
)
;
if
(
Module32First
(
hSnap
,
&
me
)
)
{
while
(
Module32Next
(
hSnap
,
&
me
)
)
{
if
(
!
strcmp
(
me
.
szModule
,
szModuleName
)
)
{
CloseHandle
(
hSnap
)
;
return
me
.
hModule
;
}
}
}
CloseHandle
(
hSnap
)
;
return
NULL
;
}



C++:





Код:

// получаем хэндл процесса
HANDLE hProcess
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
GetProcId
(
"gta_sa.exe"
)
)
;
// получаем адрес нашей загруженной библиотеки
HMODULE module
=
GetModuleHandleExtern
(
"test.dll"
,
GetProcId
(
"gta_sa.exe"
)
)
;
HMODULE kernel
=
GetModuleHandleA
(
"Kernel32.dll"
)
;
// Получаем адрес kernel32
DWORD Adr
=
(
DWORD
)
GetProcAddress
(
kernel
,
"FreeLibrary"
)
;
// получаем адрес функции FreeLibrary
// Вызываем FreeLibrary в gta_sa.exe с адресом нашей библиотеки и возвращаем адрес нашего потока
HANDLE hThread
=
CreateRemoteThread
(
hProcess
,
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
Adr
,
module
,
0
,
0
)
;
// Ожидаем завершение нашего потока(ждем завершения DllMain с аргументом DLL_PROCESS_DETACH)
WaitForSingleObject
(
hThread
,
INFINITE
)
;
// Закрываем дескриптор потока
CloseHandle
(
hThread
)
;
// Закрываем дескриптор процесса
CloseHandle
(
hProcess
)
;


RIPJake 09.05.2019 01:31

LLA метод хороший

Но почему то в нашем мире все используют MMAP

Cake_ 09.05.2019 02:11

сф прокатит?

silence 09.05.2019 12:34

Где ссылка на то что получилось?

#Rin 09.05.2019 13:26

Цитата:

Сообщение от cakebou

сф прокатит?

Да.

Azller Lollison 09.05.2019 13:28

Цитата:

Сообщение от Silence

Где ссылка на то что получилось?

Сам скомпиль

SiTrak 09.05.2019 14:45

А хуки снимать надо же?

DarkP1xel 09.05.2019 15:52

Цитата:

Сообщение от SiTrak

А хуки снимать надо же?

Где ты здесь хуки увидел?

SiTrak 09.05.2019 16:56

Цитата:

Сообщение от DarkP1xel

Где ты здесь хуки увидел?

Если я допустим хочу выгрузить свою dll мне надо снимать хуки при выгрузке ?

#Rin 09.05.2019 20:40

Цитата:

Сообщение от SiTrak

Если я допустим хочу выгрузить свою dll мне надо снимать хуки при выгрузке ?

Логично что да. Но все ли хуки ты сможешь снять?

Например хуки виртуальных таблиц DirectX/RakNet определенно у тебя будут конфликтовать.


Время: 21:37