Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Unlinking and relinking loaded DLLs from/to PEB

maurow
Messaggi: 6,041
Discussioni: 2,066
Registrato: 03-2011
Reputazione:
133

Mix: 8,107
poi mi spiegate che cosa è Happywide

#include <windows.h>
#include <vector>
#include <algorithm>

typedef struct _PEB_LDR_DATA {
UINT8 _PADDING_[12];
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _PEB {
UINT8 _PADDING_[12];
PEB_LDR_DATA* Ldr;
} PEB, *PPEB;

typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
VOID* DllBase;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

typedef struct _UNLINKED_MODULE
{
HMODULE hModule;
PLIST_ENTRY RealInLoadOrderLinks;
PLIST_ENTRY RealInMemoryOrderLinks;
PLIST_ENTRY RealInInitializationOrderLinks;
PLDR_DATA_TABLE_ENTRY Entry;
} UNLINKED_MODULE;

#define UNLINK(x) \
(x).Flink->Blink = (x).Blink; \
(x).Blink->Flink = (x).Flink;

#define RELINK(x, real) \
(x).Flink->Blink = (real); \
(x).Blink->Flink = (real);

std::vector<UNLINKED_MODULE> UnlinkedModules;

struct FindModuleHandle
{
HMODULE m_hModule;
FindModuleHandle(HMODULE hModule) : m_hModule(hModule)
{
}
bool operator() (UNLINKED_MODULE const &Module) const
{
return (Module.hModule == m_hModule);
}
};

void RelinkModuleToPEB(HMODULE hModule)
{
std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule));

if (it == UnlinkedModules.end())
{
//DBGOUT(TEXT("Module Not Unlinked Yet!"));
return;
}

RELINK((*it).Entry->InLoadOrderLinks, (*it).RealInLoadOrderLinks);
RELINK((*it).Entry->InInitializationOrderLinks, (*it).RealInInitializationOrderLinks);
RELINK((*it).Entry->InMemoryOrderLinks, (*it).RealInMemoryOrderLinks);
UnlinkedModules.erase(it);
}

void UnlinkModuleFromPEB(HMODULE hModule)
{
std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule));
if (it != UnlinkedModules.end())
{
//DBGOUT(TEXT("Module Already Unlinked!"));
return;
}

#ifdef _WIN64
PPEB pPEB = (PPEB)__readgsqword(0x60);
#else
PPEB pPEB = (PPEB)__readfsdword(0x30);
#endif

PLIST_ENTRY CurrentEntry = pPEB->Ldr->InLoadOrderModuleList.Flink;
PLDR_DATA_TABLE_ENTRY Current = NULL;

while (CurrentEntry != &pPEB->Ldr->InLoadOrderModuleList && CurrentEntry != NULL)
{
Current = CONTAINING_RECORD(CurrentEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if (Current->DllBase == hModule)
{
UNLINKED_MODULE CurrentModule = {0};
CurrentModule.hModule = hModule;
CurrentModule.RealInLoadOrderLinks = Current->InLoadOrderLinks.Blink->Flink;
CurrentModule.RealInInitializationOrderLinks = Current->InInitializationOrderLinks.Blink->Flink;
CurrentModule.RealInMemoryOrderLinks = Current->InMemoryOrderLinks.Blink->Flink;
CurrentModule.Entry = Current;
UnlinkedModules.push_back(CurrentModule);

UNLINK(Current->InLoadOrderLinks);
UNLINK(Current->InInitializationOrderLinks);
UNLINK(Current->InMemoryOrderLinks);

break;
}

CurrentEntry = CurrentEntry->Flink;
}
}Example of usage:

Code:
HINSTANCE g_hinstDLL = NULL;

DWORD WINAPI Init(LPVOID)
{
for(;Wink {
Sleep(200);

//Hecks here

if (GetAsyncKeyState(VK_F5) & 1) {
RelinkModuleToPEB(g_hinstDLL);
FreeLibraryAndExitThread(g_hinstDLL, ERROR_SUCCESS);
}
}
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID)
{
if (fdwReason == DLL_PROCESS_ATTACH) {
g_hinstDLL = hinstDLL;
UnlinkModuleFromPEB(hinstDLL);
CreateThread(NULL, 0, Init, NULL, 0, NULL);
}

return 1;



La libertà non si insegna, è una scelta individuale.
25/11/2012, 23:24
#1
Cerca

йσѕσиє1 νι ѕσνяαѕтα
Messaggi: 1,081
Discussioni: 107
Registrato: 03-2011
Reputazione:
19

Mix: 0
dovrebbe essere la base di un hack forze xD

28/11/2012, 20:17
#2
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
è semplicemente una dll che si auto-toglie dalla lista dei moduli caricati nel processo in cui viene iniettata (warrock ad esempio).
La teoria vuole che in questo modo hackshield non detecti la hack.
Peccato che ho sempre trovato sta cosa alquanto inutile, di solito il motivo per cui si viene detectati non è che riconosce la dll in memoria, ma che usi delle funzioni che sono detectate, come le modifiche asm ad esempio, oppure il detour del DIP.
Di fatto non ricordo di aver mai visto una mia hack detectata con le funzioni disattivate, anche senza questo codice.


digger
28/11/2012, 21:50
#3
Cerca

maurow
Messaggi: 6,041
Discussioni: 2,066
Registrato: 03-2011
Reputazione:
133

Mix: 8,107
grazie dig , insomma le solite cose inutili.


La libertà non si insegna, è una scelta individuale.
28/11/2012, 22:15
#4
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 28/11/2012, 22:17 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
beh può sempre servire per altro però, in fondo la teoria è buona, magari in altri ambiti funziona bene


digger
28/11/2012, 22:16
#5
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
è una cavolata per warrock perchè hackshield non guarda la memoria ma come giochi (se improvvisamente hai un ai-aw gold e delle armi che non ci sono più nel gioco) Asd

28/11/2012, 22:37
#6
Cerca




Utenti che stanno guardando questa discussione: 1 Ospite(i)