Jump to content

Memory Reading


Recommended Posts

First, I'll give a brief explanation of the program I'm coding.

Basically, it clicks in one spot and then in another spot to refresh a list. When an address on that list contains the value 1082002, then check if another address contains the value < 1335. If so, then buy.

So, I found this:

;=================================================================================================
; Function:   _MemoryRead($iv_Address, $ah_Handle(, $sv_Type))
; Description:  Reads the value located in the memory address specified.
; Parameter(s):  $iv_Address - The memory address you want to read from. It must be in hex
;                         format (0x00000000).
;              $ah_Handle - An array containing the Dll handle and the handle of the open
;                        process as returned by _MemoryOpen().
;              $sv_Type - (optional) The "Type" of value you intend to read.  This is set to
;                       'dword'(32bit(4byte) signed integer) by default.  See the help file
;                       for DllStructCreate for all types.
;                       An example: If you want to read a word that is 15 characters in
;                       length, you would use 'char[16]'.
; Requirement(s):   The $ah_Handle returned from _MemoryOpen.
; Return Value(s):  On Success - Returns the value located at the specified address.
;              On Failure - Returns 0
;              @Error - 0 = No error.
;                     1 = Invalid $ah_Handle.
;                     2 = $sv_Type was not a string.
;                     3 = $sv_Type is an unknown data type.
;                     4 = Failed to allocate the memory needed for the DllStructure.
;                     5 = Error allocating memory for $sv_Type.
;                     6 = Failed to read from the specified process.
; Author(s):        Nomad
; Note(s):    Values returned are in Decimal format, unless specified as a 'char' type, then
;              they are returned in ASCII format.  Also note that size ('char[size]') for all
;              'char' types should be 1 greater than the actual size.
;=================================================================================================
Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')
    
    If Not IsArray($ah_Handle) Then
        SetError(1)
        Return 0
    EndIf
    
    Local $v_Buffer = DllStructCreate($sv_Type)
    
    If @Error Then
        SetError(@Error + 1)
        Return 0
    EndIf
    
    DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    
    If Not @Error Then
        Local $v_Value = DllStructGetData($v_Buffer, 1)
        Return $v_Value
    Else
        SetError(6)
        Return 0
    EndIf
    
EndFunc

What is $ah_Handle, or how do I find it?

I also have another question, for the Buy function I want to do at the end, is it possible to send a packet to the game? If not, I can just click here, then here, and it'll buy like that, but packets would be faster, and I need to make this as fast as possible. Thanks.

Edited by Chuuy
Link to comment
Share on other sites

Alright, I was thinking completely differently then I should've been. So now I have this.

#include "NomadMemory.au3"

_MemoryOpen($iv_Pid = , $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1) ; Will find the PID later


Do Refresh()
    Until _MemoryRead($iv_Address = , $ah_Handle, $sv_Type = 'dword') = 1082002 ; Will find the address later

If _MemoryRead($iv_Address = , $ah_Handle, $sv_Type = 'dword') < 1355 ; Will find the address later
    Then Buy()
    
Func Refresh()
    MouseClick ( "main" [, x, y [, 1 [, 0 ]]] ) ; Will find mouse xy coords later
    MouseClick ( "main" [, x, y [, 1 [, 0 ]]] ) ; Will find mouse xy coords later
    Return
EndFunc

Func Buy()
    MouseClick ( "main" [, x, y [, 1 [, 0 ]]] ) ; Will find mouse xy coords later
    MouseClick ( "main" [, x, y [, 1 [, 0 ]]] ) ; Will find mouse xy coords later
    Return
EndFunc

It has been a while since I last used AutoIt, so I'm not sure if this would do what I want it to do.

Edited by Chuuy
Link to comment
Share on other sites

Man I keep noticing that I'm doing a lot of syntax errors.

Here's the code I have now, I think this is correct:

#include "NomadMemory.au3"

Dim $Item, $Price

_MemoryOpen($iv_Pid =, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
_MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item
_MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price

Do Refresh()
Until $Item = 1082002

If $Price < 1355
    Then Buy()
EndIf

Func Refresh()
    MouseClick("main"[, x, y[, 1[, 0]]])
    MouseClick("main"[, x, y[, 1[, 0]]])
    Return
EndFunc   ;==>Refresh

Func Buy()
    MouseClick("main"[, x, y[, 1[, 0]]])
    MouseClick("main"[, x, y[, 1[, 0]]])
    Return
EndFunc   ;==>Buy

EDIT: Declared variables. =0

Edited by Chuuy
Link to comment
Share on other sites

I'm completely confusing myself with which loops I should use when.

Maybe someone can tell me what type of loop to use if I want to process these statements this way:

Refresh() until $Item = 1082002, if not restart Refresh(). Check if $Price < 1355, if not restart Refresh(), if so then Buy(). Then restart at Refresh().

I know I need to include these functions:

_MemoryOpen($iv_Pid =, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1) ; I'm guessing this goes at the top and only needs to be run once?
_MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item ; Reads the value at the address and sets it as $Item, I want it to stop if $Item = 1082002, and then to check if &Price < 1355.
_MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price ; Reads the value at the address and sets it as $Price, I want it to stop if $Price < 1355, and I want it to Buy() if true.  Then I want the code to start again at Refresh().oÝ÷ Ù8^±æ«zlºw-ìjëh×6Func Refresh()
    MouseClick("main"[, x, y[, 1[, 0]]])
    MouseClick("main"[, x, y[, 1[, 0]]])
    Return
EndFunc   ;==>Refresh

Func Buy()
    MouseClick("main"[, x, y[, 1[, 0]]])
    MouseClick("main"[, x, y[, 1[, 0]]])
    Return
EndFunc   ;==>Buy
Link to comment
Share on other sites

Before you go ahead, you should test your values.

MsgBox (0, "", _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item)

MsgBox (0, "", _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price)

Put these messages, are you reading the correct stuff ?

Also, your syntax is horribly wrong :-(

Edited by Inverted
Link to comment
Share on other sites

Before you go ahead, you should test your values.

MsgBox (0, "", _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item)

MsgBox (0, "", _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price)

Put these messages, are you reading the correct stuff ?

Also, your syntax is horribly wrong :-(

Well, I haven't added in the address to read for yet, I want to write the code first, then I'll load up Cheat Engine/Ollydbg and add in the addresses, the PID, and the mouse xy coordinates.

Can you tell me what's wrong with my syntax. =0 I'm really struggling with this.

Edited by Chuuy
Link to comment
Share on other sites

Well it's me again. I revised my code, and I believe this is correct syntax. Please check it over, thanks. :D

#include <NomadMemory.au3>

Dim $Item, $Price

_MemoryOpen($iv_Pid =, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1) ; Will set PID later

While 1
    MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item ; Will set address later
    _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price ; Will set address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
        MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    EndIf
WEnd
Link to comment
Share on other sites

Well it's me again. I revised my code, and I believe this is correct syntax. Please check it over, thanks. :D

#include <NomadMemory.au3>

Dim $Item, $Price

_MemoryOpen($iv_Pid =, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1) ; Will set PID later

While 1
    MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Item ; Will set address later
    _MemoryRead($iv_Address =, $ah_Handle, $sv_Type = 'dword') = $Price ; Will set address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
        MouseClick("main"[, x, y[, 1[, 0]]]) ; Will set x and y later
    EndIf
WEnd
Edited by Zisly
Link to comment
Share on other sites

Well, I was basically copying the functions along with the parameters from NomadMemory.au3, and he defined variables in the parameters. Unless you meant x and y under MouseClick, that's because each click is going to be in a different spot. Also, should I declare the value of $iv_Address as a local address? But that wouldn't work, because they're both different addresses. Should I just write in the address like below?

So, this code would work fine for my purposes:

#include <NomadMemory.au3>

Dim $Item, $Price

$ah_Handle=_MemoryOpen("MapleStory.exe")

While 1
    Local $iv_Address
    MouseClick("main", x, y, 1, 0) ; Will set x and y later
    MouseClick("main", x, y, 1, 0) ; Will set x and y later
    $Item=_MemoryRead(0x000000, $ah_Handle) ; Will change to correct address later
    $Price=_MemoryRead(0x000000, $ah_Handle) ; Will change to correct address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main", x, y, 1, 0) ; Will set x and y later
        MouseClick("main", x, y, 1, 0) ; Will set x and y later
    EndIf
WEnd
Edited by Chuuy
Link to comment
Share on other sites

No need to declare variables for the addresses then in my opinion then :D

And yeah, that code should work :D

Edit; I saw that your making this for Maplestory, I've heard that they got a gameguard, I'm pretty sure it will pick this up.

So cheating won't really pay of :/

Edited by Zisly
Link to comment
Share on other sites

No need to declare variables for the addresses then in my opinion then ;)

And yeah, that code should work :D

Alright, thanks a lot. :D I'm going to be expanding this into a bigger and more automated bot, so I'll post if I have any more problems, but for now, this is great and I need to load up Cheat Engine. Thanks. :P
Link to comment
Share on other sites

I'm having trouble trying to send packets.

#include <NomadMemory.au3>

Dim $Item, $Price

$ah_Handle = _MemoryOpen("MapleStory.exe")
$SocketID = TCPConnect(63.251.217.122, 8989)

While 1
    TCPSend($SocketID, F1 00 05 01 00 00 00 02 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00)
    $Item = _MemoryRead(0x000000, $ah_Handle) ; Will change to correct address later
    $Price = _MemoryRead(0x000000, $ah_Handle) ; Will change to correct address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main", 511, 183, 1, 0) ; Will set x and y later
        MouseClick("main", 448, 366, 1, 0) ; Will set x and y later
    EndIf
WEnd

I have the IP and port of what I want to send packets to, and I also have the packet. But I'm getting syntax errors.

Do you solve this by putting quotes around the IP and packet? Because I did that, and it compiled, but it wasn't working.

Edited by Chuuy
Link to comment
Share on other sites

You need to startup tcp.. read the examples in the helpfile next time.

#include <NomadMemory.au3>
; Start TCP 
TCPStartup()

Dim $Item, $Price

$ah_Handle = _MemoryOpen("MapleStory.exe")
$SocketID = TCPConnect('63.251.217.122', 8989)

While 1
    TCPSend($SocketID, 'F1 00 05 01 00 00 00 02 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00')
    $Item = _MemoryRead(0x000000, $ah_Handle); Will change to correct address later
    $Price = _MemoryRead(0x000000, $ah_Handle); Will change to correct address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main", 511, 183, 1, 0); Will set x and y later
        MouseClick("main", 448, 366, 1, 0); Will set x and y later
    EndIf
WEnd
Link to comment
Share on other sites

You need to startup tcp.. read the examples in the helpfile next time.

#include <NomadMemory.au3>
; Start TCP 
TCPStartup()

Dim $Item, $Price

$ah_Handle = _MemoryOpen("MapleStory.exe")
$SocketID = TCPConnect('63.251.217.122', 8989)

While 1
    TCPSend($SocketID, 'F1 00 05 01 00 00 00 02 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00')
    $Item = _MemoryRead(0x000000, $ah_Handle); Will change to correct address later
    $Price = _MemoryRead(0x000000, $ah_Handle); Will change to correct address later
    If $Item = 1082002 And $Price < 1355 Then
        MouseClick("main", 511, 183, 1, 0); Will set x and y later
        MouseClick("main", 448, 366, 1, 0); Will set x and y later
    EndIf
WEnd
Alright thanks, but I'm having trouble with this, and it's not the most imporant part, so I'm just going to go back to clicking with MouseClick.

However, a new question. It appears that they encrypted the price and that I can't read it out of memory, is it possible to use OCR or something of the sort to read the number?

EDIT: Well, I've found a lot of examples over the forum, so lets see what happens.

Update: Nevermind, I found the price in the memory. Should be good now. :D

Edited by Chuuy
Link to comment
Share on other sites

#include <NomadMemory.au3>

Dim $Item, $Price
$Startup = TCPStartup()
If $Startup = 0 Then MsgBox(0, "Error", "TCPStartup failed:" & @error)

HotKeySet("{ESC}", "Quit")

$Socket = TCPConnect("63.251.217.122", 8989)
If $Socket = -1 Then MsgBox(0, "Error", "TCPConnect failed:" & @error)
If @error = 1 Then MsgBox(0, "Error", "The IP Address is incorrect.")
If @error = 2 Then MsgBox(0, "Error", "The Port is incorrect.")

$ah_Handle = _MemoryOpen("MapleStory.exe")

While 1
    $Send = TCPSend($Socket, 'F1 00 05 01 00 00 00 02 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00')
    If $Send = 0 Then MsgBox(0, "Error", "TCPSend failed:" & @error)
    TCPRecv($Socket, 2048) ; I set the max length of characters to a random number, I think it's enough for the packet listed below
    If $Item = 1082002 And $Price < 1355 Then
        $Send = TCPSend($Socket, 'F1 00 10 XX XX XX')
    EndIf
WEnd

Func Quit()
    Exit 0
EndFunc   ;==>Quit

Hi, it's me again. I'm basing the entire program off of reading and sending packets, but I have a few questions on recieving packets. Basically, when I TCPSend the first packet, it refreshes a list. When a new item is added to the list, I recieve a packet, which is what I'm trying to recieve in TCPRecv. Now, I want to read this packet. The packet I recieve will look like this:

37 01 15 A6 B8 00 00 10 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 01 01 02 E4 23 1F 00 00 00 80 05 BB 46 E6 17 02 02 00 00 00 00 00 2F 29 BE 01 8C 0A 00 00 72 01 00 00 00 00 00 00 00 D6 5B 5D A4 F1 C9 01 07 00 4D 61 78 41 75 72 61 0B 00 53 49 4E 64 55 52 75 6E 6E 69 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 E4 23 1F 00 00 00 80 05 BB 46 E6 17 02 01 00 00 00 00 00 2D 29 BE 01 6C 07 00 00 22 01 00 00 00 00 00 00 00 D6 5B 5D A4 F1 C9 01 07 00 66 75 6C 61 6E 6F 78 0C 00 52 6F 43 6B 53 74 61 52 6C 78 58 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 25 21 1F 00 00 00 80 05 BB 46 E6 17 02 01 00 00 00 00 00 29 29 BE 01 6E 00 00 00 6F 00 00 00 00 00 00 00 00 D6 5B 5D A4 F1 C9 01 09 00 61 6E 74 31 66 72 33 33 7A 0C 00 45 6E 74 68 75 73 69 65 73 74 69 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 41 2D 1F 00 00 00 80 05 BB 46 E6 17 02 01 00 00 00 00 00 20 29 BE 01 6E 00 00 00 6F 00

The red part is the item ID, and the green part is the price. When the item ID = E4 23 1F And Price < 4B 05 then send the second packet where XX XX XX = The part above highlighted in Blue. I didn't see anything in the help file about this, and neither did searching the forum. So could I get some help please? Thank you. :D

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...