ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [C++] x86 - Выгрузка + самоудаление (https://forum.antichat.xyz/showthread.php?t=1337183)

ntharbinger 07.07.2019 07:49

Позволяет сначала выгрузить свой модуль а затем и удалить не прибегая к подгрузке других плагинов.

C++:





Код:

PVOID strq
=
nullptr
;
HMODULE hMDL
=
nullptr
;
DWORD __stdcall
SafeUnload
(
)
{
__asm
{
pusha
        pushad
        pushfd
        push hMDL
        call FreeLibrary
        lea eax
,
strq
        push eax
        call DeleteFileA
        popfd
        popad
        popa
}
return
0
;
}
DWORD __stdcall
UnloadEnd
(
)
{
return
0
;
}
// WARNING: Эта функция должна находится строго под SafeUnload иначе вам не правильно определит размер кода.
void
__stdcall
UnloadMeAndDelete
(
)
{
DWORD unload_size
=
(
(
DWORD
)
UnloadEnd
-
(
DWORD
)
SafeUnload
)
;
PVOID unloader
=
VirtualAlloc
(
0
,
unload_size
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
memcpy
(
unloader
,
SafeUnload
,
unload_size
)
;
byte call
=
0xE8
;
memcpy
(
(
void
*
)
(
(
DWORD
)
unloader
+
29
)
,
&
call
,
1
)
;
auto
FindDelta
=
[
]
(
DWORD DestinyAddress
,
DWORD SourceAddress
,
size_t InstructionLength
)
->
unsigned
int
{
return
DestinyAddress
-
(
SourceAddress
+
InstructionLength
)
;
}
;
DWORD addr
=
FindDelta
(
(
DWORD
)
&
DeleteFileA
,
(
(
DWORD
)
unloader
+
29
)
,
5
)
;
memcpy
(
(
void
*
)
(
(
DWORD
)
unloader
+
30
)
,
&
addr
,
4
)
;
byte nop
=
0x90
;
memcpy
(
(
void
*
)
(
(
DWORD
)
unloader
+
34
)
,
&
nop
,
1
)
;
PVOID dllPath
=
VirtualAlloc
(
0
,
256
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
DWORD pathAddr
=
(
DWORD
)
dllPath
;
memcpy
(
(
void
*
)
(
(
DWORD
)
unloader
+
24
)
,
&
pathAddr
,
4
)
;
CHAR FileName
[
MAX_PATH
+
1
]
;
GetModuleFileNameA
(
hMDL
,
FileName
,
MAX_PATH
+
1
)
;
memcpy
(
dllPath
,
FileName
,
strlen
(
FileName
)
)
;
typedef
DWORD
(
__stdcall
*
UnloadMe
)
(
)
;
UnloadMe UnloadIt
=
(
UnloadMe
)
unloader
;
CreateThread
(
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
UnloadIt
,
0
,
0
,
0
)
;
}
// В dllmain`e где у вас PROCESS_ATTACH вставляем
hMDL
=
hModule
;
// Пример использования
UnloadMeAndDelete
(
)
;



Автор: ntharbinger

SiTrak 07.07.2019 13:56

Не забывайте, что при выгрузке надо снимать хуки


Время: 02:30