, NA/CF#include <Windows.h>
DWORD WINAPI InfinityLoop ( LPVOID )
{
while( true )
{
}
return false;
}
DWORD WINAPI DllMain ( HMODULE hDll, DWORD dwReason, LPVOID ipvReason )
{
switch( dwReason )
{
case 1:
DisableThreadLibraryCalls( hDll );
CreateThread( 0, 0, InfinityLoop, 0, 0, 0 );
break;
}
return 1;
}
BOOL WINAPI DllMain ( HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpReserved )
{
switch(dwReason) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Thread, hinstDLL, NULL, NULL);
break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
}
return TRUE;
}

![=]](/forum/images/emotions/=].gif)

typedef UINT(__stdcall *threadFunc_t)(void*);
HANDLE createStealthThread(threadFunc_t pThreadFunc, void *pArgument)
{
BYTE *pK32 = (BYTE*)GetModuleHandleA("kernel32");
BYTE *pPopRet = nullptr;
DWORD oldProt;
auto rva2va = [&](DWORD dwVA)
{
return (void*)((uintptr_t)pK32 + dwVA);
};
// Find propper location to place our shellcode
void *pWriteTarget = nullptr;
auto pMz = (IMAGE_DOS_HEADER* )pK32;
auto pNt = (IMAGE_NT_HEADERS32* )rva2va(pMz->e_lfanew);
auto pCurSection = (IMAGE_SECTION_HEADER*)((uintptr_t)pNt
+ sizeof(IMAGE_NT_HEADERS32));
for (int i = 0; i < pNt->FileHeader.NumberOfSections; ++i)
{
if (memcmp(".text", pCurSection->Name, 5) == 0)
{
pWriteTarget = (void*)((uintptr_t)rva2va(pCurSection->VirtualAddress)
+ pCurSection->Misc.VirtualSize - 6);
break;
}
++pCurSection;
}
if (!pWriteTarget)
return NULL;
// Prepare and write shellcode to K32
uint8_t shellcode[] = "\x68\x00\x00\x00\x00\xC2";
*(threadFunc_t*)(shellcode + 1) = pThreadFunc;
VirtualProtect(pWriteTarget, 6, PAGE_EXECUTE_READWRITE, &oldProt);
memcpy(pWriteTarget, shellcode, 6);
VirtualProtect(pWriteTarget, 6, oldProt, &oldProt);
// Create thread
return CreateThread(nullptr,
0,
(LPTHREAD_START_ROUTINE)pWriteTarget,
pArgument,
NULL,
nullptr);
} // ==> createStealthThread