Wie vercryptet man einen hack???

08/13/2010 16:47 Pencil123#1
Ich hab ein Problem mit selbstgeschriebenen Hacks!!
Sie sind sehr schnell detected!!
Ich habe gehört man könnte dies verhindern indem man den Hack vercryptet
oder als temidia hochläd!!
Doch was bedeutet das??
Ich bin ratlos und hoffe jemand von euch kann mir helfen!!
Mfg Pencil123(NikM)
08/13/2010 16:54 Madd Eye#2
Schau mal hier in die Tutorial Section
Für manche Programmiersprachen steht dort wie du deinen Code Undetected machen kannst
Ansosten Google hilft immer ;)
08/13/2010 16:55 Shadowofdragon#3
Du kompilierst einen eigenen Stub und cryptest die Files damit.
08/13/2010 17:52 P-a-i-n#4
Quote:
Originally Posted by Pencil123 View Post
Ich hab ein Problem mit selbstgeschriebenen Hacks!!
Sie sind sehr schnell detected!!
Ich habe gehört man könnte dies verhindern indem man den Hack vercryptet
oder als temidia hochläd!!
Doch was bedeutet das??
Ich bin ratlos und hoffe jemand von euch kann mir helfen!!
Mfg Pencil123(NikM)
mit vercrypten kannste nichts ud machen ist nur eine maßnahme gegen leaken

wie soll das auch möglichen sein wenn man aus einem String den man nutzt der z.B "Hallo" heißt ein "4323749234" macht ?
ein anticheattool wie PB,xtrap oder sonstiges vergleicht ja die abläufe im arbeitsspeicher
z.B punkbuster ernn man da eins bissel rumfummelt kann es passieren das die prüfsumme nicht stimmt dann gibts ein ban für MD5 veränderungen oder je nachdem dem die violations ausfällt
und was soll da eine vercryptung bewirken eigentlich garnichts
08/13/2010 23:16 Mr0x90#5
hier mal ein kleines programm von mir das ihr als Crypter bezeichnen würdet, die hauptfunktionen wurden weggelassen um c/p vorzubeugen, aber die struktur sollte erkennbar sein.
ACHTUNG umsetzung ist.. sehr schlecht und war ein PoC

Credits: eddy14
Code:
int _tmain(int argc, _TCHAR* argv[])
{
	CHAR szPath[MAX_PATH] = "";
	memset(szPath, 0x00, MAX_PATH);

	GetCurrentDirectoryA(MAX_PATH, szPath);
	strcat(szPath, "\\input.exe");

	LPBYTE pBuffer;

	printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");
	printf(":::::::::::::::PE Crypter by Killswitch 2010:::::::::::::::\n");
	printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n");

	char* szNig = "http://an0nym0.us\n";
		printf(szNig);


	//Benötigte Informationen aus dem PE-Header entnehmen

	DWORD dwSize = LoadFile(szPath, &pBuffer);
	printf("Size of source-file: %d\n", dwSize);

	DWORD dwEP = Find_EP(pBuffer);
	printf("Original Entrypoint: 0x%x\n", dwEP);

	WORD wCount = Find_NumberOfSections(pBuffer);
	printf("Count of sections: %d\n", wCount);

	DWORD dwIB = Find_ImageBase(pBuffer);
	printf("Imagebase: 0x%x\n");

	DWORD dwSizeOfImage = Find_SizeOfImage(pBuffer);
	printf("Size of Image: 0x%.08x\n", dwSizeOfImage);

	_IMAGE_SECTION_HEADER ISH = GetISH(pBuffer, wCount);
	//{
				printf("Virtual Size: 0x%.08x\n", ISH.Misc.VirtualSize);
				printf("RawOffset   : 0x%.08x\n", ISH.PointerToRawData);
				printf("Virtual Addr: 0x%.08x\n\n", ISH.VirtualAddress);

	DWORD dwCCSize	 =	ISH.SizeOfRawData - ISH.Misc.VirtualSize;

	printf("CodeCave space: 0x%.08x		[%s]\n", dwCCSize, (dwCCSize > 24) ? "OK":"ERROR");

	if (dwCCSize <= 24)
	{
		printf("CodeCave is too small. Aborting...\n");
		goto bad;
	}

	DWORD dwCodeCave = ISH.PointerToRawData + ISH.Misc.VirtualSize;

		printf("CodeCave Location  : 0x%.08x\n", dwCodeCave);

		BYTE DecryptionRoutine[] = { 0xb9, 0x90, 0x90, 0x90, 0x90, /*inc [ecx etc]*/0x36, 0xFE, 0x09, 0x36, 0xF6, 0x11, 0x36, 0x80, 0x31, /*xor byte*/0x88, 0x41, 0x81, 0xf9,
		0x90, 0x90, 0x90, 0x90, 0x75, 0xED, 0xE9, 0x90, 0x90, 0x90, 0x90 };

	DWORD dwRealEP = dwIB + dwEP;
	DWORD dwLastCom = dwIB + ISH.VirtualAddress + ISH.Misc.VirtualSize;

	*(DWORD*)&DecryptionRoutine[1] = dwIB + ISH.VirtualAddress;
	*(DWORD*)&DecryptionRoutine[18] = ISH.VirtualAddress + ISH.Misc.VirtualSize + dwIB;
	*(DWORD*)&DecryptionRoutine[25] = 0 - ((dwLastCom+24) - dwRealEP) + 1 - 3 + 1 - 4;


	if (Manipulate_Text_VirtualSize(pBuffer, wCount, ISH.Misc.VirtualSize + 24));
		printf("Successfully changed VirtualSize\n");

	if (Manipulate_Text_Characteristics(pBuffer, wCount))
		printf("Successfully set 'writable' characteristic\n");

	Manipulate_Checksum(pBuffer);
		printf("Successfully changed checksum\n");

	Manipulate_File_Characteristics(pBuffer);
		printf("Successfully set 'Relocation stripped' flag at _IMAGE_FILE_HEADER characteristics\n");

	memcpy(pBuffer + dwCodeCave, DecryptionRoutine, sizeof(DecryptionRoutine));

	Set_EP(pBuffer, ISH.VirtualAddress + ISH.Misc.VirtualSize);

	//cryption :P
		
	for (int i = 0; i < ISH.Misc.VirtualSize; i++)
	{
		pBuffer[ISH.PointerToRawData + i] = ~pBuffer[ISH.PointerToRawData + i];
		pBuffer[ISH.PointerToRawData + i] ^= 0x88;
		pBuffer[ISH.PointerToRawData + i] += 1;
	}
	
	memset(szPath, 0x00, MAX_PATH);
	GetCurrentDirectoryA(MAX_PATH, szPath);
	strcat(szPath, "\\output.exe");

	SaveFile(szPath, pBuffer, dwSize);

	
bad:
	system("pause");
	return 0;
}
08/14/2010 05:16 MrSm!th#6
Quote:
Originally Posted by P-a-i-n View Post
mit vercrypten kannste nichts ud machen ist nur eine maßnahme gegen leaken
Oh doch, es gibt Programme, die nach bestimmten Signaturen scannen.
Außerdem kann es auch so gemeint sein, dass sie zu schnell gefixed und blacklisted werden, was durch packen auch erschwert werden kann.
08/14/2010 11:11 Chaosduckman#7
EXE Crypter.
Schau mal nach Themida.
Ich weiß es nicht genau, aber wenn die EXE gecrypted ist, ist es der Prozess doch auch?!

Wenn du eine Injection machen willst, geht das mit dem Crypten nicht mehr.
08/14/2010 12:06 Mr0x90#8
Quote:
Originally Posted by Chaosduckman View Post
EXE Crypter.
Schau mal nach Themida.
Ich weiß es nicht genau, aber wenn die EXE gecrypted ist, ist es der Prozess doch auch?!

Wenn du eine Injection machen willst, geht das mit dem Crypten nicht mehr.
natürlich..
08/14/2010 14:29 mydoom#9
Quote:
Originally Posted by Chaosduckman View Post
Ich weiß es nicht genau, aber wenn die EXE gecrypted ist, ist es der Prozess doch auch?!
Nein. Denk doch mal nach:

Die CPU hat einen bestimmten Befehlssatz, der sich aus allen Maschinenbefehlen zusammensetzt, die sie "versteht". Das wäre beispielsweise

Code:
PUSH EAX (Oder als Opcode: 0x50)
Wenn man das Programm nun z.B. mit einem simplen XOR verschlüsselt (Als Key nehmen wir einfach mal 0xFF), würde aus dem 0x50 ein 0xAF werden. Daraus ergäbe sich die Instruktion

Code:
SCAS DWORD PTR ES:[EDI] (Scan string -> durchsucht einen String nach einer bestimmten Zeichenfolge)
Wenn man das Programm dann in dieser (verschlüsselten) Form ausführen würde, ergäbe diese Instruktion in dem Kontext überhaupt keinen Sinn bzw. würden die gewünschten Befehle nicht ausgeführt werden.

Daher muss der Code vor dem Ausführen auch in einer ausführbaren Form vorliegen - muss also entschlüsselt werden.


(EDIT// Ach und nochwas zum Threadstarter: "vercryptet" hört sich dermaßen grausam an... nimm lieber richtiges Deutsch oder(!) Englisch, also "verschlüsseln" oder "to encrypt")
08/15/2010 14:17 Chaosduckman#10
@Mr0x90 & mydoom:
Man ist nie allwissend. Aber danke, jetzt weis ich es xD
08/15/2010 15:41 Rikkami#11
WarRock Hacks z.B werden mit Themida crypted.
08/15/2010 17:23 Pencil123#12
Hört sich interessant an
Kann jemand erklären wie das funktioniert??
08/16/2010 17:42 Mr0x90#13
Quote:
Originally Posted by Pencil123 View Post
Hört sich interessant an
Kann jemand erklären wie das funktioniert??
das native hochsprachen windows programm wird nach seiner erstellung in assembler code umgewandelt ( mehr oder weniger ), diese assembler instructions haben einen bestimmten wert ( CALL - E8h, NOP 90h hehe :P etc. ). die meisten cryptions funktionieren so, dass die section, in der der code gespeichert ist von anfang bis ende byteweise bearbeitet wird ( z.b. jedes byte + 1), das programm ist in diesem zustand nicht mehr lauffähig ( so wird ein CALL 0xE8 + 1 zu einem JMP 0xE9 ). um zu erreichen, dass das programm wieder lauffähig ist müsste man also die umgekehrte rechenoperation vornehmen ( in diesem fall - 1 ). das ganze geht so, dass der EntryPoint, also da wo das programm beim start in den code einsteigt, auf eine neue, bis jetzt leere adresse gesetzt wird, in welche wiederum ein kleiner asm stub eingefügt wird, der dafür sorgt, dass die vorgenommenen modifikationen ( +1 ) wieder rückgängig gemacht werden ;)
ist der stub damit fertig, springt er wieder auf den nun entschlüsselten entrypoint und das programm nimmt seinen normalen lauf..