Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 00:57

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Frage] Memory

Discussion on [Frage] Memory within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 23
Join Date: Dec 2010
Posts: 743
Received Thanks: 617
[Frage] Memory

Hey,

ich brauche da ein wenig hilfe bei der denkweise um etwas umzusetzen.

Undzwar habe ich ein Programm was ich gerne ein wenig absichern möchte.
Das große Problem besteht darin, das alle meine memory page nach belieben ändern können like CE oder ollydbg. Dies möchte ich nun verhindern indem ich das memory editing like ReadProzessMemory WriteProcessMemory blocken möchte. Schön ung gut, würde sagen aus dem Bauch heraus, ich assoziiere eine neue Memory Page, lasse sie so wie sie ist einfach im Speicher und rufe dauernt QueryWorkingSet auf, wenn sie dann bereits initialisiert wurde.. machts boom und mein Programm schließt sich oder what ever.

Das problem ist ich brauche da ein paar Tipps wie ich das ganze umsetzen könnte, vielleicht hat wer ein Link oder sonstige denkhilfen ect. Vielleicht auch eine bessere Methode.
.SnoX is offline  
Old 07/22/2014, 22:01   #2




 
bloodx's Avatar
 
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
mhm, den Memory bereich um den es geht auf Veränderungen Prüfen regelmäßig ?
bloodx is offline  
Old 07/23/2014, 10:36   #3


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
Wird auf user-ebene nicht klappen. Idealerweise schreibst du gleich ne eigene VM.
Man hat immer die Option der statischen Analyse oder das Erstellen eines suspendierten Prozesses.
buFFy! is offline  
Old 07/23/2014, 15:05   #4
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by .SnoX View Post
Hey,

ich brauche da ein wenig hilfe bei der denkweise um etwas umzusetzen.

Undzwar habe ich ein Programm was ich gerne ein wenig absichern möchte.
Das große Problem besteht darin, das alle meine memory page nach belieben ändern können like CE oder ollydbg. Dies möchte ich nun verhindern indem ich das memory editing like ReadProzessMemory WriteProcessMemory blocken möchte. Schön ung gut, würde sagen aus dem Bauch heraus, ich assoziiere eine neue Memory Page, lasse sie so wie sie ist einfach im Speicher und rufe dauernt QueryWorkingSet auf, wenn sie dann bereits initialisiert wurde.. machts boom und mein Programm schließt sich oder what ever.

Das problem ist ich brauche da ein paar Tipps wie ich das ganze umsetzen könnte, vielleicht hat wer ein Link oder sonstige denkhilfen ect. Vielleicht auch eine bessere Methode.
Hey, welche Infos brauchst du? Ich hatte das mit der QueryWorkingSet Methode vor ner Weile hier schon mal erwähnt, das könnte allerdings leicht in die Hose gehen, wenn irgend eine aggressive Antiviren-SW installiert ist, oder ein Treiber der aus irgend einem Grund über deinen Speicher geht.

Du könntest sonst noch mit den NT-APIs die Prozesshandles durchgehen und schauen ob ein anderer Prozess eine Handle auf deinen Prozess hat, falls ja nimmst du sie ihm weg. Das geht über DuplicateHandle mit DUPLICATE_CLOSE_SOURCE.

Dann kannst du wenn du das richtig umsetzt den Prozess nicht mehr lange genug aufhalten, da du dem Prozess andauernd die Handle wegnimmst.
Master674b is offline  
Thanks
1 User
Old 07/23/2014, 15:08   #5


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
Quote:
Originally Posted by Master674b View Post
Hey, welche Infos brauchst du? Ich hatte das mit der QueryWorkingSet Methode vor ner Weile hier schon mal erwähnt, das könnte allerdings leicht in die Hose gehen, wenn irgend eine aggressive Antiviren-SW installiert ist, oder ein Treiber der aus irgend einem Grund über deinen Speicher geht.

Du könntest sonst noch mit den NT-APIs die Prozesshandles durchgehen und schauen ob ein anderer Prozess eine Handle auf deinen Prozess hat, falls ja nimmst du sie ihm weg. Das geht über DuplicateHandle mit DUPLICATE_CLOSE_SOURCE.

Dann kannst du wenn du das richtig umsetzt den Prozess nicht mehr lange genug aufhalten, da du dem Prozess andauernd die Handle wegnimmst.
Und an dieser Stelle tritt dann wieder mein Post in Kraft.
Außerdem nimmt DuplicateHandle 'nen handle zum Prozess - genau die gleiche Technik kann der "angreifende" Prozess nutzen um dich daran zu hindern sein handle zu schließen

Bin mir auch nicht sicher, aber ich glaube DUPLICATE_CLOSE_SOURCE geht nicht wenn du dein eigenes, offenes handle zum Prozess mit HANDLE_FLAG_PROTECT_FROM_CLOSE flagst.
buFFy! is offline  
Thanks
2 Users
Old 07/23/2014, 15:28   #6
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by buFFy! View Post
Und an dieser Stelle tritt dann wieder mein Post in Kraft.
Außerdem nimmt DuplicateHandle 'nen handle zum Prozess - genau die gleiche Technik kann der "angreifende" Prozess nutzen um dich daran zu hindern sein handle zu schließen

Bin mir auch nicht sicher, aber ich glaube DUPLICATE_CLOSE_SOURCE geht nicht wenn du dein eigenes, offenes handle zum Prozess mit HANDLE_FLAG_PROTECT_FROM_CLOSE flagst.
Hey, selbstverständlich könnte er dich auch damit bekämpfen. Anti-Debugging Techniken bleiben immer ein Katz-und-Mausspiel.

Wenn dein Gegenüber weiß, was du machst kann er es sowieso im Handumdrehen umgehen. Der Trick ist einfach Dinge zu verwenden auf die man nicht so leicht kommt und die nicht so verbreitet sind.
Master674b is offline  
Thanks
1 User
Old 07/23/2014, 16:27   #7
 
elite*gold: 23
Join Date: Dec 2010
Posts: 743
Received Thanks: 617
Hey danke erstmal für die Informationen, dass das mit QueryWorkingSet auch schnell in die Hose gehen kann, wie das hier schon erwähnt wurde, ist mir auch bewusst. Dachte allerdings das wäre eine "gute" Methode um mein Problem zu verhindern.

Bin ja auch noch recht neu auf diesem Gebiet, weil ich auch noch nicht viel daran arbeiten musste, deswegen wollte ich euch mal Fragen was ihr empfehlen würdet.

Ich bin gerade noch gerade am googeln, und schaue mir die zwei Sachen an. Falls jemand da ein "schlichtes" Beispiel gerade hat, wäre das sehr hilfreich.

Ansonsten bin ich auch noch für alternativen gerne zu haben.
.SnoX is offline  
Old 07/23/2014, 23:15   #8
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
Quote:
Originally Posted by Master674b View Post
Hey, welche Infos brauchst du? Ich hatte das mit der QueryWorkingSet Methode vor ner Weile hier schon mal erwähnt, das könnte allerdings leicht in die Hose gehen, wenn irgend eine aggressive Antiviren-SW installiert ist, oder ein Treiber der aus irgend einem Grund über deinen Speicher geht.

Du könntest sonst noch mit den NT-APIs die Prozesshandles durchgehen und schauen ob ein anderer Prozess eine Handle auf deinen Prozess hat, falls ja nimmst du sie ihm weg. Das geht über DuplicateHandle mit DUPLICATE_CLOSE_SOURCE.

Dann kannst du wenn du das richtig umsetzt den Prozess nicht mehr lange genug aufhalten, da du dem Prozess andauernd die Handle wegnimmst.
Kannst auch falls du ein offenen Handle zu deinem Process findest ne Dll injecten, die Read/WriteProcessMemory blockt sobald als Parameter ein Handle zu deinem Process übergeben wird. Über den Handle kommste mit NtQueryInformationProcess an die Prozess-ID und darüber dann an Namen
Lazeboy is offline  
Thanks
1 User
Old 07/23/2014, 23:56   #9
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Erstmal solltest du dir Gedanken über Aufwand/Nutzen (ggf. auch Kosten/Nutzen) machen. Ist es nur ein 0815-Tool, dass hier auf epvp landet, kannst es sowieso direkt lassen. Wenn es was "größeres" wird, solltest du eher mit gutem Support glänzen und somit die Kunden holen.
Wer es geknackt haben möchte, knackt es - da lohnt es sich meist nicht, so viel Arbeit in einen Schutz zu stecken.
Das erstmal zum Cracken.

Wenn es dir darum geht, dein Spiel vor Hacks/Cheats zu sichern, bleibt dir eigentlich nur, alles wichtige auf einen Server auszulagern.
Schlüsselbein is offline  
Thanks
1 User
Old 07/24/2014, 03:23   #10
 
elite*gold: 596
The Black Market: 10/0/11
Join Date: Sep 2011
Posts: 923
Received Thanks: 2,344
Mit einem BaseThreadInitThunk hook ist so einiges möglich:

Sollte eine Dll mit CreateRemoteThread injected werden, kannst du das leicht checken.
Beispiel(im Hook):
Code:
if (pfnExecuteAddr == GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryA")   ||
    pfnExecuteAddr ==  GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryW"))
Sollte ein Debugger (Ollydbg) life attachen, könntest du auch einfach mal prüfen, ob die AusführungsAddresse DbgUiRemoteBreakin ist und einfach zu 0 jumpen (führt zum crash, aber da ollydbg den process debugged, wird es zu 0 gejumpt : Access Violation )

Beispiel(im Hook):
Code:
if (pfnExecuteAddr == GetProcAddress(GetModuleHandle("ntdll"), "DbgUiRemoteBreakin")){
		__asm mov eax, 0
		__asm jmp eax
}
Würde dir auch empfehlen die Handles zu closen.
Ansonsten könntest du den ganzen Speicher noch nach Modifikation checken.
Slicktor is offline  
Thanks
1 User
Old 07/24/2014, 09:13   #11


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
Quote:
Originally Posted by Master674b View Post
Wenn dein Gegenüber weiß, was du machst kann er es sowieso im Handumdrehen umgehen.
Stimmt, ziemlich cool ist es hier übrigens alle Referenzen zu intermodular calls aufzulösen.
Das geht indem man sich über die modulelist die kernel32.dll holt und in dieser nach GetProcAddress sucht. Damit kann man sich dann den Rest holen, idealerweise mit compile-time string encryption odar gar stringhashs/patterns.

Beispiel für die Encryption aus privatem Archiv:


Quote:
Originally Posted by Slicktor View Post
Sollte ein Debugger (Ollydbg) life attachen
Das kannst du auch viel leichter verhindern, einfach den PE Header deleten.
Das bringt so ziemlich jeden Debugger ohne built-in/plugged-in PE Fix zum crashen oder Error's schmeißen.

Generell lässt sich aber sagen, was Schlüsselbein bereits betont hat.
Es geht nicht darum, das Programm komplett zu sichern - geht auch garnicht.
Dein Ziel sollte maximal sein, die Software so zu sichern, dass sich das Cracken nicht mehr lohnt.

Wie bereits vorher von mir erwähnt finde ich persönlich das Virtualisieren des eigenen Codes am effizientesten (z.B. VMProtect).
Auch sehr nett kann self-attaching sein - richtig implementiert wahrscheinlich die beste Lösung für epvp Releases.

Hab auf CodeProject mal vor Ewigkeiten nen interessanten Thread gefunden, der könnte was für dich sein:
buFFy! is offline  
Thanks
1 User
Old 07/24/2014, 19:32   #12
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by buFFy! View Post
Stimmt, ziemlich cool ist es hier übrigens alle Referenzen zu intermodular calls aufzulösen.
Das geht indem man sich über die modulelist die kernel32.dll holt und in dieser nach GetProcAddress sucht. Damit kann man sich dann den Rest holen, idealerweise mit compile-time string encryption odar gar stringhashs/patterns.

Beispiel für die Encryption aus privatem Archiv:




Das kannst du auch viel leichter verhindern, einfach den PE Header deleten.
Das bringt so ziemlich jeden Debugger ohne built-in/plugged-in PE Fix zum crashen oder Error's schmeißen.

Generell lässt sich aber sagen, was Schlüsselbein bereits betont hat.
Es geht nicht darum, das Programm komplett zu sichern - geht auch garnicht.
Dein Ziel sollte maximal sein, die Software so zu sichern, dass sich das Cracken nicht mehr lohnt.

Wie bereits vorher von mir erwähnt finde ich persönlich das Virtualisieren des eigenen Codes am effizientesten (z.B. VMProtect).
Auch sehr nett kann self-attaching sein - richtig implementiert wahrscheinlich die beste Lösung für epvp Releases.

Hab auf CodeProject mal vor Ewigkeiten nen interessanten Thread gefunden, der könnte was für dich sein:
Noch besser: Ein eigenes GetProcAddress. Dort sollte man dann aber aufpassen. Windows PEs unterstützen Forwarded Exports, die muss man dann nochmals auflösen. Habe mir da Spaßeshalber mal GetModuleHandle und GetProcAddress nachgebaut, das ganze dann in ein Modul wie Warden gepackt (ohne CRT, extrem kompakt).

Sobald sich dann wer mit der Software Authentifiziert sende ich ihm das verschlüsselte Modul (hat nen custom PE header), der Client holt das über Manual Map rein und lädt das Modul und benutzt es, um die Authentifizierung abzuschließen.

Aber ich glaube ich verrate hier schon zu viel. Egal ist ja eh einfach ein Proof-of-Concept.
Master674b is offline  
Old 07/24/2014, 20:51   #13
 
elite*gold: 23
Join Date: Dec 2010
Posts: 743
Received Thanks: 617
Wew, haha. Denke habe da erstmal genug Stoff bekommen.
Schaue mir natürlich alles durch, um zu sehen was objektiv gesehen für mich am besten geeignet ist. Falls jemand jetzt wissen wollte für welchen Bereich das wäre, wäre das fürs Gamehacking, bzw das live bearbeiten am memory like ce ect.

Aber postet ruhig weiter wissen ist macht, und das ist immer jut, zudem auch immer gern gesehen.
.SnoX is offline  
Old 07/24/2014, 23:38   #14


 
buFFy!'s Avatar
 
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,287
Quote:
Originally Posted by Master674b View Post
Noch besser: Ein eigenes GetProcAddress. Dort sollte man dann aber aufpassen. Windows PEs unterstützen Forwarded Exports, die muss man dann nochmals auflösen. Habe mir da Spaßeshalber mal GetModuleHandle und GetProcAddress nachgebaut, das ganze dann in ein Modul wie Warden gepackt (ohne CRT, extrem kompakt).

Sobald sich dann wer mit der Software Authentifiziert sende ich ihm das verschlüsselte Modul (hat nen custom PE header), der Client holt das über Manual Map rein und lädt das Modul und benutzt es, um die Authentifizierung abzuschließen.

Aber ich glaube ich verrate hier schon zu viel. Egal ist ja eh einfach ein Proof-of-Concept.
Jop, stimmt - so habe ich das damals auch mal implementiert.
Wobei das ewig her ist, kann sein dass die func nicht von mir ist.
Habs auf jeden Fall vor Ewigkeiten mal gebastelt - dieses ganze intermodular prevention Zeugs.

Code:
FARPROC customWINAPI::GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
{
	UINT_PTR uiLibraryAddress = 0;
	FARPROC fpResult          = NULL;

	if( hModule == NULL )
		return NULL;

	uiLibraryAddress = (UINT_PTR)hModule;

	__try
	{
		UINT_PTR uiAddressArray = 0;
		UINT_PTR uiNameArray    = 0;
		UINT_PTR uiNameOrdinals = 0;
		PIMAGE_NT_HEADERS pNtHeaders             = NULL;
		PIMAGE_DATA_DIRECTORY pDataDirectory     = NULL;
		PIMAGE_EXPORT_DIRECTORY pExportDirectory = NULL;

		pNtHeaders = (PIMAGE_NT_HEADERS)(uiLibraryAddress + ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew);

		pDataDirectory = (PIMAGE_DATA_DIRECTORY)&pNtHeaders->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT ];

		pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)( uiLibraryAddress + pDataDirectory->VirtualAddress );

		uiAddressArray = ( uiLibraryAddress + pExportDirectory->AddressOfFunctions );
		uiNameArray = ( uiLibraryAddress + pExportDirectory->AddressOfNames );
		uiNameOrdinals = ( uiLibraryAddress + pExportDirectory->AddressOfNameOrdinals );

		if( ((DWORD)lpProcName & 0xFFFF0000 ) == 0x00000000 )
		{
			uiAddressArray += ( ( IMAGE_ORDINAL( (DWORD)lpProcName ) - pExportDirectory->Base ) * sizeof(DWORD) );

			fpResult = (FARPROC)( uiLibraryAddress + DEREF_32(uiAddressArray) );
		}
		else
		{
			DWORD dwCounter = pExportDirectory->NumberOfNames;
			while( dwCounter-- )
			{
				char * cpExportedFunctionName = (char *)(uiLibraryAddress + DEREF_32( uiNameArray ));

				if( strcmp( cpExportedFunctionName, lpProcName ) == 0 )
				{
					uiAddressArray += ( DEREF_16( uiNameOrdinals ) * sizeof(DWORD) );
					fpResult = (FARPROC)(uiLibraryAddress + DEREF_32( uiAddressArray ));

					break;
				}

				uiNameArray += sizeof(DWORD);

				uiNameOrdinals += sizeof(WORD);
			}
		}
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		fpResult = NULL;
	}

	return fpResult;
}
buFFy! is offline  
Old 07/25/2014, 01:17   #15
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by buFFy! View Post
Jop, stimmt - so habe ich das damals auch mal implementiert.
Wobei das ewig her ist, kann sein dass die func nicht von mir ist.
Habs auf jeden Fall vor Ewigkeiten mal gebastelt - dieses ganze intermodular prevention Zeugs.

Code:
FARPROC customWINAPI::GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
{
	UINT_PTR uiLibraryAddress = 0;
	FARPROC fpResult          = NULL;

	if( hModule == NULL )
		return NULL;

	uiLibraryAddress = (UINT_PTR)hModule;

	__try
	{
		UINT_PTR uiAddressArray = 0;
		UINT_PTR uiNameArray    = 0;
		UINT_PTR uiNameOrdinals = 0;
		PIMAGE_NT_HEADERS pNtHeaders             = NULL;
		PIMAGE_DATA_DIRECTORY pDataDirectory     = NULL;
		PIMAGE_EXPORT_DIRECTORY pExportDirectory = NULL;

		pNtHeaders = (PIMAGE_NT_HEADERS)(uiLibraryAddress + ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew);

		pDataDirectory = (PIMAGE_DATA_DIRECTORY)&pNtHeaders->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT ];

		pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)( uiLibraryAddress + pDataDirectory->VirtualAddress );

		uiAddressArray = ( uiLibraryAddress + pExportDirectory->AddressOfFunctions );
		uiNameArray = ( uiLibraryAddress + pExportDirectory->AddressOfNames );
		uiNameOrdinals = ( uiLibraryAddress + pExportDirectory->AddressOfNameOrdinals );

		if( ((DWORD)lpProcName & 0xFFFF0000 ) == 0x00000000 )
		{
			uiAddressArray += ( ( IMAGE_ORDINAL( (DWORD)lpProcName ) - pExportDirectory->Base ) * sizeof(DWORD) );

			fpResult = (FARPROC)( uiLibraryAddress + DEREF_32(uiAddressArray) );
		}
		else
		{
			DWORD dwCounter = pExportDirectory->NumberOfNames;
			while( dwCounter-- )
			{
				char * cpExportedFunctionName = (char *)(uiLibraryAddress + DEREF_32( uiNameArray ));

				if( strcmp( cpExportedFunctionName, lpProcName ) == 0 )
				{
					uiAddressArray += ( DEREF_16( uiNameOrdinals ) * sizeof(DWORD) );
					fpResult = (FARPROC)(uiLibraryAddress + DEREF_32( uiAddressArray ));

					break;
				}

				uiNameArray += sizeof(DWORD);

				uiNameOrdinals += sizeof(WORD);
			}
		}
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		fpResult = NULL;
	}

	return fpResult;
}
Hm du behandelst jedenfalls Forward RVAs nicht richtig. Es gibt 2 Typen von Forwards. Ordinal Forwards und direkte Funktionsforwards. Ordinal-Forwards sehen etwa so aus:

ntdll.#24

das wäre die 24. exportierte Funktion in ntdll.

Hier mein Code dafür:

Code:
PVOID getProcAddress(HMODULE hModule, LPCSTR lpProcName) {
	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER) hModule;
	if (!pDosHeader || pDosHeader->e_magic != 0x5A4D)
		return NULL;

	PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS) ((DWORD_PTR) hModule + pDosHeader->e_lfanew);
	if (!pNtHeaders)
		return NULL;

	PIMAGE_DATA_DIRECTORY pExportData = &pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
	if (!pExportData->Size)
		return NULL; // Module does not have any exports

	PVOID pFunction = NULL;
	PIMAGE_EXPORT_DIRECTORY pExportDir = (PIMAGE_EXPORT_DIRECTORY) ((DWORD_PTR) hModule + pExportData->VirtualAddress);
	PDWORD pFunctions = (PDWORD) ((DWORD_PTR) hModule + pExportDir->AddressOfFunctions);

	// Get function by name
	if ((DWORD_PTR) lpProcName > pExportDir->NumberOfFunctions) {
		PDWORD pNames = (PDWORD) ((DWORD_PTR) hModule + pExportDir->AddressOfNames);
		PWORD pOrdinals = (PWORD) ((DWORD_PTR) hModule + pExportDir->AddressOfNameOrdinals);

		for (DWORD i = 0; i < pExportDir->NumberOfNames; ++i) {
			LPCSTR lpProc = (LPCSTR) ((DWORD_PTR) pDosHeader + pNames[i]);
			if (lpProc && strequal(lpProcName, lpProc)) {
				pFunction = (PVOID) pFunctions[pOrdinals[i]];
				break;
			}
		}
	}
	else { // Get function by ordinal
		pFunction = (PVOID) pFunctions[(DWORD_PTR) lpProcName - 1];
	}

	if (!pFunction)
		return NULL;

	// Export RVA?
	if ((DWORD_PTR) pFunction < pExportData->VirtualAddress ||
		(DWORD_PTR) pFunction >= pExportData->VirtualAddress + pExportData->Size)
		return (PVOID) ((DWORD_PTR) hModule + (DWORD_PTR) pFunction);

	// Forward RVA
	LPCSTR lpRedirect = (LPCSTR) ((DWORD_PTR) hModule + (DWORD_PTR) pFunction);
	int nSeparator = lastIndexOf(lpRedirect, '.');
	if (nSeparator == -1) // Forward RVA is in the same module
		return getProcAddress(hModule, lpRedirect);

	INT i = 0;
	WCHAR wcModuleBuffer[MAX_PATH];
	while (i < nSeparator && i < MAX_PATH - 1)
		wcModuleBuffer[i++] = *lpRedirect++;
	wcModuleBuffer[i] = 0;

	// If the next character after the separator is null
	if (*lpRedirect++ != '.' || !(*lpRedirect))
		return NULL;

	// Get the forwarder module handle
	HMODULE hRedirect = getModuleHandle(wcModuleBuffer);

	// Forward RVA is an ordinal?
	if (*lpRedirect == '#') {
		DWORD dwOrdinal = 0;
		while (*(++lpRedirect)) { // Apply Horner-Scheme
			dwOrdinal *= 10;
			dwOrdinal += (*lpRedirect - '0');
		}

		return getProcAddress(hRedirect, (LPCSTR) dwOrdinal);
	}

	INT j = 0;
	CHAR cFunctionBuffer[MAX_PATH];
	while (*lpRedirect && j < MAX_PATH - 1)
		cFunctionBuffer[j++] = *lpRedirect++;
	cFunctionBuffer[j] = 0;

	// If there are still characters left
	if (*lpRedirect)
		return NULL;

	return getProcAddress(hRedirect, cFunctionBuffer);
}
Bitte nicht vergessen, dass ich dafür keine CRT zur Verfügung hatte, d.h. kein strcmp, new, malloc etc.
Master674b is offline  
Reply


Similar Threads Similar Threads
frage memory
02/25/2012 - General Coding - 2 Replies
Hey, ich hab von CE etwas interessantes gefunden für ein spiel, nur weis ich nicht ob das wirklich brauchbar ist oda nurn string beschreibt das was ich gefunden hab-.- den pointer für die adresse hab ich schon gefunden und zwar handelt sich um die value für burnoutincrease speed ich weis net wie ich jetzt weiter handeln soll hier das bild http://maxius12.ma.ohost.de/info/privat/bilder/bu rnout.jpg
[FRAGE] MEMORY-HACKING [FRAGE]
01/13/2011 - AutoIt - 1 Replies
Hallo...! Ich bin gerade dabei einen Hack zu schreiben....! Jetzt will ich aber einen AimBot einbauen aber nicht mit PixelSearch sondern mit Memory Hacking ! Kann mir irgendjemand weiterhelfen? Also ich will einen Aimbot mit MemoryHacking machen ! Danke schon im Voraus ! :D ______________________ AutoIt
Frage zu Memory
07/31/2010 - AutoIt - 12 Replies
Hi ich spiel ein Spiel (Pokemonworldonline) Nun habe ich mal di pointer rausgefunden. Also jedes Pokemon hat eine bestimmte id und wenn mir nun ein pokemon begenet steht ebend da welche id es hat^^. Nun möchte ich aber das wenn es z.b die id 123 gefunden hat das der bot einfach stoppt. wie könnte ich das machen? (ein script habe ich noch nicht) hier mal der pointer: P->005A7C70 die adresse war 005A7C70 (Also da wo ich in Ce gesehen habe das sich die Valu geändert hat. Thx schonmal^^.
Frage zu Memory
06/25/2010 - General Coding - 5 Replies
hallo, Es gibt hier ja genügend tuts wie man nen hack macht. Das klappt auch. Aber wenn ich das Programm neu starte geht i-wie das nicht mehr. Was muss ich machen das der wieder geht. Achja, es ist mir egal in welcher programmiersprache ihr schreibt, es gibt ja tuts für c++, autoit und vb :D mfg
memory frage
04/23/2009 - General Coding - 7 Replies
HI comunity, gibt es eine Möglichkeit mit der CE die ID von der Maus wenn sie über einem Gegner(nicht wenn der Gegner ausgewählt ist). Habe dabei das Problem das ich nicht in CE suchen kann und gleichzeitig die maus über dem Gegner lassen kann^^. Vll jmd ne idee?? LG und thx schonmal, bunney



All times are GMT +1. The time now is 00:59.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.