Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


The static base adress of my multi level pointer changes-why

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> General Gamehacking
View previous topic :: View next topic  
Author Message
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sat May 25, 2013 7:09 pm    Post subject: The static base adress of my multi level pointer changes-why Reply with quote

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
View user's profile Send private message
eax.qbyte
Advanced Cheater
Reputation: 3

Joined: 25 Jun 2011
Posts: 59
Location: CEDisasmView

PostPosted: Sat May 25, 2013 11:12 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail Yahoo Messenger
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sun May 26, 2013 12:03 am    Post subject: Reply with quote

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
View user's profile Send private message
eax.qbyte
Advanced Cheater
Reputation: 3

Joined: 25 Jun 2011
Posts: 59
Location: CEDisasmView

PostPosted: Sun May 26, 2013 12:31 am    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail Yahoo Messenger
Gniarf
Grandmaster Cheater Supreme
Reputation: 43

Joined: 12 Mar 2012
Posts: 1285

PostPosted: Sun May 26, 2013 12:38 am    Post subject: Reply with quote

@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
View user's profile Send private message
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sun May 26, 2013 1:05 am    Post subject: Reply with quote

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
View user's profile Send private message
Gniarf
Grandmaster Cheater Supreme
Reputation: 43

Joined: 12 Mar 2012
Posts: 1285

PostPosted: Sun May 26, 2013 1:17 am    Post subject: Reply with quote

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
View user's profile Send private message
eax.qbyte
Advanced Cheater
Reputation: 3

Joined: 25 Jun 2011
Posts: 59
Location: CEDisasmView

PostPosted: Sun May 26, 2013 2:11 am    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail Yahoo Messenger
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sun May 26, 2013 3:41 am    Post subject: Reply with quote

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
View user's profile Send private message
Gniarf
Grandmaster Cheater Supreme
Reputation: 43

Joined: 12 Mar 2012
Posts: 1285

PostPosted: Sun May 26, 2013 3:54 am    Post subject: Reply with quote

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
View user's profile Send private message
Pingo
Grandmaster Cheater
Reputation: 8

Joined: 12 Jul 2007
Posts: 571

PostPosted: Sun May 26, 2013 4:08 am    Post subject: Reply with quote

That game is this? Not sure if you mentioned it in the thread, i didn't see it.
_________________
Back to top
View user's profile Send private message
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sun May 26, 2013 4:14 am    Post subject: Reply with quote

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
View user's profile Send private message
Gniarf
Grandmaster Cheater Supreme
Reputation: 43

Joined: 12 Mar 2012
Posts: 1285

PostPosted: Sun May 26, 2013 5:03 am    Post subject: Reply with quote

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
View user's profile Send private message
Dragonelf
How do I cheat?
Reputation: 0

Joined: 25 May 2013
Posts: 6

PostPosted: Sun May 26, 2013 5:33 am    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> General Gamehacking All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites