-
Posts
95 -
Joined
-
Last visited
Content Type
Profiles
Forums
Downloads
Gallery
Posts posted by Sami1982
-
-
57 minutes ago, Sami1982 said:
Okay but I have done some extensive testing and even when I specify only 1 region the script randomly fails to provide the correct health address. If I close and re-open the game let's say 5 times in a row for example, one of those times will fail. This kills all the fun if every time I open the game I have to cross my fingers and pray and hope that it works LOL.
Actually sorry let me rephrase that. I am not able to find a working group search if I specify only 1 region. So I guess I am out of luck then. Oh well it's better than nothing.
0 -
5 minutes ago, nok1a said:
Well, pointerSearch(0) is not that lazy. But pointerSearch(500) with ridiculous big offsets is for sure lazy.
Okay but I have done some extensive testing and even when I specify only 1 region the script randomly fails to provide the correct health address. If I close and re-open the game let's say 5 times in a row for example, one of those times will fail. This kills all the fun if every time I open the game I have to cross my fingers and pray and hope that it works LOL.
0 -
8 minutes ago, nok1a said:
Because i was not sure in which regions your values would be. I knew mine. Perhaps for you could be different. So i specified all possible regions.
Okaaay now I understand.
0 -
1 hour ago, nok1a said:
Probably because there was more then 1 result with a matching 1.0 float value to filter on. And that probably happened because of having no accurate memory ranges. I can't be 100% sure because i haven't encountered the issue yet.
Yes, your pointer was in region anonymous. So if you know that only specify the pointer search to be in region anonymous. Do that before the results are loaded in the result list.
Okay but just to clarify...I want to make sure I understand something....why did you specify 3 regions in your script? Isn't it okay if the pointer is in any of those 3 regions?
0 -
1 hour ago, nok1a said:
Probably because there was more then 1 result with a matching 1.0 float value to filter on. And that probably happened because of having no accurate memory ranges. I can't be 100% sure because i haven't encountered the issue yet.
Yes, your pointer was in region anonymous. So if you know that only specify the pointer search to be in region anonymous. Do that before the results are loaded in the result list.
Okay, got it. Thanks again for all your help.
0 -
20 hours ago, nok1a said:
I could. To be honest i have no idea about your understanding of GG Lua scripting. But you should learn it. You would get basics quickly for write a GG script and it's user friendly.
Can you send the script you currently have.
Sorry for the late response. Not sure if you saw but I edited my last post last night to inform you that I've reached my maximum number of posts for yesterday. This restriction in the forum is so annoying by the way lol. Anyhow, it finally worked when you gave me this line:
healthPointer[i] = {address = t[i].address + 0x18, flags = gg.TYPE_DWORD}
The reason I was gettin an error was because silly me (due to being so late into the night and my eyes had turned into rocks and my brain had frozen lol) I had a "multiplied by" sign in 0x18 which also looks like the letter X LOL.
Also, I know how to write basic scripts but coding pertaining to pointers and offsets in a script is something new to me. But I will try to learn it. You have been wonderful about all of this and I will never forget what you taught me and the favors you did for me
But you never answered those 2 questions for me:
1) Even your script randomly fails sometimes (i.e. it doesn't give the correct address). Why? Is it normal to happen once in a while?
2) When you said "That's why specify the regions as accurate as possible in which you want find the pointers in in or it will already bring issues"
Why did I run into this issue? I simply chose the same 3 regions that you had in your script. I chose them in both the emulator and my phone.
0 -
16 minutes ago, nok1a said:
Oke i understand, so the problem here is the scripting.
I can't explain scripting that well compared to other members in the forum. But you should start by running the print() function to print out your tables and have some understanding of what the script is doing. Use --[[ ]] to ignore most of your code and let GG does it thing line by line. Start with doing the group search, then refine and then store the results in a new table named "t" and print it out...something like this.
local t = gg.getResults(10) print(t)
Then analyze what GG respond. Make sure GG ignores the rest of the code by placing it as a comment:
Also check in the GG scripting documentation what it is that you writted
Oh maaaan I was so close to finishing this script lol. Could you please please just fix it for me like you did yesterday and make me happy
It's just one small piece left.
By the way I've reached my maximum posts for today. I will send you the script tomorrow. Thanks again
0 -
-
2 minutes ago, nok1a said:
Yes I understand what you mean by offsets 0x4, 0x8, 0xc, 0x10....etc but I don't know how to write it out in the script. Like the syntax and where it should go.
Also alot of points are getting skipped (lost in translation lol)....So I will write everything here one shot....
1) Your script randomly fails sometimes (i.e. it doesn't give the correct address). Why? Is it normal to happen once in a while?
2) When you said "That's why specify the regions as accurate as possible in which you want find the pointers in in or it will already bring issues"
Why did I run into this issue? I simply chose the same 3 regions that you had in your script. I chose them in both the emulator and my phone.
0 -
18 minutes ago, Sami1982 said:
That's why specify the regions as accurate as possible in which you want find the pointers in in or it will already bring issues.
Why did I run into this issue? I simply chose the same 3 regions that you had in your script. I chose them in both the emulator and my phone.
0 -
7 minutes ago, nok1a said:
It wasn't in the script because i was already at the right address to perform the pointer search on to get to health value. Your at a different pointer then mine using your group search.
The table t contains those 4 results you had from performing a pointer search on that one address you had from your group search. You already addedan offset of 0x8 to all those addresses to get to the address that is supposed to hold the value 256 and you stored the new addresses in the table (sensitivity). use print(sensitivity) for see what's in the table.
Only problem is that your doing it for all the 4 addresses in the result list while you only have to do it for the one address in region Anonymous. That's why specify the regions as accurate as possible in which you want find the pointers in in or it will already bring issues.
The way you added 0x8 to do the addresses you now do the same for the table t in a loop.
healthPointer[i] = {address = t[i].address, flags = gg.TYPE_DWORD}
add the offset from your start address to the address on which you want to perform the pointer search on to get the health value.
Sorry man I am still confused lol. I already have this line:
healthPointer[i] = {address = t[i].address, flags = gg.TYPE_DWORD}
and I don't understand how to write this out:
add the offset from your start address to the address on which you want to perform the pointer search on to get the health value.
Sorry if I am asking for a little hand-holding because it's something new and a bit advanced for me
0 -
4 minutes ago, nok1a said:
I don't understand this part.....where does this show in your script?
Also btw, I just realized even your script sometimes randomly fails...it gives me the incorrect address. Is this normal?
0 -
8 minutes ago, nok1a said:
Yeah when using searchPointer() you have to specify the regions before you load the results in the result list. The regions at the first line should be the region where you try finding your group search, but i am not sure if your group search is always in the same region. Then when pointer searching you have to only specify the region where the pointer is which i think was region Ca or A.
I am really going blind here Lol. Please please help me fix my script and this will be the last thing I ask you for. Honest to God man.
d.
8 minutes ago, nok1a said:Yeah when using searchPointer() you have to specify the regions before you load the results in the result list. The regions at the first line should be the region where you try finding your group search, but i am not sure if your group search is always in the same region. Then when pointer searching you have to only specify the region where the pointer is which i think was region Ca or A.
I noticed in your script you only specified regions in the first line.
So could you tell me what I need to add and where to add it to make my script do what your script does?
0 -
17 minutes ago, nok1a said:
Your offset is + 0x8 of the pointer, not - 0x8.
Also i not know if you saw but the memory region in which your value 256 was located was in region anonymous. So make your pointer searching more accurate by specifying the correct regions when needed...if you where sharing the scripts with multiple people i can understand you use multiple regions. But in this case it's for personal use i guess? See here the regions you can use.
When comparing two values they must be of same type as mentioned. You comparing a number type and a string type here.
If all the values are in dword no need to use "A" in front of each number. It slowers the search. It's better use the correct data type for each value or just remove the data type of each value and give them all same data type using gg.TYPE_DWORD. You will prevent issues by doing so. As mentioned here. The choice is up to you.
I also removed the quotes around 256
so now it's like this:
if sensitivity[i].value == 256 then
but I still just get the same 3 results as show in the video.
0 -
8 minutes ago, nok1a said:
Your offset is + 0x8 of the pointer, not - 0x8.
Also i not know if you saw but the memory region in which your value 256 was located was in region anonymous. So make your pointer searching more accurate by specifying the correct regions when needed...if you where sharing the scripts with multiple people i can understand you use multiple regions. But in this case it's for personal use i guess? See here the regions you can use.
When comparing two values they must be of same type as mentioned. You comparing a number type and a string type here.
If all the values are in dword no need to use "A" in front of each number. It slowers the search. It's better use the correct data type for each value or just remove the data type of each value and give them all same data type using gg.TYPE_DWORD. You will prevent issues by doing so. As mentioned here. The choice is up to you.
Yes it's for personal use. I have specified 3 regions:
gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC)
Yes the value "256" is in REGION_ANONYMOUS. Isn't this okay?
12 minutes ago, nok1a said:Your offset is + 0x8 of the pointer, not - 0x8.
Also i not know if you saw but the memory region in which your value 256 was located was in region anonymous. So make your pointer searching more accurate by specifying the correct regions when needed...if you where sharing the scripts with multiple people i can understand you use multiple regions. But in this case it's for personal use i guess? See here the regions you can use.
When comparing two values they must be of same type as mentioned. You comparing a number type and a string type here.
If all the values are in dword no need to use "A" in front of each number. It slowers the search. It's better use the correct data type for each value or just remove the data type of each value and give them all same data type using gg.TYPE_DWORD. You will prevent issues by doing so. As mentioned here. The choice is up to you.
Okay even when I fixed it to + 0x8 I still got the same exact thing as in the video.
0 -
6 hours ago, nok1a said:
That's right. I also didn't knew about pointers first. Actually this whole GG pointer thing didn't make sense because i didn't knew what where hex, bytes and bits...should have stayed in school longer to get some basics...So i totally get you...it's a pain to come in without knowledge
about all this...Was watching some YT tutorials about how or what are bits and bytes and it helped me. Then after some time i understand addresses in memory a little and then pointer concept from a GG point of view made more sense. But also importantly the members in this forum contribute to making it more easy for people like us to understand something which is most likely alien language for us. There is lot's of things to learn i guess. We can use GG and the forum and other sources to learn more.
This should absolutely be the last time I bother you LOL. I got my own nice accurate group search now. And I almost have it down perfectly but I am stuck on the part where I can filter out the remaining addresses to only have 1 address left. I saw a "256D" value 8 bytes down from the pointer. So I tried to do what you did with that "1.0F" value to filter them out but it's not working. I've been racking my brain until I got a headache LOL. In this video the script gets me halfway through to the health value, and the remaining part I did manually. Could you help me bridge the gap in the script to get to the health value? Here is the script I am using:
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("-1,049,624,576A;1,092,616,192A;1,082,130,432A;1,056,964,608A;1,062,333,317A::73", gg.TYPE_DWORD) gg.refineNumber("-1,049,624,576A", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(1) gg.loadResults({{address = grp[1].address - 0x88, flags = gg.TYPE_DWORD}}) gg.searchPointer(0) local t = gg.getResults(gg.getResultsCount()) print("First Pointer search: ", gg.getResultsCount()) local t = gg.getResults(gg.getResultsCount()) local sensitivity = {} for i, v in ipairs(t) do sensitivity[i] = {address = v.address - 0x8, flags = gg.TYPE_FLOAT} end sensitivity = gg.getValues(sensitivity) local healthPointer = {} for i = 1, #sensitivity do if sensitivity[i].value == "256" then healthPointer[i] = {address = t[i].address, flags = gg.TYPE_DWORD} end end
You are almost finished with me I PROMISE
0 -
5 minutes ago, nok1a said:
That's right. I also didn't knew about pointers first. Actually this whole GG pointer thing didn't make sense because i didn't knew what where hex, bytes and bits...should have stayed in school longer to get some basics...So i totally get you...it's a pain to come in without knowledge
about all this...Was watching some YT tutorials about how or what are bits and bytes and it helped me. Then after some time i understand addresses in memory a little and then pointer concept from a GG point of view made more sense. But also importantly the members in this forum contribute to making it more easy for people like us to understand something which is most likely alien language for us. There is lot's of things to learn i guess. We can use GG and the forum and other sources to learn more.
You nailed it right on the head. My feeling exactly. This forum is so rich and if we just use youtube and google, we feel a scarcity in information and knowledge
1 -
2 hours ago, nok1a said:
Yeah you should. Are you sure you did it correctelly though. I performed pointer search more then once...so you have to use go to the pointer more then onces as well in order to get to the groups search.
Okay okay I finally got it! You dug into deeper pointer "layers" in order to fine tune your group search and make it more accurate, which in turn resulted in needing that third "extra" pointer search while backtracking to find the health value. Makes perfect sense! LOL
OMG bro you are amazing! You've literally taught me from scratch a skill I never had. I will be forever in your debt man!
1 -
1 hour ago, nok1a said:
Yeah you should. Are you sure you did it correctelly though. I performed pointer search more then once...so you have to use go to the pointer more then onces as well in order to get to the groups search.
Okay let's see if I can figure out where I am going wrong. I ran your script and got your health value. Then I also ran your group search. Here is your group search results. All addresses start with "B431FBxx"
Next, I press on your health value from the saved area, and I press GOTO
Then I press on the address which is 4 bytes above it "AC0912E8" and I chose "Goto pointer"
I arrive at this list and I scoured the entire list (up and down) and I can't find your block of your group search whose addresses should start with "B431FBxx"
What am I doing wrong?
0 -
10 hours ago, nok1a said:
Your script can not be same because your using different group search, and where you found your group search the structure is different. You only have to do one time a pointer search and your not using any values to filter out irrelevant results. You can remove most of the lines from it, here some example based on your group search and pointer you when't to.
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("17D;1,075,642,368D;1,900,544D;1,310,728D;589,828D;1,703,957D;1,703,969D;1,376,289D;1,920D;469,762,048D::185", gg.TYPE_DWORD) gg.refineNumber("1,900,544", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(gg.getResultsCount()) for i, v in ipairs(grp) do v.address = v.address - 0x4 v.flags = gg.TYPE_DWORD end gg.loadResults(grp) gg.searchPointer(0) local t = gg.getResults(gg.getResultsCount()) for i, v in ipairs(t) do v.address = v.address - 0xC v.flags = gg.TYPE_FLOAT end gg.loadResults(t)
By the way you didn't answer me on this question from the previous page:
When I run your script and get the health value, shouldn't I theoretically be able to go to the nearest pointer, which is 4 bytes above your health value and click "go to pointer" and find that block that you used for your group search? I mean since they are static they should appear on my device too just like they did on your 2 devices, right? Well I went up and down the list and I didn't find that block of numbers.
0 -
9 hours ago, nok1a said:
Your script can not be same because your using different group search, and where you found your group search the structure is different. You only have to do one time a pointer search and your not using any values to filter out irrelevant results. You can remove most of the lines from it, here some example based on your group search and pointer you when't to.
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("17D;1,075,642,368D;1,900,544D;1,310,728D;589,828D;1,703,957D;1,703,969D;1,376,289D;1,920D;469,762,048D::185", gg.TYPE_DWORD) gg.refineNumber("1,900,544", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(gg.getResultsCount()) for i, v in ipairs(grp) do v.address = v.address - 0x4 v.flags = gg.TYPE_DWORD end gg.loadResults(grp) gg.searchPointer(0) local t = gg.getResults(gg.getResultsCount()) for i, v in ipairs(t) do v.address = v.address - 0xC v.flags = gg.TYPE_FLOAT end gg.loadResults(t)
Okay, I am starting to get it lol. Let me squeeze my brain again today and see what I come up with. I really appreciate al your help my friend.
0 -
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("17A;1,075,642,368A;1,900,544A;1,310,728A;589,828A;1,703,957A;1,703,969A;1,376,289A;1,920A;469,762,048A::185", gg.TYPE_DWORD) gg.refineNumber("1,900,544", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(gg.getResultsCount()) for i, v in ipairs(grp) do v.address = v.address - 0x4 v.flags = gg.TYPE_DWORD end gg.loadResults(grp) gg.searchPointer(0) print("First Pointer search: ", gg.getResultsCount()) gg.searchPointer(0) print("Second Pointer search: ", gg.getResultsCount()) local t = gg.getResults(gg.getResultsCount()) local sensitivity = {} for i, v in ipairs(t) do sensitivity[i] = {address = v.address + 0x4, flags = gg.TYPE_FLOAT} end sensitivity = gg.getValues(sensitivity) local healthPointer = {} for i = 1, #sensitivity do if sensitivity[i].value == 1.0 then healthPointer[i] = {address = t[i].address, flags = gg.TYPE_DWORD} end end gg.loadResults(healthPointer) print("Results healthPointer: ", gg.getResultsCount()) gg.searchPointer(0) print("Third Pointer search: ", gg.getResultsCount()) local t = gg.getResults(gg.getResultsCount()) local health = {[1] = {address = res[1].address - 0xc, flags = gg.TYPE_FLOAT, name = "Health"}} gg.addListItems(health) gg.loadResults(health)
25 minutes ago, Sami1982 said:Wait maybe I misunderstood about the pointer.....when I click on the health value and click GOTO, this is the line that I long pressed on and clicked GOTO pointer. So from 5C to 68 is 12 bytes right?
Okay when I changed all the 0xC to 0X4 the first and second pointer searches are successful but i get 0 results for the third pointer search.
0 -
30 minutes ago, nok1a said:
Why are you doing 0x0C ? Your value 1,900,544 is not 12 bytes away from the pointer you just whent to, it's 4 bytes away.
If you enable byte view in the memory viewer you can see the actual distance between the addresses:
Or you can select both addresses and use the offset calculation to see distance from start address to destination address.
Wait maybe I misunderstood about the pointer.....when I click on the health value and click GOTO, this is the line that I long pressed on and clicked GOTO pointer. So from 5C to 68 is 12 bytes right?
24 minutes ago, Sami1982 said:Okay when I changed all the 0xC to 0X4 the first and second pointer searches are successful but i get 0 results for the third pointer search
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("17A;1,075,642,368A;1,900,544A;1,310,728A;589,828A;1,703,957A;1,703,969A;1,376,289A;1,920A;469,762,048A::185", gg.TYPE_DWORD) gg.refineNumber("1,900,544", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(gg.getResultsCount()) for i, v in ipairs(grp) do v.address = v.address - 0x4 v.flags = gg.TYPE_DWORD end gg.loadResults(grp) gg.searchPointer(0) print("First Pointer search: ", gg.getResultsCount()) gg.searchPointer(0) print("Second Pointer search: ", gg.getResultsCount()) local t = gg.getResults(gg.getResultsCount()) local sensitivity = {} for i, v in ipairs(t) do sensitivity[i] = {address = v.address + 0x4, flags = gg.TYPE_FLOAT} end sensitivity = gg.getValues(sensitivity) local healthPointer = {} for i = 1, #sensitivity do if sensitivity[i].value == 1.0 then healthPointer[i] = {address = t[i].address, flags = gg.TYPE_DWORD} end end gg.loadResults(healthPointer) print("Results healthPointer: ", gg.getResultsCount()) gg.searchPointer(0) print("Third Pointer search: ", gg.getResultsCount()) local t = gg.getResults(gg.getResultsCount()) local health = {[1] = {address = res[1].address - 0xc, flags = gg.TYPE_FLOAT, name = "Health"}} gg.addListItems(health) gg.loadResults(health)
0 -
13 minutes ago, nok1a said:
Make sure that when you do a group search you specify it's data type. When you put Auto in front of it GG will look for all possible data types for that specific value and then needs to match it also with the other values to see if the group search can be found.
You could have results you don't need.
For example do this:
gg.searchNumber("17D;1,075,642,368D;1,900,544D;1,310,728D;589,828D;1,703,957D;1,703,969D;1,376,289D;1,920D;469,762,048D::185", gg.TYPE_DWORD)
Or you can ignore the data types next to the value and only use
gg.TYPE_DWORD
For refine you don't need to put a data type anymore aside from adding the gg.TYPE_DWORD
Thank you so much for all the info and instructions. You're too generous as always
Okay, I tried to break up the script to go only as far as the first pointer search (to not overwhelm myself) but I am still getting no results and I don't know what I'm doing wrong:
gg.setRanges(gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_ALLOC) gg.searchNumber("17A;1,075,642,368A;1,900,544A;1,310,728A;589,828A;1,703,957A;1,703,969A;1,376,289A;1,920A;469,762,048A::185", gg.TYPE_DWORD) gg.refineNumber("1,900,544", gg.TYPE_DWORD) print("Group search: ", gg.getResultsCount()) local grp = gg.getResults(gg.getResultsCount()) for i, v in ipairs(grp) do v.address = v.address - 0xC v.flags = gg.TYPE_DWORD end gg.loadResults(grp) gg.searchPointer(0) print("First Pointer search: ", gg.getResultsCount())
0
Can a group search be done for encrypted value or any other way to speed up the process?
in Help
Posted · Edited by Sami1982
I just managed to find a working group search in Anonymous only region. Went blind and spent hours to find it....and some more blindness and some more hours to figure out how to script it, but the end result and the reward and sense of accomplishment is more than worth it! Couldn't have done it without your help. Let's just hope it's reliable because I've only tested with 2 restarts of the game so far Lol.