Giter Site home page Giter Site logo

cameronredmore / memory-deck Goto Github PK

View Code? Open in Web Editor NEW
34.0 5.0 10.0 819 KB

A Decky Loader plugin that allows scanning and editing of memory values.

License: GNU General Public License v3.0

Dockerfile 0.12% Shell 1.75% Python 27.38% JavaScript 0.23% TypeScript 4.29% Makefile 0.68% C 60.10% M4 1.13% Roff 4.31%

memory-deck's Introduction

Memory Deck

A scanmem wrapper in a decky-loader plugin.

This plugin allows you to scan for, and edit values in memory. Akin to something like Cheat Engine.

Memory Deck

Warning

This plugin directly manipulates memory. This can cause crashes, and other issues. Use at your own risk.

Code Warning

This plugin is a mess. I don't like C, I don't like Python and I don't like React.

I openly welcome any PRs to clean up the code, refactor, and just make this... not so garbage!

How to Use

Selecting a Process

When first opening Memory Deck, you will need to select a process. The plugin will automatically load a list of processes for you when opened.

If you need to reload the process list for any reason, simply press the Reload Process List button.

You will need to do this after closing / opening processes after Memory Deck has been opened.

Changing Process

After a process has been selected, you can change it by pressing the Choose Another Process button.

Finding a Value

To find a value in memory, a number of searches need to be performed in sequence. Each search should ideally change something to narrow the search down further and further, until eventually hopefully reaching just a single value (or at least a small enough list to manually check).

Search Operators

When searching for a value, you can use the following operators:

Operator Description
== The value in memory exactly matches the search value.
!= The value in memory does not match the search value.
> The value in memory is greater than the search value.
< The value in memory is less than the search value.
Not Changed The value in memory has not changed since the last search.
Changed The value in memory has changed since the last search.
Increased The value in memory has increased since the last search. 
Decreased The value in memory has decreased since the last search. 
Increased By The value in memory has increased by the search value since the last search. 
Decreased By The value in memory has decreased by the search value since the last search. 
Any Search for all values in memory. Only really useful for an "Unknown Initial Value"

Your first search should probably be a == search, as this will find all values that match the search value. But you may potentially want to use the Any search if you don't know what the initial value is.

The != operator could also technically be used here. But it's far more likely that you'll want to use Any.

All other searches make use of the previous search results, so you will need to perform a search before you can use them.

Running the Search

Once you have entered your search value and operator. Press the Search button to run the search.

This will ask the backend to run the scan you've selected.

Once the process is complete, you will be able to see the number of matches found at the bottom of the QAM.

Once values have been found, do something in-game that will change the value you're searching for. Then run another search. If you know the new value, you can use the == operator again. If you don't know the new value, you can use the other operators depending on the information you do know about the value.

Keep repeating searches until there are less than 10 matches left.

Editing Values

Once there are less than 10 matches, a new section will appear at the bottom of the QAM.

This section will list every match address, with a Change button.

You can enter a new value with the New Value field, and press the Change button to change the value at that address.

Resetting a Scan

If you want to reset the scan, you can press the Reset Scan button at the top of the page. This will reset the scan and empty out all known values. This allows you to then start another initial scan.

Installation

Install Decky Loader using their instructions. You should then be able to find Memory Deck in the Decky store!

Future Plans

  • Add range operator support

  • Add support for searching for strings

  • Allow saving of found addresses / game to enable easier editing of values later

  • Nicer found value list

  • Show variable type in found value list

License

This project is licensed under the GPL-3.0 License - see the LICENSE file for details.

This project uses libscanmem and includes source code for scanmem and libscanmem, licensed under the GPL-3.0 License and the LGPL-3.0 License respectively.

A copy of the licenses for these projects can be found under the backend/scanmem folder. And can be found in the bin folder of the plugin once compiled.

This project also uses a modified version of a scanmem Python bindings library. The source for this is located under scanmem.py. This library is also licensed under LGPL-3.0.

memory-deck's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

memory-deck's Issues

Search results never populate/plugin freezing/undetected processes

Plugin often refuses to produce search results or has no processes detected. Reloading the plugin resolves the issue temporarily.

I'm using the latest version of steam deck os, decky loader, and the plugin.

After about 4 times of searching values the search either displays the loading symbol and never produces results or it just says zero and never updates even if you reset the search.

Also sometimes it will not display the process even though the game is running.

Reloading/reinstalling the plugin fixes it temporarily but the bug reoccurs frequently.

I have yet to get the plugin to correctly detect or change a single desired value.

I tried it for several games so far and have had no luck with any of them.

The most recent two were resident evil 4 (2008)

And blasphemous.

Resident evil I just tried doing pistol ammo. The values when I didn't experience the bugs I described above narrowed down but after I got to two values I edited them and they never were reflected in game as being changed.

For blasphemous I had a similar experience.
Using increased search option after searching an initial value narrowed results untill they were lower then 10 in number. I edited all the values and the change was never reflected.
For this game you get a number of points for upgrades and I was trying to edit them to a high number to unlock all the attacks and specials.

Other games I've tried have been devil may cry series and bioshock series. I also tried the borderlands games. Had no success with anything so far. I really would like this to work as using cheat engine on Linux requires some hoop jumping I don't want to do.

I have also tried uninstalling and reinstalling decky loader and the plugin it's self. No luck.

Exiting quick access menu resets search

It was working fine until all of a sudden after I run a search then go back into the game to for example change the number of items in my inventory, when I go back to narrow my search by entering the new value I find that my search has been reset.

[feature request] add ability to freeze addresses

Very often it happens that values cannot be edited permanently. Freezing values or addresses could cause this problem that the value cannot be reset. If you freeze a address the address will not change until you unfreeze it. The value does change but memorydeck will restore the value to its frozen state every few milliseconds.

Search type "string"

How to search string type? Some games save in strings numerical values(like the one i was trying to edit). Scanmen can search it, because GameConqueror, another scanmen wrapper have that feature.

Allow listing found addresses when results list is larger than 10.

It is not possible to find the health bar in Narita Boy (GOG), because any search returns 11 results. No matter how many times the health goes up or down, the number of matches never goes below 11.

This is true no matter what parameters are used in the search, or what "Search Type" is set to.

[feature request] Create wiki pages

  • How the plugin works
    - [ ] List dependencies
  • Instructions on how to run main.py manually for debugging purposes, potentially enable that functionality by default

No processes detected

It just says Process Selection then the Reload Process List button. There's no option to select a Process no matter what I loas

Float Search Doesn't Work

I have tried in multiple games to search for floats.

When float32 is selected, no search is performed at all and the number of matches is blank instead of 0.
When float64 is selected, it seems like no search is performed, but the matches found text gets a random new line in it and the matches returned can't be seen.

[feature request] add the ability to send signals to attached program

(would require import signal, but it's an inbuilt package so no worries)

os.kill(pid, signal) can send a signal (signal.SIGSTOP for example) to any application. (ignore the name, it can do things other than kill)

A list of valid signals to select from can be generated with signal.valid_signals() (it produces a set of Signals, which have a value which is the number of the signal (19, 20, etc), a name which is the signal name (SIGCONT, SIGKILL, etc).
The set also includes a bunch of ints (on my PC, 35-63) that do not have any associated function, these should probably just be skipped. (64 does have a use on my PC)

for reference, all of these work (where 99 is the PID): os.kill(99, signal.SIGSTOP), os.kill(99, signal.SIGSTOP.value) and os.kill(99, 19).
these will NOT work: os.kill(99, "SIGSTOP") and os.kill(99, signal.SIGSTOP.name)

I would think a dropdown menu with every valid signal (by name, not number) and a "send" button next to it would be good.

I considered making this a seperate plugin, but it's not very complex and also fits pretty well into the functionality of this plugin.
I will try work on a PR myself (and may fail, we'll see) if you'd like, but I would prefer to hear some feedback (or if you'd like to do it) before I try.

Quick example code for getting a dictionary of signals:

import signal

valid_signals = signal.valid_signals()  # returns a set of objects, not particularly useful until parsed as needed

signals = {}
for sig in valid_signals:
    if hasattr(sig, "name") and hasattr(sig, "value"): # makes sure to ignore useless signals
        signals[sig.name] = sig.value
print(signals) # prints {'SIGHUP': 1, 'SIGINT': 2, 'SIGQUIT': 3...

Example code for pausing an application then instantly starting it again

import signal
import os

pid = 26724  # some int
os.kill(pid, signal.SIGSTOP)  # pause application
os.kill(pid, 18)  # continue application

code does not work from within flatpak vscode, probably due to sandboxing
works fine otherwise

Change multiple addresses at once

I'm trying to cheat Unepic.
I have 3 addresses, which I try to manipulate.
I think the game has some defense mechanism and if one address is changed, the player dies instantly.
(I'm hoping it's not a checksum somewhere)

Suggestion:
Make it possible to change the addresses in the plugin UI, but do not apply them.
Add an "Apply" button, which will (preferably)

  1. freeze the app
  2. apply the changes to all addresses
  3. unfreeze the app
    (or in some other means, apply the change to all addresses at once)

Thanks for the great work on the plugin!

[bug] straight up not working

im having a lot of issues on multiple games on the latest and second to latest updates
-it not showing any numbers at all
-sometimes doesnt even show the process
-too many processes to identify

Usage with Linux native games

Hi, first of all thank you for this plugin.
Here's my question (maybe I'm just dumb) but the plugin doesn't seems to be working with Linux native games. I have tried with Dead Cells and Slay the Spire both times there's a single process to choose (./dead cells or ./slaythespire) but when you try to find any kind of values it always returns 0 results (even if you do an unknown initial value search such that it should scan all values it still returns 0 results). Any way to get it working?

More legible process names

During the process selection we are provided a list of processes, but the names are quite long and contain the entire path, which makes it illegible and look quite junky.

Screenshot 2023-04-27 at 10 52 52 AM

RedDeadRedemption2

Hello
i first searched for the value of the ammount of dollars i had, there was a lot of matches, but then if i search a second time when the value has decreased, it doesn't find any value

Broken on steamos preview build

Since last week, when steam put out an update to the preview and beta channels several decky plugins lost functionality, memory deck included.
Nothing works at all, only an empty screen is pulled up upon attempting to run memory deck.

Build instructions in the README file

Hello,

I was in a hurry to get the new version with DFL, so I built it myself, and I thought that maybe other people might find this helpful too if it's available in the README.

Here's my way of doing it, some adjustments may be needed. If a Dockerfile is present for building the index.js, it might also simplify things for some folks.

# npm is required
> npm i -g rollup
# install dependencies with npm|yarn|pnpm
> yarn install
# build frontend
> yarn run build
---
# transfer to deck (optional)
> scp dist/index.js deck@DECK_LOCAL_IP:/home/deck/homebrew/plugins/memory-deck/dist/index.js

Obviously, this is only for the frontend part (as currently it's the only thing updated) but you should get the gist.

Memory deck plugin didn’t work properly.

As the title said. This plugin is basically a game memory editor to change the value.
I tried all three versions which is 1.0 , 1.1 and 1.2 but unfortunately no luck. Any help please?

[bug] Doesn't work with native linux port? Tropico 5 case

IMG_20221223_224859.jpg
Seems that with steamtinkerlaunch in the process list find Tropico.exe so can scan it without troubles (as launch the game differently compared to the screen above when it's just steam).
Instead launching with steam find just the path and not a process so the scan is not working.

Probably the issue is there as is not using a process the scan don't work. Maybe a check like if that path is a file or a folder can improve the situation. Why it's happening? I have no idea I don't know so much C++ to understand where it is the issue.

Continue from #7

Idea

Just an idea, would it ever be possible in the future for you to create a DLL injection plugin? The ability to quickly inject DLL's into running processes via the quick menu would be incredible. Great work by the way!

[bug] Having a lot of trouble with plugin

The only game I've gotten to return any values was Super Mario World via retroarch. There were two things I tried to get, the first was my X coordinates. I started with a search for any value and narrowed it down by moving back and forth, staying in the same place, etc. I finally got under 10 values but when I went down to edit it there were no values there. The second thing I tried was to change the time value. The level started with 300 on the clock, I paused and entered 300, it said how many values there were, I un paused let it count down 10, paused and chose decreased by 10. It then said 0 results. I reset and tried again, entered the time, gave me results, I unpaused, selected just decreased and 0 results. This happened no mater what I chose after the initial results. I also tried Terraria, native and Mario Odyssey, yuzu. Even when choosing Any when searching it returns 0 results. I looked it up and for yuzu on cheat engine you have to turn on mem_mapped. I am completely lost.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.