• Trainer
  • Forums
  • Suche
  • Members
  • Kalender
  • Hilfe
  • Extras
Forum stats
Show team
Neue Beiträge ansehen
Heutige Beiträge ansehen
Home of Gamehacking - Archiv
Login to account Create an account
Login
Benutzername:
Passwort: Passwort vergessen?
 



  Home of Gamehacking - Archiv Coding C, C#, C++, Visual C++
1 2 Weiter »
C++ Code Injection(ohne DLL)

Seiten (2): « Zurück 1 2
Ansichts-Optionen
C++ Code Injection(ohne DLL)
Acubra Offline
Trainermaker
****
Beiträge: 904
Themen: 127
Registriert seit: Oct 2010
Bewertung: 6
#11
13.07.2012, 17:49 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2012, 18:00 von iNvIcTUs oRCuS.)
Hey,
also der ASM Code bewirkt folgendes:




[code=ASM]
.code
start:
invoke GetModuleHandle,0 ;Module Handle bekommen
mov [lpModule], eax ;in variable lpModule verschieben

;in dem folgenden Code wird die Größe des Moduls ausgelesen
mov edi,eax
add edi,[ edi+3Ch]
add edi,4
add edi,14h
mov eax,[edi+38h]
mov [dwSize],eax ;und in dwSize verschoben

invoke FindWindow,CTEXT ('IEFrame'),0 ;find iexplorer.exe window class
invoke GetWindowThreadProcessId, eax, addr ThePID ;get the PID Smiling
invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE, ThePID ;open the process
mov [lpProcess],eax ;process handle in lpProcess verschieben
invoke VirtualFreeEx, [lpProcess], [lpModule], 0, MEM_RELEASE
invoke VirtualAllocEx, [lpProcess], [lpModule], dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE ;hier wird Speicher alloziiert und die adresse, wo der speicher alloziiert wurde in eax gespeichert
;mit dem folgenden WPM Befehl wird in den iexplore.exe an die Stelle, wo speicher alloziiert wurde
invoke WriteProcessMemory, [lpProcess], eax, [lpModule], [dwSize], addr nBytesWritten
;das modul handle geschrieben
;und im nachfolgenden dann der Thread injected_thread erstellt
invoke CreateRemoteThread, [lpProcess], 0, 0, offset injected_thread, [lpModule], 0, ebx
invoke ExitProcess,0

;der code der injected_thread routine sollte selbsterklärend sein
injected_thread proc
invoke LoadLibrary,CTEXT ('user32.dll')
invoke MessageBox,0,CTEXT ('Success!!!'),CTEXT ('Hello From iexplorer'),0
invoke ExitThread,0
ret
injected_thread endp
[/code]
Sorry, aber hab grad keine Zeit mehr um ausführlicher auf dein Problem einzugehen.

//EDiT: Hab grad noch nen sehr interessanten Artikel gefunden: http://www.codeguru.com/cpp/w-p/system/p...rocess.htm
Vor allem der dritte Unterpunkt (III. The CreateRemoteThread & WriteProcessMemory Technique) sollte dich interessieren.
"Auf dieser Welt gibt es mehr Scheisse als auf Festivalklos"
[Bild: hoglogo_smalpxga.jpg]
Homepage Suchen
Antworten
Colix Offline
Junior Member
**
Beiträge: 6
Themen: 1
Registriert seit: Jul 2012
Bewertung: 0
#12
17.07.2012, 23:35 (Dieser Beitrag wurde zuletzt bearbeitet: 18.07.2012, 23:22 von Colix.)
nach einigen tagen meld ich mich jetzt auch mal wieder! Happy

Erstmal danke für die Erklärung und den weiteren Link, hat mir eigentlich gut geholfen, sodass ich folgendes zusammengeschrieben hab.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
struct SGame
{
	HWND hWnd;
	HANDLE hProcess;	
	LPVOID pAllocMemory;
	DWORD dwProcessID;
};
SGame Game;

LPCTSTR lpCaption = "Message";
LPCTSTR lpText = "Hello";

void InjectThread()
{
	FARPROC Message = GetProcAddress(GetModuleHandle( TEXT("user32.dll")), "MessageBox");
	_asm
	{
		push 0
		push lpCaption
		push lpText
		push 0
		call dword ptr [Message]
	}
}
static void after_InjectThread()
{

}
int main()
{
	if(!(Game.hWnd = FindWindow(NULL, "iTunes")))
		printf("[-] FindWindow failed! Error: %d\n", GetLastError());
	else 
		printf("[+] FindWindow succesfully\n");

	GetWindowThreadProcessId(Game.hWnd,&Game.dwProcessID);
	if(!(Game.hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Game.dwProcessID)))
		printf("[-] OpenProcess failed! Error: %d\n", GetLastError());
	else 
        printf("[+] OpenProcess succesfully\n");

	DWORD sizeOfFunc = (PBYTE)&after_InjectThread - (PBYTE)&InjectThread;
	printf("[+] Size of Function: %d\n", sizeOfFunc);
	
	if(!(Game.pAllocMemory = VirtualAllocEx(Game.hProcess, 0, sizeOfFunc, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)))
		printf("[-] VirtualAllocEx failed! Error: %d\n", GetLastError());
	else 
	{
		printf("[+] VirtualAllocEx succesfully\n!");
		if(!WriteProcessMemory(Game.hProcess, Game.pAllocMemory, &InjectThread,  sizeOfFunc, 0))
			printf("[-] WriteProcessMemory failed! Error: %d\n", GetLastError());
		else
		{
			printf("[+] WriteProcessMemory succesfully\n");
			if(!CreateRemoteThread(Game.hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)Game.pAllocMemory, NULL, NULL, NULL))
				printf("[-] CreateRemoteThread failed! Error: %d\n", GetLastError());
			else printf("[+] CreateRemoteThread succesfully\n");
		}
	}
	CloseHandle(Game.hProcess);

	while(true)
	{

		Sleep(100);
	}
	return 0;
}


Schön und gut, dacht ich zumindest, doch der Prozess, egal ob iTunes oder irgendein Game, crasht einfach. In meiner Konsole wird kein Fehler ausgegeben, die Funktionen werden alle ordnungsgemäß ausgeführt, laut meinen logs.
Könnte jemand von euch drüber schauen und es vielleicht selber mal ausprobieren? Hab ich was komplett falsch verstanden oder fehlt irgendwas? :P

Danke für jede Hilfe! Smiling

Gruß
Colix

Suchen
Antworten
Acubra Offline
Trainermaker
****
Beiträge: 904
Themen: 127
Registriert seit: Oct 2010
Bewertung: 6
#13
19.07.2012, 14:42 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2012, 14:43 von Acubra.)
Hey,
ich hab deinen Code mal bei mir ausgeführt und im Debugger geguckt was passiert.
Also, nach dem WriteProcessMemory Call, findest du folgendes im "Mutter" Prozess:
   
Wie du siehst, eine Reihe von Jumps. Jedoch führt nur der erste zu einer validen Adresse (dieser wird auch nur "gecalled", weil -->). Der erste Jump springt zu folgendem Code:
   

Das Programm crasht dann bei folgendem Befehl:
CALL DWORD PTR DS:[258208]

Da ich nicht wirklich Ahnung von der Theorie hinter dem Ganzen hab und auch sonst nicht weiss wie es aussehen soll, bin ich ab hier mit meinem Latein am Ende. Sorry.
"Auf dieser Welt gibt es mehr Scheisse als auf Festivalklos"
[Bild: hoglogo_smalpxga.jpg]
Homepage Suchen
Antworten
sungwoo Offline
Junior Member
**
Beiträge: 6
Themen: 2
Registriert seit: Oct 2012
Bewertung: 0
#14
14.10.2012, 19:37 (Dieser Beitrag wurde zuletzt bearbeitet: 14.10.2012, 19:37 von sungwoo.)
Hallo, ich weiss zwar nicht ob das hier noch Interesse an dem Thema besteht aber ich schreib mal was dazu:

1. Mit VirtualAllocEx Speicher im Zielprozess reservieren.
VirtualAllocEx(handle, NULL, SizeOfBytesToReserve, MEM_COMMIT , PAGE_EXECUTE_READWRITE );


2. Mit ReadProcessMemory die Daten sichern welche überschrieben werden.
3. Mit WriteProcessMemory folgendes schreiben:
JMP AdresseVoMReserviertenSpeicherBereich

Hier schreibst du zuerst den Opcode 0xe9
Die Adresse wo hingesprungen werden soll wird wohl kleiner sein als

die Adresse VON der du springst, also rechnest du folgendes:
ZielAdressOpcodes = ZielSprungAdresse - StartSprungAdresse - 5

Ach ich geb mal ein genaueres Beispiel^^:

PHP-Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0040ff90 mov eax,1234

Kurzer Peseudcode(naja eigentlich ist der gar nicht so Pseudo^^):
unsigend LongJmpOpcode = 0xe9;
unsigned JumpFromThisAddr = 0040ff90;

WriteProcessMemory(handle, (void*)JumpFromThisAddr, &LongJmpOpcode, 1, 0 );
        
unsigned TargerAddrOpcodes = BerechneSprungAdresse(  AdressOfReserveMemoryArea, JumpFromThisAddr);

JumpFromThisAddr++;  // Du willst ja nicht deinen JMP Long Opcode überschreiben

WriteProcessMemory(handle, (void*)JumpFromThisAddr, &LongJmpOpcode, OpcodeLength, 0 );  // OpcodeLength = 4

Hier noch:

JumpFromThisAddr+=4;
unsigned nop = 0x90;  // NOP operation
WriteProcessMemory(handle,(void*)CallFromThisAddr, &nop, 1, 0 );

Damit dein JMP die richtige Opcode Länge bekommt.

Ich hoffe man kann meine Erklärung verstehen.


So würde dann BerechneSprungAdresse intern aussehen:

PHP-Code:
unsigned BerechneSprungAdresse( unsigned AdressOfReserveMemoryArea, unsigned JumpFromThisAddr)
{
return ZielAdressOpcodes = (AdressOfReserveMemoryArea - JumpFromThisAddr)  - 5;
}

Suchen
Antworten
Share Thread:            
Seiten (2): « Zurück 1 2


  • Druckversion anzeigen
  • Thema abonnieren


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste

  • Kontakt
  • Forum team
  • Forum stats
  • Nach oben
 
  • RSS-Synchronisation
  • Lite mode
  • Home of Gamehacking - Archiv
  • Help
 
Forum software by © MyBB - Theme © iAndrew 2014



Linearer Modus
Baumstrukturmodus