[C++]Problem bei anzeigen von Calls

08/22/2011 15:57 Lazeboy#1
Hey,
ich versuche gerade alle calls eines programmes aufzulisten. Ich lese halt die komplette ".text" section ein und überprüfe dann byte für byte ob es ein 0xE8 ist, aber da ist auch mein Problem. Es werden mir halt alle Calls ausgegeben(vermute ich), aber auch die Adressen wo es keine Calls gibt sonder einfach nur 0xE8 steht. Kann ich irgendwie überprüfen ob das nun wirklich ein Call ist, weil die selben Probleme werden ja auch bei anderen Befehlen auftreten wenn ich z.b alle mov auslesen möchte.

Code:
ofile.open("C:/BLAA.txt");
	GetPeInfo(myProcessInfos.szExeName,&myPeInfo);
	unsigned char *lpCode = (unsigned char*)malloc(myPeInfo.dwImageSize);
	ReadProcessMemory(hProcess,(LPVOID)(myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode),lpCode,myPeInfo.dwEndOfCode,0);
	for(int i = 0; i <myPeInfo.dwEndOfCode;i++)
	{
		if(lpCode[i] == 0xE8)
		{
			DWORD dwCallAdress;
			ReadProcessMemory(hProcess,(LPVOID)(myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode + i + 1),&dwCallAdress,4,0);
			ofile << "Position: " << hex << myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode + i << "    " << "Call zu: " <<myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode+i+5+dwCallAdress << endl;
		}

	}
08/22/2011 18:07 MrSm!th#2
Ist klar, wenn du jedes Byte auf E8 überprüfst, wird auch jedes E8 Byte ausgegeben.

Brauchst eine Disassembling Library dafür, damit du die einzelnen Opcodes voneinander trennen und dann auf Calls überprüfen kannst.

E8 ist btw nicht der einzige Call.

Und welchen Sinn hat das bitte? Oo
08/22/2011 18:37 yihaaa#3
Ich hoffe du weißt das E8 auch ein teil einer Adresse etc sein kann.
Wie Smith schon sagt du brauchst die Library.
08/22/2011 19:47 Lazeboy#4
1. ja ist mir schon kla die Frage ging eher in die Richtung wie ich das unterscheiden kann und mit 0xFF kann auch noch gecallt werden...
2. im endeffekt möchte ich den nen pointer scaner bauen wie cheat engine es macht und um ein bisschen an dese art des scanen mich ran zu tasten dachte ich ich versuche mal was einfaches. Wenn ihr mir tipps für den pointer scaner geben könnt wäre das cool xD ich werde mich mal nach einer diassembling libary umsehen. Danke schonmal
Könnt ihr mir ne Libary empfehlen `?
08/22/2011 20:37 Bot_interesierter#5
distorm
08/22/2011 20:59 Akorn#6
Hier haste z.b. eine Disassembler library [Only registered and activated users can see links. Click Here To Register...] .
08/22/2011 21:10 MrSm!th#7
Der Pointer Scanner muss aber keine Calls disassemblen o.ô

Wie gesagt, du brauchst eine Library zum Disassemblieren, wenn du Calls von gewöhnlich E8 Bytes unterscheiden willst.

Zb. BeeEngine (oder war es Bea? :O) oder die Library von OllyDbg, die steht auch open-source zur Verfügung.
Dann gehst du eben jeden Opcode durch; aber eben nur jeden Opcode, nicht jedes Byte.
08/22/2011 22:40 Lazeboy#8
vielen dank schonmal nen schöner anhaltspunkt ;)

EDIT:
Ich kann das machen wie ich will ob ich ich das aus dem file lese oder den memory einlese es kackt immer an der gleiche stelle ab, weil ein paar bytes vorher fehler gemacht werden und dann das ganze UNKOWN_OPCODES ergibt.....

Code:
int _tmain(int argc, _TCHAR* argv[])
{
	MYPROCESSINFORMATION myProcessInfos;
	MYPEINFOS myPeInfo;
	HANDLE hProcess = GetProcHandle("cheatengine-i386.exe",&myProcessInfos);
	GetPeInfo(myProcessInfos.szExeName,&myPeInfo);
	unsigned char *lpCode = (unsigned char*)malloc(myPeInfo.dwEndOfCode);
	ReadProcessMemory(hProcess,(LPVOID)(myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode),lpCode,myPeInfo.dwEndOfCode,0);	

	DISASM MyDisasm;
	int iLen = 0;
	memset(&MyDisasm,0,sizeof(DISASM));

	MyDisasm.EIP = (int)lpCode;
	MyDisasm.VirtualAddr = myPeInfo.dwImageBase + myPeInfo.dwBaseOfCode;
	MyDisasm.Archi = 0;

	int Error = 0;
	DWORD dwEndOfCode = (DWORD)(lpCode + myPeInfo.dwEndOfCode);
	cout << hex << dwEndOfCode << endl;
	cin.get();


	while(!Error)
	{

		MyDisasm.SecurityBlock = dwEndOfCode - MyDisasm.EIP;
		iLen = Disasm(&MyDisasm);
		if(iLen == OUT_OF_BLOCK || iLen == UNKNOWN_OPCODE)
		{
			(void) printf("Fehler! \n");
			Error = 1;
		}
		else
		{

				cout  << hex <<  MyDisasm.VirtualAddr << "      " << MyDisasm.CompleteInstr << endl;
				MyDisasm.EIP += iLen;
				MyDisasm.VirtualAddr+= iLen;
		
				if (MyDisasm.EIP >= (int)dwEndOfCode) 
				{
					(void) printf("End of buffer reached ! \n");
					Error = 1;
				}
			
		}

	}
	cin.get();
	return 0;
}