hrydgard / ppsspp

A PSP emulator for Android, Windows, Mac and Linux, written in C++. Want to contribute? Join us on Discord at https://discord.gg/5NJB6dD or just send pull requests / issues. For discussion use the forums at forums.ppsspp.org.
https://www.ppsspp.org
Other
11.36k stars 2.18k forks source link

Cheat Engine on PPSSPPx64 using PSP memory base address as pointer but there's 1 problem... #18876

Closed blitznoz closed 8 months ago

blitznoz commented 8 months ago

Platform

Windows

Compiler and build tool versions

v1.17.1

Operating system version

windows 10

Build commands used

GTpsp x64 (Gran Turismo) cwcheat address: 0x0080EA00 C.E address + base psp address: image_2024-02-20_092111720

Click on "Debug" to drop-down list and click "Copy PSP memory base address" (8 Bytes) search that PSP base memory value to get it (make sure its hexadecimal) thats your psp base memory value. i don't have a script that can add new address with pointer.

disclaimer im not that good of using C.E terms of finding cwcheat address to C.E.

What happens

How i find Cr. is to just find like normal and find its address i use hex calculator to find offset value: PSP Base memory address - C.E address = Offset 11428AA0000 - 11431AB6400 = -9016400 (the - doesn't matter) "usually find lowest address value for it since there's duplicate address"

Real problem is hard to convert cwcheat to C.E unlike PCSX2 1.7/Duckstation you can use PS2/1 base offset for ps2 Decrypted address (CB) is 20957450 to ps2 offset address simply remove x20 which is 957450 for ps1 Gameshark address is 801D1568 to ps1 offset address remove x80 is 1D1568

PSP doesn't have exact format however... i only can use ref address to another address which is cwcheat address to calculate distance this is hard way to get correct psp offset. Too much detail how i find offset value for C.E just by calculate address distance anything that had x20 or xD0 or x21 its not a real cwcheat address 0x0080EA00 only 6 input 80EA00... i don't know much of it

Oh yeah https://github.com/LunaMoo/PPSSPP-Cheat-Table basically useless at this point as of today 022024 (MM/DD/YY) he still doesn't update much often nor find/found a pointer address... This only PPSSPPx64 the non x64 program doesn't give you base address value in C.E as i trying find for non x64

PPSSPP version affected

ppssppx64

Last working version

No response

Checklist

LunaMoo commented 8 months ago

My table is not useless, 32bit windows is just obsolete since at least few years and I don't bother with it nor never will. (Edit: but thanks for making me check if it still works, it does, but I did forgot to update the line the conversion script takes as an address for it's calculation when I updated it last time, which is now fixed)

Also what you call hard is basic math that can be done on windows calc, you should not need scripts for it, my table has it just because it can, not because it's something hard, it just have one variable which is now feeded by PPSSPP without having to even check the log, if you can't add and subtract, how can you create cheats? Let it sink.

PPSSPP functions in a much more modern way, it's useless to compare to things like pcsx2.

Edit: Just looked at your example and you either found different address from the address that's being used in your cheat or in this game PSP memory allocation isn't perfect yet as you get two completely different addresses, also don't undestand why you're subtracting address you found from base address instead the other way around which would give you proper address directly. Also the address that you get by that is PSP memory address, for CWCheat address you have to subtract 0x08800000 from the result since CWCheat takes 0 as user memory(which starts at 0x08800000).

PSP doesn't have exact format however... i only can use ref address to another address which is cwcheat address to calculate distance

That doesn't have any sense. You're probably talking about the fact PSP is similary to PPSSPP a much more modern device than what you got used to with ancient consoles and have a newbie mentality of thinking you need to use pointer code types to deal with dynamic memory allocation which is wrong and an awful way of doing things when you can just use PPSSPP disassembly, check what game code is using the value you found and modify the game code directly, even if you would desire to use pointer code types(which are dumb and not recommended), you'd have it very easy to just look at the game code to see what's offset it's using, there's really nothing to guess or have hard time about.

The only reason old PSP cheats might be using pointer type codes is because people were awfuly uneducated back then and didn't had access to tools or knowledge available today, internet wasn't that wide and open back then either. Take any modern cheat to PSP game or any other modern platform like PC and it'll pretty much always be a custom script injected into game memory, pretty much nobody uses pointers for cheating nowadays as it's not even easier.

blitznoz commented 8 months ago

My table is not useless, 32bit windows is just obsolete since at least few years and I don't bother with it nor never will. (Edit: but thanks for making me check if it still works, it does, but I did forgot to update the line the conversion script takes as an address for it's calculation when I updated it last time, which is now fixed)

Also what you call hard is basic math that can be done on windows calc, you should not need scripts for it, my table has it just because it can, not because it's something hard, it just have one variable which is now feeded by PPSSPP without having to even check the log, if you can't add and subtract, how can you create cheats? Let it sink.

PPSSPP functions in a much more modern way, it's useless to compare to things like pcsx2.

Edit: Just looked at your example and you either found different address from the address that's being used in your cheat or in this game PSP memory allocation isn't perfect yet as you get two completely different addresses, also don't undestand why you're subtracting address you found from base address instead the other way around which would give you proper address directly. Also the address that you get by that is PSP memory address, for CWCheat address you have to subtract 0x08800000 from the result since CWCheat takes 0 as user memory(which starts at 0x08800000).

PSP doesn't have exact format however... i only can use ref address to another address which is cwcheat address to calculate distance

That doesn't have any sense. You're probably talking about the fact PSP is similary to PPSSPP a much more modern device than what you got used to with ancient consoles and have a newbie mentality of thinking you need to use pointer code types to deal with dynamic memory allocation which is wrong and an awful way of doing things when you can just use PPSSPP disassembly, check what game code is using the value you found and modify the game code directly, even if you would desire to use pointer code types(which are dumb and not recommended), you'd have it very easy to just look at the game code to see what's offset it's using, there's really nothing to guess or have hard time about.

The only reason old PSP cheats might be using pointer type codes is because people were awfuly uneducated back then and didn't had access to tools or knowledge available today, internet wasn't that wide and open back then either. Take any modern cheat to PSP game or any other modern platform like PC and it'll pretty much always be a custom script injected into game memory, pretty much nobody uses pointers for cheating nowadays as it's not even easier.

Got it understand. Yes i did use old cwcheat address as i compare to mine let 's say i what i use cwcheat address 0x0080EA00 + 0x08800000 = 900EA00 (which i figure it out much later before you post) didn't match my current offset had to use my RAM file to get a address which is 0x00816400 i calculate + 0x08800000 = 9016400.

At least no more using hard way method to get offset & trust me don't use that calculation method that i used had to use 4 or 5 tabs of hex calculator to get exact offset (this works other kinds of cheat regardless just need to match current cheat type that doesn't use value type like action replay MAX and had to be Decrypted, region or not just need a ref address that had same cheats like Money instance & find a distance value that other region doesn't have, it will matched the distance value however there's a catch reverse engineering address something like GT4 autopilot won't work that way did tried in the past didn't work "not sure what the term is but you may or may not understand...".

Man... not sure how cwcheat can separate between using psp memory address on actual PSP & user memory address on Emulator can't just use ram file address - cwcheat psp memory address to get a conversion value.

You're welcome to spread the news now x64 can use pointer w/o ever re-calculate address need just a proper calculation for finding the offset gonna learn more about it & thanks for updating the script gonna make use of it

This really my self-leaning experience can't get exact details of it

blitznoz commented 8 months ago

image Always copy & paste the pointer (that is highlighted with no name of it) to add new offset

Don't have a script to add new address that includes w/ pointer with 0 offset

LunaMoo commented 8 months ago

I'm not going to understand half of what you wrote, you're very UNCLEAR(to say it lightly) in your terminology and what you're actually doing to reach some weird problems and what offsets are you even talking about, so I'll just explain what should be clear before doing anything.

As you can see in PPSSPP memory viewer, PSP ram is divided to:

0x00010000 scratchpad
0x04000000 VRAM
0x08800000 User memory
0x08804000 Default load address
0x88000000 Kernel memory

For cheats and general game modding etc. you're interested in "User memory", more specifically in the 24mb(0x1800000) following User memory(0x08800000), or 56mb(0x3800000) in case of HD remasters and some homebrew. Which means the memory range you're interested in is from 0x08800000 to 0x0A000000(or 0x0C000000 in case of HD remasters & some homebrew).

Cheat Engine by default is unable to look through emulated PSP memory inside PPSSPP and you need to enable MEM_MAPPED within CE(edit->settings->scan settings).

Cheat Engine is also unable to edit values you find in mapped memory directly under some operating systems due to bug in those and require a workaround which Dark Byte, the creator of the CE provided, my cheat table includes that workaround.



Anyway not using any scripts from my cheat table and just using PSP base memory address provided by PPSSPP new option you get 0x0 address of PSP memory so for example assuming:

000002157ffe0000

is the number PPSSPP gives you for PSP memory base address

PSP memory base address + User memory = user memory start address (a sidenote here - my cheat table shows that as start of PSP memory to keep it simple and stop people from searching through the rest of PSP memory)

0x000002157ffe0000 + 0x08800000 = 0x00000215887e0000

user memory start address + amount of ram available for games(in this example standard 24mb) = user memory end address

0x00000215887e0000 + 0x01800000 = 0x0000021589fe0000



So you'd have to limit the search to between 0x00000215887e0000 and 0x0000021589fe0000 and if you find anything, just take the address of the thing you found and reduce it by user memory start address(in this example 0x00000215887e0000) and it will give you CWCheat address or take the address and reduce it by PSP memory base address(in this example 0x000002157ffe0000) to get an address to use in PPSSPP disassembly.

There's really no weird offsets anywhere here, just need to remember the PSP memory base address will be different every time you run PPSSPP and understand how PSP memory is divided and what part of it is interesting for your use case. That base memory aside from whatever you found is trully the only variable in the very simple equation as shown above, there's at least a few lenghty posts on forums about this and I made cheat table to make whatever I could automatic because those questions were common and nobody wanted to read a wall of text which makes very simple thing appear scary and complicated.