Krane Posted September 27, 2020 Report Posted September 27, 2020 (edited) 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 September 27, 2020 by Krane Quote
yoyois Posted September 27, 2020 Report Posted September 27, 2020 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. 1 Quote
Krane Posted September 27, 2020 Author Report Posted September 27, 2020 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 Quote
yoyois Posted September 27, 2020 Report Posted September 27, 2020 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. Quote