vsantiago113 / ReadWriteMemory

This module can read and write to the memory of any process on Windows.
MIT License
148 stars 36 forks source link

New method readString / writeString #11

Closed MillhioreBT closed 3 years ago

MillhioreBT commented 3 years ago

What do you think of these two new methods for this great module, many probably need it for some purpose in which they need to write and read text from memory

Bluecoreg commented 3 years ago

Good work, thank you for sharing

wkingnet commented 3 years ago

thanks. But Unfortunately, this project cannot read float and UTF8 strings, and the author does not update anymore, I have to give up using...

MillhioreBT commented 3 years ago

thanks. But Unfortunately, this project cannot read float and UTF8 strings, and the author does not update anymore, I have to give up using...

Hi, in theory this should read UTF-8, ASCII perfectly, anyway you are free to improve the function for your specific purpose If you want to show an example of what you want to do we can help.

Bluecoreg commented 3 years ago

Treat floats as ints and do the conversion in python. Likewise, treat UTF-8 as a list of bytes and do the conversion in python.

wkingnet commented 3 years ago

thanks. But Unfortunately, this project cannot read float and UTF8 strings, and the author does not update anymore, I have to give up using...

Hi, in theory this should read UTF-8, ASCII perfectly, anyway you are free to improve the function for your specific purpose If you want to show an example of what you want to do we can help.

Thanks for the help of MillhioreBT and Bluecoreg. I try to readmemory a traditional Chinese game from Taiwan. I want to read float and UTF16 Chinese.

from ReadWriteMemory import ReadWriteMemory

rwm = ReadWriteMemory()
process = rwm.get_process_by_name('gvo.exe')
process.open()
pos_x = process.get_pointer(0x0119E16C)
pos_x = process.read(pos_x)
print(float(pos_x))
server_name = process.get_pointer(0x0119E024, offsets=[0x0])
print(hex(server_name))
server_name = process.read(server_name)
print(server_name)
process.close()

Console display:
-->1158875914.0
-->0x5d7af40
-->2538102397

And here is snapshot in CheatEngine Memory Viewer:

QQ截图20210724113639

2

pos_x( 0x0119E16C ) I want to get float, server_name( [0x0119E024]+0=0x05D7AF40 ) I want to get UTF16 string. But ReadWriteMemory can only get integer values, and there is no parameter to choose which data type to get, so I can only convert it myself?

Bluecoreg commented 3 years ago

UTF16 Chinese might be a little tricky. I don't know how much support python has for it. You'll have to look around for some converters.

As for floats you can just treat it as if you are reading an int, Assuming the game is 32bit, both floats and ints will be 4 bytes long. (May be the case for 64bit, but not guaranteed) So for reading, use read int, and then use python to convert the int into a float.

Now if you are trying to write a float, that's a little more tricky. You'll need to convert your python float into an array of 4 bytes and use write string. A string is just an array of bytes, so since you need to write an array of bytes you can use write string in this case.

Bluecoreg commented 3 years ago

Actually, now that I'm checking the project I needed this for I realized I never ended up using this one. Didn't work for what I needed it for. You might want to use Pymem instead. https://github.com/srounet/Pymem/

It even has a read_float function.

wkingnet commented 3 years ago

Actually, now that I'm checking the project I needed this for I realized I never ended up using this one. Didn't work for what I needed it for. You might want to use Pymem instead. https://github.com/srounet/Pymem/

It even has a read_float function.

Yes, I just noticed the pymem project, it is more complete than this project. I think I will use pymem instead of ReadWriteMemory. Thank you again for your help

Just now, I successfully read UTF16 Traditional Chinese with Pymem

if data_type == "unicode":
    temp = pm.read_bytes(address, 2)
    result = ""
    while temp != b'\x00\x00':
        result = result + temp.decode('utf-16')
        address += 2
        temp = pm.read_bytes(address, 2)
    print(result)
vsantiago113 commented 3 years ago

Thank you for contributing the two new methods for reading and writing strings.

robbyz512 commented 2 years ago

@MillhioreBT What do you think of these two new methods for this great module, many probably need it for some purpose in which they need to write and read text from memory

it's a lifesaver for me cause I hate writing C lol, I can do a looot of new features for my external game utilities now much easier. Thanks!