 |
Cheat Engine The Official Site of Cheat Engine
|
View previous topic :: View next topic |
Author |
Message |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sat May 25, 2013 7:09 pm Post subject: The static base adress of my multi level pointer changes-why |
|
|
hello, I registered since I canīt understand or find a work around this and hope that anyone can help with this
I have an adress which shows my status, its either 1 or 0 (just some background). Now I want to a pointer and therefore a baseadress for it.
I do the "what access this adress" find my "the base adress is probably" adress and do a hex search for this adress which leads me to 1 new adress. I do this a few times until I get to my green (static) base adress. The base adress in one case was GameClient+2E1E3A
For this gamesession the pointer worked, showed to my adress with the 1 or 0 value, everything was fine.
The next time I started the game, my pointer did not work anymore, which confused me.
So I repeated my way above, it gave me the exact same 5 offsets again, I found the green static adress at the end, which was now GameClient+2A1D4B
My first baseadress lead to 0
I repeated it a few more times which the same results all the time. My offsets do not change, they stay the same, but my baseadress, which is shown as green in cheatengine changes everytime.
All tutorials I have read mention that the static adress is indeed static and wonīt change as it does in my case
Can anyone explain why this happens and if there is a way around it
Thanks in advance
Greetings
Dragonelf
|
|
Back to top |
|
 |
eax.qbyte Advanced Cheater
Reputation: 3
Joined: 25 Jun 2011 Posts: 59 Location: CEDisasmView
|
Posted: Sat May 25, 2013 11:12 pm Post subject: |
|
|
I think i'm having the same problem like you.
I guess the last instruction you found which picks a value from a static address should be a base address+some indexed offset.
I mean an instruction like this: MOV ECX,[ESI+EBX*4]or MOV ECX,[StaticAddress+EBX*4](the offset depends on a register)
If it is true, the ESI is always the same but EBX some times chanes.
Which means the value of EBX should be stored somewhere other in memory and we can find it's pointer too.
but how should we combine these two pointers? I know writing an AA script is a solution but
not everybody knows scripting and not all games allow editing their code easily.
_________________
My special thanx to Cheat Engine and its developers. It helps me do the hard and boring but valuable process of understanding the code, easily and with fun.
Last edited by eax.qbyte on Sun May 26, 2013 7:10 am; edited 1 time in total |
|
Back to top |
|
 |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sun May 26, 2013 12:03 am Post subject: |
|
|
eax.qbyte wrote: | I think i'm having the same problem like you.
I guess the last instruction you found which picks a value from a static address should be a base address+some indexed offset.
I mean an instruction like this: MOV ECX,[ESI+EBX*4]or MOV ECX,[StaticAddress+EBX*4](the offset depends on s register)
If it is true, the ESI is always the same but EBX some times chanes.
Which means the value of EBX should be stored somewhere other in memory and we can find it's pointer too.
but how should we combine these two pointers?
Address descriptions are not registered as symbols to other addresses and we can not use symbols in pointer offsets.
I know writing an AA script is a solution but not everybody knows scripting and not all games allow editing their code easily. |
Thanks for the possible inside, that might be true
I can however check the function in the assembler and check what it writes to. There I can see that my baseadress always gets stored in eax, however the function does other stuff as well, so eax changes a few time, but should mostly contain my baseadress when its called
Since I definitly want to release it with a program, I thought about making a jump to a code cave, writing the current value of eax to an emtpy adress and read it from there for a few seconds, then check what the value mostly was and voila I have my baseadress. But that just seems way too much work for a simple valuereading at all. There must be an easier solution, I hope someone can help us on that topic
|
|
Back to top |
|
 |
eax.qbyte Advanced Cheater
Reputation: 3
Joined: 25 Jun 2011 Posts: 59 Location: CEDisasmView
|
Posted: Sun May 26, 2013 12:31 am Post subject: |
|
|
Can you add the assembly instructions found by "find out what accesses this address"?
In this way:
First in memory view go to view menu and activate "show module addresses" and "show symbols"
Open a Notepad
Then On every address
-Right click and choose find out what accesses this address
-When found stop the breakpoint and choose an instruction.
-Click on "show in disassembly"
-In memory editor(disassembly view) with instruction selected Press CTRl+C->Then click copy(with all ticks on)
-Paste it in notepad
Repeat them for all steps of tracing the pointer.
Post them in cheat engine forum. And I think you will get certain answers.
_________________
My special thanx to Cheat Engine and its developers. It helps me do the hard and boring but valuable process of understanding the code, easily and with fun.
Last edited by eax.qbyte on Sun May 26, 2013 1:03 am; edited 2 times in total |
|
Back to top |
|
 |
Gniarf Grandmaster Cheater Supreme
Reputation: 43
Joined: 12 Mar 2012 Posts: 1285
|
Posted: Sun May 26, 2013 12:38 am Post subject: |
|
|
@Dragonelf: I recommend trying the pointer scanner, using an offset of 6 or more and making sure that "stop traversing when a static address..." in NOT checked. Since you know 5 offsets, input them in "pointer path must end with offsets...". The topmost offset is the "closest" one from your 0/1 flag.
If that doesn't work, try again without inputting the offsets you know, maybe the scanner will find/use a pointer that is actually for another variable, but that other variable is always at a fixed distance from the one you wanna hack, resulting in a valid pointer to your variable.
eax.qbyte wrote: | I mean an instruction like this: MOV ECX,[ESI+EBX*4]or MOV ECX,[StaticAddress+EBX*4](the offset depends on s register)
If it is true, the ESI is always the same but EBX some times chanes.
Which means the value of EBX should be stored somewhere other in memory and we can find it's pointer too.
but how should we combine these two pointers? | One solution is to use a lua script that would periodically (like every 50ms if your freeze timer is at 100ms) acquire the array index (walk its pointer), make the calculation StaticAddress+index*4, walk the rest of the pointer path, and register a symbol at the terminal address. You just have to paste that symbol in the address field of your cheat entry.
|
|
Back to top |
|
 |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sun May 26, 2013 1:05 am Post subject: |
|
|
Gniarf wrote: | @Dragonelf: I recommend trying the pointer scanner, using an offset of 6 or more and making sure that "stop traversing when a static address..." in NOT checked. Since you know 5 offsets, input them in "pointer path must end with offsets...". The topmost offset is the "closest" one from your 0/1 flag.
If that doesn't work, try again without inputting the offsets you know, maybe the scanner will find/use a pointer that is actually for another variable, but that other variable is always at a fixed distance from the one you wanna hack, resulting in a valid pointer to your variable.
eax.qbyte wrote: | I mean an instruction like this: MOV ECX,[ESI+EBX*4]or MOV ECX,[StaticAddress+EBX*4](the offset depends on s register)
If it is true, the ESI is always the same but EBX some times chanes.
Which means the value of EBX should be stored somewhere other in memory and we can find it's pointer too.
but how should we combine these two pointers? | One solution is to use a lua script that would periodically (like every 50ms if your freeze timer is at 100ms) acquire the array index (walk its pointer), make the calculation StaticAddress+index*4, walk the rest of the pointer path, and register a symbol at the terminal address. You just have to paste that symbol in the address field of your cheat entry. |
ah I didnt mentioned it, I usually use this method to find pointers, but after the second scan it leaves me with 0 pointers, so I chosed another way
|
|
Back to top |
|
 |
Gniarf Grandmaster Cheater Supreme
Reputation: 43
Joined: 12 Mar 2012 Posts: 1285
|
Posted: Sun May 26, 2013 1:17 am Post subject: |
|
|
That's odd, the pointerscanner should at least find the pointer you found manually. If it doesn't it means it's not properly configured for this game, so I'd suggest first getting it to find your manual pointer, and then increasing level/structure size to find a stable one.
Since GameClient+2A1D4B is an odd (as opposed to even) value, uncheck "addresses must be 32bit aligned".
What are your 5 offsets?
What structure size are you using?
Did you use "improve pointerscan with gathered heap data"? (Avoid it by default)
|
|
Back to top |
|
 |
eax.qbyte Advanced Cheater
Reputation: 3
Joined: 25 Jun 2011 Posts: 59 Location: CEDisasmView
|
Posted: Sun May 26, 2013 2:11 am Post subject: |
|
|
Well, Yes thank you.
Gniarf wrote: | One solution is to use a lua script that would periodically (like every 50ms if your freeze timer is at 100ms) acquire the array index (walk its pointer), make the calculation StaticAddress+index*4, walk the rest of the pointer path, and register a symbol at the terminal address. You just have to paste that symbol in the address field of your cheat entry. |
Needing it many times that some of the addresses are same in some parts of their path
ammo, position, health, ... could all be extracted from same base and this way the address list will probably work lighter too.
----
also I have to correct what I said before in this thread
eax.qbyte wrote: | I guess the last instruction you found which picks a value from a static address should be a base address+some indexed offset.
I mean an instruction like this: MOV ECX,[ESI+EBX*4]or MOV ECX,[StaticAddress+EBX*4](the offset depends on a register)
If it is true, the ESI is always the same but EBX some times chanes. |
This is not always true. many times the game is loading some general values and doesn't matter which index is used for who.
_________________
My special thanx to Cheat Engine and its developers. It helps me do the hard and boring but valuable process of understanding the code, easily and with fun.
Last edited by eax.qbyte on Sun May 26, 2013 7:14 am; edited 1 time in total |
|
Back to top |
|
 |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sun May 26, 2013 3:41 am Post subject: |
|
|
Gniarf wrote: | That's odd, the pointerscanner should at least find the pointer you found manually. If it doesn't it means it's not properly configured for this game, so I'd suggest first getting it to find your manual pointer, and then increasing level/structure size to find a stable one.
Since GameClient+2A1D4B is an odd (as opposed to even) value, uncheck "addresses must be 32bit aligned".
What are your 5 offsets?
What structure size are you using?
Did you use "improve pointerscan with gathered heap data"? (Avoid it by default) |
The pointerscanner shows me around 400k pointers leading to my adress when I scan it the first time
When I start the game again, it shows me zero for the new adress
Thats what I meant with 2scans
Always using 4 byte scan
|
|
Back to top |
|
 |
Gniarf Grandmaster Cheater Supreme
Reputation: 43
Joined: 12 Mar 2012 Posts: 1285
|
Posted: Sun May 26, 2013 3:54 am Post subject: |
|
|
Gniarf wrote: | What are your 5 offsets?
What structure size are you using? | You didn't answer that, so I'll just dump what I have in mind: if the structure size you use if below the biggest of the 5 offsets you found manually, then it is normal that you end up with 0 results after some rescans.
|
|
Back to top |
|
 |
Pingo Grandmaster Cheater
Reputation: 8
Joined: 12 Jul 2007 Posts: 571
|
Posted: Sun May 26, 2013 4:08 am Post subject: |
|
|
That game is this? Not sure if you mentioned it in the thread, i didn't see it.
_________________
|
|
Back to top |
|
 |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sun May 26, 2013 4:14 am Post subject: |
|
|
The game is "Never****", a new mmorpg
Some more information about my process of finding the offsets and the pointer
I always do the "4 byte" scan
Adress which contains my value: 3157FE8C
What access-) The value of the pointer needed... 3157FE98 mov eax,[edx-0C] -) Offset -c
Hexscan 3157FE98 -) 372EB0D8
What access-) The value of the pointer needed... 372EB0CC cmp dword ptr [eax+0C],00 -) Offset c
Hexscan 372EB0CC -) 254A764C
What access-) The value of the pointer needed... 254A7648 mov eax,[ecx+edx*4] -) Offset 4
Hexscan 254A7648 -) 2CA3F4AC
What access-) The value of the pointer needed... 2CA3F4AC cmp dword ptr [eax],00 -) Offset 0
Hexscan 2CA3F4AC -) 22EC0F28
What access-) The value of the pointer needed... 22EC0C98 mov eax,[edx+00000290] -) Offset 290
Hexscan 22EC0C98 -) 2C16855C
What access-) The value of the pointer needed... 2C168460 cmp dword ptr [eax+000000FC],00 -) Offset fc
Hexscan 2C168460 -) 025E3B10 [GameClient.exe+2233B10] Shown as static (green) in cheatengine
What access 025E3B10 mov eax,[eax*4+GameClient.exe+2233560]
Eax contains 2C168460
Pointer: GameClient.exe+2233B10 fc 290 0 4 c -c points to my original adress 3157FE8C
When I repeat the process, everything is pretty much the same except my base adress changes. its always GameClient.exe+2233XXX, with the same pointers, the same function and the baseadress is always green in cheatengine
I hope someone can find what I am doing wrong here, I cant figure it out
Last edited by Dragonelf on Sun May 26, 2013 5:34 am; edited 1 time in total |
|
Back to top |
|
 |
Gniarf Grandmaster Cheater Supreme
Reputation: 43
Joined: 12 Mar 2012 Posts: 1285
|
Posted: Sun May 26, 2013 5:03 am Post subject: |
|
|
Dragonelf wrote: | The game is "********", a new mmorpg | Crap, you took the bait: http://forum.cheatengine.org/faq.php#0
Dragonelf wrote: | Some more information about my process of finding the offsets and the pointer
I always do the "4 byte" scan
Adress which contains my value: 3157FE8C
What access-) The value of the pointer needed... 3157FE98 mov eax,[edx-0C] -) Offset -c | Ah yes, negative offsets, hadn't even though about this. The pointerscanner will not work with negative offsets, instead you should pointerscan for 3157FE8C+C=3157FE98, specifying a terminal offset of 0 instead of -c. That being said, given your base pointer (see below), it would be pointless.
Dragonelf wrote: | What access-) The value of the pointer needed... 2C168460 cmp dword ptr [eax+000000FC],00 -) Offset fc
Hexscan 2C168460 -) 025E3B10 [GameClient.exe+2233B10] Shown as static (green) in cheatengine
What access 025E3B10 mov eax,[eax*4+GameClient.exe+2233560]
Eax contains 2C168460 | Yup, exactly eax.qbyte said: array access. What you should do is to find where the eax (array_index) from eax*4 comes from, then make a lua script that will make GameClient.exe+2233560+array_index*4 your base pointer.
|
|
Back to top |
|
 |
Dragonelf How do I cheat?
Reputation: 0
Joined: 25 May 2013 Posts: 6
|
Posted: Sun May 26, 2013 5:33 am Post subject: |
|
|
Gniarf wrote: | Dragonelf wrote: | The game is "********", a new mmorpg | Crap, you took the bait: cant post urls
Dragonelf wrote: | Some more information about my process of finding the offsets and the pointer
I always do the "4 byte" scan
Adress which contains my value: 3157FE8C
What access-) The value of the pointer needed... 3157FE98 mov eax,[edx-0C] -) Offset -c | Ah yes, negative offsets, hadn't even though about this. The pointerscanner will not work with negative offsets, instead you should pointerscan for 3157FE8C+C=3157FE98, specifying a terminal offset of 0 instead of -c. That being said, given your base pointer (see below), it would be pointless.
Dragonelf wrote: | What access-) The value of the pointer needed... 2C168460 cmp dword ptr [eax+000000FC],00 -) Offset fc
Hexscan 2C168460 -) 025E3B10 [GameClient.exe+2233B10] Shown as static (green) in cheatengine
What access 025E3B10 mov eax,[eax*4+GameClient.exe+2233560]
Eax contains 2C168460 | Yup, exactly eax.qbyte said: array access. What you should do is to find where the eax (array_index) from eax*4 comes from, then make a lua script that will make GameClient.exe+2233560+array_index*4 your base pointer. |
This sounds very interesting, I will have a look at it, thank you
|
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
|
|