Jump to content
Krane

Handling nullptrs - memory management - game hacking

Recommended Posts

Sa spunem ca local_player se afla la 

"game.exe + 0xDEADBEEF" si offsets: 0x10, 0x20, 0x30

 

 

DWORD mem::FindDMAAddy(DWORD ptr, std::vector<DWORD> offsets)
{
	DWORD addr = ptr;
	for (unsigned int i = 0; i < offsets.size(); ++i)
	{
		addr = *(DWORD*)addr;
		addr += offsets[i];

	}
	return addr;
}

 

 

Best case scenario eu nu intervin si codu merge perfect, dar

 

Eu imi ating local player dupa ce iau valoarea de la pointeru de baza + toate cele 3 offseturi, daca unul din ele este NULL, atunci programul da crash si implicit jocul.

 

Si atunci o metoda ar fi ca functia sa returneze bool true sau false in functie de i == offsets.size(), si fals daca nu a ajuns acolo pe un check foarte simplu de 

 

if(*(DWORD*)addr + offsets[i])

 

checkul asta o sa vada da urmatorele instructiuni din loop nu o sa dea crash  si o sa -i mai pun un parametru *local_player_addr = addr; ca sa am si adresa complet sa fie totul ok

 

metoda asta o folosesc si astazi si asa verific daca am local_player si e totul okay, doar ca ieri am stat si m-am gandit, daca nu sunt curios de local_player si ar trebuii sa fie niste variable spre exemplu cand te uiti la replay, si scorul lui este 0? daca el e tratat in derefrence ca si nullptr, si aici m-am cam oprit pentru ca nu imi vine nici o idee inafara de cum am spus si inainte, sa verific daca i == offsets.size(); e sfarsitu si sa intoarca, e oare vreo metoda mai eficienta sau pur si simplu mai multe solutii?

 

 

 

 

 

Edited by Krane
Link to post
Share on other sites

In general daca ai pointeri null in chainul tau de offsets inseamna ca fie e gresit chainul, fie nu e alocata/folosita inca memoria.

Adica daca unul din pointeri e null, adresa pe care o cauti nu exista.

 

Cea mai simpla metoda e sa verifici in interiorul buclei for daca addr e diferita de null.

Crasul se intampla cand faci *(DWORD*)addr si addr e memorie rezervata.

 

for (unsigned int i = 0; i < offsets.size(); ++i)
	{
 		if(!addr)
    	{
          //Memorie illegala. O rezolvi cum vrei tu.
          //fie:
          //return 0;
          //
          //fie  varianta eleganta
          // throw IllegalMemoryException;
        }
		addr = *(DWORD*)addr;
		addr += offsets[i];

	}

 

 

Si mai elegant e ca sa verifici chiar daca chainul nu e null, daca adressele sunt correcte.

Gen daca cautii local_player ii verifici cateva valorii care sunt valori fixe(gen ammo>-1, hp>0, etc.). Ca sa fii sigur ca ai aterizat pe local_player si nu pe alta memorie din greseala.

 

 

Mai "efficient" de atat nu stiu cum se poate. Oricum ce importanta are efficienta, ca doar adresele le cauti o singura data la injectie.

Imbunatatiri ai doar daca gasesti un offset path mai scurt.

  • Upvote 1
Link to post
Share on other sites
36 minutes ago, yoyois said:

In general daca ai pointeri null in chainul tau de offsets inseamna ca fie e gresit chainul, fie nu e alocata/folosita inca memoria.

Adica daca unul din pointeri e null, adresa pe care o cauti nu exista.

 

Cea mai simpla metoda e sa verifici in interiorul buclei for daca addr e diferita de null.

Crasul se intampla cand faci *(DWORD*)addr si addr e memorie rezervata.

 


for (unsigned int i = 0; i < offsets.size(); ++i)
	{
 		if(!addr)
    	{
          //Memorie illegala. O rezolvi cum vrei tu.
          //fie:
          //return 0;
          //
          //fie  varianta eleganta
          // throw IllegalMemoryException;
        }
		addr = *(DWORD*)addr;
		addr += offsets[i];

	}

 

 

Si mai elegant e ca sa verifici chiar daca chainul nu e null, daca adressele sunt correcte.

Gen daca cautii local_player ii verifici cateva valorii care sunt valori fixe(gen ammo>-1, hp>0, etc.). Ca sa fii sigur ca ai aterizat pe local_player si nu pe alta memorie din greseala.

 

 

Mai "efficient" de atat nu stiu cum se poate. Oricum ce importanta are efficienta, ca doar adresele le cauti o singura data la injectie.

Imbunatatiri ai doar daca gasesti un offset path mai scurt.

 

Mersi de sfat, chesti cu Try Catch am incercat, dar mie imi da crash regardless, doar ca la "throw" an folosit altceva, chestia ce ti-o autocompleteaza Visual studio, probabil ca trebuia sa pun illegalmemoryexception, Eu in trecut am incercat "assert()" si dadea o eroare cu un MessageBox() in fata, aia a fost singura daca cand am fost aproape de un "Try catch", mersi de sfata acum o sa ma uit peste illegalmemoryexception, daca merge e super bine 

Link to post
Share on other sites
3 minutes ago, Krane said:

 

Mersi de sfat, chesti cu Try Catch am incercat, dar mie imi da crash regardless, doar ca la "throw" an folosit altceva, chestia ce ti-o autocompleteaza Visual studio, probabil ca trebuia sa pun illegalmemoryexception, Eu in trecut am incercat "assert()" si dadea o eroare cu un MessageBox() in fata, aia a fost singura daca cand am fost aproape de un "Try catch", mersi de sfata acum o sa ma uit peste illegalmemoryexception, daca merge e super bine 

Citeste asta si sper ca intelegi cum functioneaza throw catch

https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm#:~:text=A C%2B%2B exception is a,try%2C catch%2C and throw.

 

 

 illegalmemoryexception e un pseudo-exemplu de exceptie dat de la mine. Daca urmaresi tutoriaul intelegi cum sa-ti creezi proriul tip de exceptie si cum sa o tratezi.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...