 |
|

09.05.2019, 01:27
|
|
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами:
6908018
Репутация:
213
|
|
Привет, сегодня напишем простой инжектор с выгрузкой, с использованием функций 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
)
;
|
|
|

09.05.2019, 01:31
|
|
Новичок
Регистрация: 03.08.2018
Сообщений: 22
С нами:
4094319
Репутация:
3
|
|
LLA метод хороший
Но почему то в нашем мире все используют MMAP
|
|
|

09.05.2019, 02:11
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
сф прокатит?
|
|
|

09.05.2019, 12:34
|
|
Новичок
Регистрация: 24.10.2006
Сообщений: 18
С нами:
10288463
Репутация:
0
|
|
Где ссылка на то что получилось?
|
|
|

09.05.2019, 13:26
|
|
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами:
5663255
Репутация:
183
|
|
Сообщение от cakebou
сф прокатит?
Да.
|
|
|

09.05.2019, 13:28
|
|
Познавший АНТИЧАТ
Регистрация: 20.07.2017
Сообщений: 1,292
С нами:
4639746
Репутация:
183
|
|
Сообщение от Silence
Где ссылка на то что получилось?
Сам скомпиль
|
|
|

09.05.2019, 14:45
|
|
Участник форума
Регистрация: 14.01.2018
Сообщений: 192
С нами:
4384333
Репутация:
113
|
|
А хуки снимать надо же?
|
|
|

09.05.2019, 15:52
|
|
Флудер
Регистрация: 17.06.2013
Сообщений: 3,635
С нами:
6791977
Репутация:
183
|
|
Сообщение от SiTrak
А хуки снимать надо же?
Где ты здесь хуки увидел?
|
|
|

09.05.2019, 16:56
|
|
Участник форума
Регистрация: 14.01.2018
Сообщений: 192
С нами:
4384333
Репутация:
113
|
|
Сообщение от DarkP1xel
Где ты здесь хуки увидел?
Если я допустим хочу выгрузить свою dll мне надо снимать хуки при выгрузке ?
|
|
|

09.05.2019, 20:40
|
|
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами:
5663255
Репутация:
183
|
|
Сообщение от SiTrak
Если я допустим хочу выгрузить свою dll мне надо снимать хуки при выгрузке ?
Логично что да. Но все ли хуки ты сможешь снять?
Например хуки виртуальных таблиц DirectX/RakNet определенно у тебя будут конфликтовать.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|