npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

memoryjs-fixed

v2.2.1

Published

Node add-on for memory reading and writing!

Downloads

10

Readme

memoryjs

Node add-on for memory reading and writing! (finally!) This is an edited version to fix integer overflows when reading and writing. It also introduces 2 new types: POINTER and INT64.

Features

  • open a process
  • close the process (handle)
  • list all open processes
  • list all modules associated with a process
  • find a certain module associated with a process
  • read memory
  • write to memory
  • pattern scanning

TODO:

  • nothing (suggestions welcome)

Install

This is a Node add-on (last tested to be working on v6.9.1) and therefore requires node-gyp to use.

You may also need to follow these steps.

npm install memoryjs

When using memoryjs, the target process should match the platform architecture of the Node version running. For example if you want to target a 64 bit process, you should try and use a 64 bit version of Node.

You also need to recompile the library and target the platform you want. Head to the memoryjs node module directory, open up a terminal and to run the compile scripts, type:

npm run build32 if you want to target 32 bit processes

npm run build64 if you want to target 64 bit processes

Usage

For a complete example, view index.js and example.js.

Initialise:

const memoryjs = require('memoryjs');
const processName = "csgo.exe";

Processes

Open a process (sync):

const processObject = memoryjs.openProcess(processName);

Open a process (async):

memoryjs.openProcess(processName, (error, processObject) => {

});

Get all processes (sync):

const processes = memoryjs.getProcesses();

Get all processes (async):

memoryjs.getProcesses((error, processes) => {

});

See the Documentation section of this README to see what a process object looks like.

Modules

Find a module (sync):

const module = memoryjs.findModule(moduleName, processId);

Find a module (async):

memoryjs.findModule(moduleName, processId, (error, module) => {

});

Get all modules (sync):

const modules = memoryjs.getModules(processId);

Get all modules (async):

memoryjs.getModules(processId, (error, modules) => {

});

See the Documentation section of this README to see what a module object looks like.

Memory

Read from memory (sync):

const value = memoryjs.readMemory(address, dataType);

Read from memory (async):

memoryjs.readMemory(address, dataType, (error, result) => {

});

Write to memory:

memoryjs.writeMemory(address, value, dataType);

See the Documentation section of this README to see what values dataType can be.

Pattern scanning

Pattern scanning (sync):

const offset = memoryjs.findPattern(moduleName, signature, signatureType, patternOffset, addressOffset);

Pattern scanning (async):

memoryjs.findPattern(moduleName, signature, signatureType, patternOffset, addressOffset, (error, offset) => {

})

Documentation

Process object:

{  cntThreads: 47,
   szExeFile: "csgo.exe",
   th32ProcessID: 10316,
   th32ParentProcessID: 7804,
   pcPriClassBase: 8,
   handle: 808,
   modBaseAddr: 1673789440 }

The handle and modBaseAddr properties are only available when opening a process and not when listing processes.

Module object:

{ modBaseAddr: 468123648,
  modBaseSize: 80302080,
  szExePath: 'c:\\program files (x86)\\steam\\steamapps\\common\\counter-strike global offensive\\csgo\\bin\\client.dll',
  szModule: 'client.dll',
  th32ProcessID: 10316 }

Data Type:

When using the write or read functions, the data type (dataType) parameter can either be a string and be one of the following:

"int", "int64", "dword", "long", "float", "double", "bool", "boolean", "ptr", "pointer", "str", "string", "vec3", "vector3", "vec4", "vector4"

or can reference constants from within the library:

memoryjs.INT, memoryjs.INT64 memoryjs.DWORD, memoryjs.LONG, memoryjs.FLOAT, memoryjs.DOUBLE, memoryjs.BOOL, memoryjs.BOOLEAN, memoryjs.PTR, memoryjs.POINTER, memoryjs.STR, memoryjs.STRING, memoryjs.VEC3, memoryjs.VECTOR3, memoryjs.VEC4, memoryjs.VECTOR4

This is simply used to denote the type of data being read or written.

Vector3 is a data structure of three floats:

const vector3 = { x: 0.0, y: 0.0, z: 0.0 };
memoryjs.writeMemory(address, vector3);

Vector4 is a data structure of four floats:

const vector4 = { w: 0.0, x: 0.0, y: 0.0, z: 0.0 };
memoryjs.writeMemory(address, vector4);

Strings:

You can use this library to read either a "string", or "char*" and to write a string.

In both cases you want to get the address of the char array:

std::string str1 = "hello";
std::cout << "Address: 0x" << hex << (DWORD) str1.c_str() << dec << std::endl;

char* str2 = "hello";
std::cout << "Address: 0x" << hex << (DWORD) str2 << dec << std::endl;

From here you can simply use this address to write and read memory.

There is one caveat when reading a string in memory however, due to the fact that the library does not know how long the string is, it will continue reading until it finds the first null-terminator. To prevent an infinite loop, it will stop reading if it has not found a null-terminator after 1 million characters.

One way to bypass this limitation in the future would be to allow a parameter to let users set the maximum character count.

Signature Type:

When pattern scanning, flags need to be raised for the signature types. The signature type parameter needs to be one of the following:

0x0 or memoryjs.NORMAL which denotes a normal signature.

0x1 or memoryjs.READ which will read the memory at the address.

0x2 or memoryjs.SUBSTRACT which will subtract the image base from the address.

To raise multiple flags, use the bitwise OR operator: memoryjs.READ | memoryjs.SUBTRACT.


openProcess(processName[, callback])

opens a process to be able to read from and write to it

  • processName (string) - the name of the process to open
  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • processObject (JSON [process object]) - information about the process

returns process object (JSON) either directly or via the callback


closeProcess()

closes the handle on the opened process


getProcesses([callback])

collects information about all the running processes

  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • processes (array) - array of process object (JSON)

returns an array of process object (JSON) for all the running processes


findModule(moduleName, processId[, callback])

finds a module associated with a given process

  • moduleName (string) - the name of the module to find
  • processId (int) - the id of the process in which to find the module
  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • module (JSON [module object]) - information about the module

returns module object (JSON) either directly or via the callback


getModules(processId[, callback])

gets all modules associated with a given process

  • processId (int) - the id of the process in which to find the module
  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • modules (array) - array of module object (JSON)

returns an array of module object (JSON) for all the modules found


readMemory(address, dataType[, callback])

reads the memory at a given address

  • address (int) - the address in memory to read from
  • dataType (string) - the data type to read into (definitions can be found at the top of this section)
  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • value (any data type) - the value stored at the given address in memory

returns the value that has been read from memory


writeMemory(address, value, dataType[, callback])

writes to an address in memory

  • address (int) - the address in memory to write to
  • value (any data type) - the data type of value must be either number, string or boolean and is the value that will be written to the address in memory
  • dataType (string) the data type of the value (definitions can be found at the top of this section)
  • callback (function) - has one parameter:
    • err (string) - error message (empty if there were no errors)

findPattern(moduleName, signature, signatureType, patternOffset, addressOffset[, callback])

pattern scans memory to find an offset

  • moduleName (string) - the name of the module to pattern scan (module.szModule)
  • signature (string) - the actual signature mask (in the form A9 ? ? ? A3 ?)
  • signatureType (int) - flags for signature types (definitions can be found at the top of this section)
  • patternOffset (int) - offset will be added to the address (before reading, if memoryjs.READ is raised)
  • addressOffset (int) - offset will be added to the address returned
  • callback (function) - has two parameters:
    • err (string) - error message (empty if there were no errors)
    • offset (int) - value of the offset found (will return -1 if the module was not found, -2 if the pattern found no address)

returns the value of the offset found