搜索
查看: 9273|回复: 6

读取交易软件的内存

[复制链接]
发表于 2010-11-16 21:28 | 显示全部楼层

读取交易软件的内存

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:wjlhc 浏览:9273 回复:6

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
'VB读写内存,VB不会自动包括普通的API函数的声明,因此我们必须把他们加入我们的项目文件。会使用到6个主要的函数,声明如下:
      '1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName)和窗口名( WindowTitle )的窗口句柄。对我们来说,可以让 ClassName 为空( Null ),只给出游戏的WindowTitle?函数应该这样声明:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      '2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把 FindWindow函数中得到的句柄作为参数,来获得进程标识符(ProcessId )。声明如下:
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
      '3. OpenProcess(DesiredAccess, Inherit, ProcessId) -这个函数将返回一个我们目标进程的句柄,可以用来对目标进行读写操作。 DesiredAccess参数的值决定了句柄对进程的存取权利,对我们来说,要使用 PROCESS_ALL_ACCESS (完全存取权限)。Inherit 应该总是False。 ProcessId 是从 GetWindowThreadProcessId 函数中取得的。
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'定义PROCESS_ALL_ACCESS:
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Public Const PROCESS_ALL_ACCESS As Long = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
      '4. CloseHandle(ProcessHandle) - 每一个打开的句柄必须呼叫这个函数来关闭。
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
      '5. WriteProcessMemory(ProcessHandle, Address, value, Sizeofvalue,BytesWritten) - 把指定的值 value 写入由 Address 指定的目标地址。
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVallpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
      '6. ReadProcessMemory(ProcessHandle, Address, value, Sizeofvalue,BytesWritten) - 把 Address 指定的目标地址的值存入 value 位置的变量中。
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

Private Sub Command1_Click()
'下面我们要开始写在计时器窗口中显示我们名字的代码了。
'首先我们使用 FindWindow函数取得目标窗口的句柄。把这个返回值保存在一个变量中,并检查它的值是否出错来确保计时器程序正在运行。(FindWindow函数出错时返回0)
      Dim hwnd As Long
      hwnd = FindWindow(vbNullString, "交易参数存储器")
      MsgBox hwnd
      If (hwnd = 0) Then
      MsgBox "Window not found!"
      Exit Sub
      End If
      '注意在这里我们传递了一个 Null 值给 FindWindow 函数,而不是 ClassName。因此任何名为 Calculator的窗口都符合条件。如果知道计算器程序窗口的 ClassName,你可以传给它,但这不是必须的。
' 现在使用得到的窗口句柄来取得进程标识符( ProcessId )。注意 pid 是作为参数传递给函数的,而不是被赋以函数返回值。
      Dim pid As Long
      GetWindowThreadProcessId hwnd, pid
      MsgBox "我是pid:" & pid
' 再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值,如果是非法数据则退出程序。
      Dim pHandle As Long
      Dim sss As Long
      pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
      MsgBox "我是pHandle:" & pHandle
      If (pHandle = 0) Then
      MsgBox "Couldn’t get a process handle!"
      Exit Sub
      End If
      ReadProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(sss), 4, 0&
      MsgBox sss
      WriteProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(7654321), 4, 0&
      ReadProcessMemory pHandle, ByVal &H40F024, ByVal VarPtr(sss), 4, 0&
      MsgBox sss
End Sub
Private Sub Command2_Click()
      ' 声明一些需要的变量
      Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
      Dim pid As Long ' 储存进程标识符( Process Id )
      Dim pHandle As Long ' 储存进程句柄
      ' 首先取得目标窗口的句柄
      hwnd = FindWindow(vbNullString, "计算器")
      If (hwnd = 0) Then
      MsgBox "Window not found!"
      Exit Sub
      End If
      
      ' 取得进程标识符
      GetWindowThreadProcessId hwnd, pid
      
      ' 使用进程标识符取得进程句柄
      pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
      If (pHandle = 0) Then
      MsgBox "Couldn’t get a process handle!"
      Exit Sub
      End If
      ' 在内存地址中写入名字
      WriteProcessMemory pHandle, &H40F024, 3333333, 4, 0&
      ' 关闭进程句柄
      CloseHandle hProcess
      End Sub
   ' 完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。(可能需要最小化计算器程序,再还原,以便程序更新显示)
    '下面将给我们的修改器增加一个新功能。我们将与游戏兼容性计算器程序的窗口显示数据,并在修改器中显示。双击计时器,显示它的代码编辑窗口,然后输入以下代码:
      Private Sub Command3_Click()
      ' 声明变量
      Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
      Dim pid As Long ' 储存进程标识符
      Dim pHandle As Long ' 储存进程句柄
      Dim str As String * 20 ' 存储显示文本
      ' 取得目标窗口的句柄
      hwnd = FindWindow(vbNullString, "Calculator")
      If (hwnd = 0) Then Exit Sub
      ' 取得进程标识符
      GetWindowThreadProcessId hwnd, pid
      ' 取得进程句柄
      pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
      If (pHandle = 0) Then Exit Sub
      ' 读取内存数据
      ReadProcessMemory pHandle, &H40B181, str, 20, 0&
      ' 在文本框显示
      Text1.Text = str
      ' 关闭进程句柄
      CloseHandle hProcess
      End Sub


易盛内存数据的读取:
Private Sub Command3_Click()
Dim fname As Long
Dim fId As Long
Dim PHandle As Long
Dim sss As Double
'获得窗口句柄
fname = FindWindow(vbNullString, "易盛模拟 9 - [帐号:xxx 姓名:xxx] [交易:网通主机 行情:网通主机]")
'获得窗口的id
GetWindowThreadProcessId fname, fId
'获得进程句柄
PHandle = OpenProcess(PROCESS_ALL_ACCESS, False, fId)
'获得优先级
Dim hhhh
hhhh = GetPriorityClass(ByVal PHandle)
MsgBox hhhh
'调整优先级
SetPriorityClass PHandle, 256
ReadProcessMemory PHandle, ByVal &H22D785A, ByVal VarPtr(sss), 8, 0#
MsgBox "程序句柄:" & fname
MsgBox "进程标识符:" & fId
MsgBox "读出:" & sss
CloseHandle PHandle
End Sub
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

发表于 2010-11-17 19:26 | 显示全部楼层
汗,很久不见,想不到你还会VB啊!我在外汇论坛认识的一个高手也好像开始学习编程了,听他说想编写自动交易系统辅助交易。看来我等要学习的实在太多了#*27*#
金币:
奖励:
热心:
注册时间:
2008-11-20

回复 使用道具 举报

发表于 2010-11-17 19:48 | 显示全部楼层
正在努力学习,太欢迎这样提高水平的帖了
金币:
奖励:
热心:
注册时间:
2010-11-16

回复 使用道具 举报

发表于 2010-11-19 20:42 | 显示全部楼层
顶,能够读取易盛上某合约的行情买卖价吗?另外能读取持仓栏中品种代码、方向、均价吗?

VB代码请写出来,让我们学习学习呀。#*d1*#
金币:
奖励:
热心:
注册时间:
2008-6-9

回复 使用道具 举报

发表于 2010-12-15 08:50 | 显示全部楼层
#*22*# 是呀,最好是C#,我正在学习C#不知道方法如何?哈哈,兄弟能不能写个闪电手的呀。有报酬。联系:18958278522
金币:
奖励:
热心:
注册时间:
2004-2-23

回复 使用道具 举报

签到天数: 635 天

发表于 2010-12-28 20:49 | 显示全部楼层
劲头足-------------------------
金币:
奖励:
热心:
注册时间:
2005-9-8

回复 使用道具 举报

发表于 2010-12-30 15:15 | 显示全部楼层
ReadProcessMemory PHandle, ByVal &H22D785A, ByVal VarPtr(sss), 8, 0#
这一句中的地址 &H22D785A 是如何得到的?用FPE或者CE之类的游戏修改工具吗?还是其他方法?
金币:
奖励:
热心:
注册时间:
2004-11-18

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-22 23:41 , Processed in 0.033557 second(s), 12 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表