请问大家 如果读取其他进程中指定内存地址中的字符串?(是字符串,非16进制数值)
有知道的能说一下吗?急用谢谢大家了。
或者有相关文章的话 麻烦也提供一下。

解决方案 »

  1.   

    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
      

  2.   

    给你块代码,自己看吧,里面TEXT1的地址就是你要读的别的程序的地址,
    模块:
    Option Explicit'查找窗体写内存等
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private 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 Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const SYNCHRONIZE = &H100000
    Private Const SPECIFIC_RIGHTS_ALL = &HFFFF
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
    Private Const PROCESS_VM_OPERATION = &H8&
    Private Const PROCESS_VM_READ = &H10&
    Private Const PROCESS_VM_WRITE = &H20&Public GamePid As Long ' 储存进程标识符( Process Id )
    '获取内存内容
    Public Function GetData(ByVal lppid As Long, ByVal lpADDress As Long, SaveData() As Byte, Optional ByVal dtLen As Long = 4)
    Dim pHandle As Long ' 储存进程句柄
    ' 使用进程标识符取得进程句柄
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lppid)
    ' 在内存地址中读取数据
    ReadProcessMemory pHandle, ByVal lpADDress, ByVal VarPtr(SaveData(0)), dtLen, 0&
    ' 关闭进程句柄
    CloseHandle pHandle
    End FunctionPublic Function GetPid() As Long
    ' 取得进程标识符
    GetWindowThreadProcessId Form1.hwnd, GetPid
    End Function窗体:
    Option ExplicitPrivate Sub Command1_Click()
    'On Error GoTo m_ErrDim SaveArr() As Byte
    Dim sLen As Long
    GamePid = GetPid'也可以用FINDWINDOW:
    '("ThunderRT6FormDC", "Form1")
    '("工程1", "工程1")也可以'获取
    '读字符串个数长度
    sLen = LenB(Text1.Text)ReDim SaveArr(sLen)GetData GamePid, &HD00AE8, SaveArr(), sLenMe.Caption = "读入成功"Dim i
    For i = 0 To sLen - 1
        Print SaveArr(i)
    NextText2.Text = StrConv(SaveArr, vbUnicode)Exit Sub'm_Err:
    'MsgBox "err:" & Err.DescriptionEnd Sub什么也不要动,编译它,然后运行,点“读”,可以看到TEXT2的内容变为TEXT1,详细代码自己看吧,根据前几天写的红色警戒5项属性修改器改的,可能有点乱。
      

  3.   

    。。好象有点问题是吧,把所有文件都给你。
    模块
    Attribute VB_Name = "Module1"
    Option Explicit'查找窗体写内存等
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private 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 Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const SYNCHRONIZE = &H100000
    Private Const SPECIFIC_RIGHTS_ALL = &HFFFF
    Private Const STANDARD_RIGHTS_ALL = &H1F0000
    Private Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
    Private Const PROCESS_VM_OPERATION = &H8&
    Private Const PROCESS_VM_READ = &H10&
    Private Const PROCESS_VM_WRITE = &H20&Public GamePid As Long ' 储存进程标识符( Process Id )
    '获取内存内容
    Public Function GetData(ByVal lppid As Long, ByVal lpADDress As Long, SaveData() As Byte, Optional ByVal dtLen As Long = 4)
    Dim pHandle As Long ' 储存进程句柄
    ' 使用进程标识符取得进程句柄
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lppid)
    ' 在内存地址中读取数据
    ReadProcessMemory pHandle, ByVal lpADDress, ByVal VarPtr(SaveData(0)), dtLen, 0&
    ' 关闭进程句柄
    CloseHandle pHandle
    End FunctionPublic Function GetPid() As Long
    ' 取得进程标识符
    GetWindowThreadProcessId Form1.hwnd, GetPid
    End Function窗体:
    VERSION 5.00
    Begin VB.Form Form1 
       AutoRedraw      =   -1  'True
       BorderStyle     =   3  'Fixed Dialog
       Caption         =   "Form1"
       ClientHeight    =   1065
       ClientLeft      =   45
       ClientTop       =   330
       ClientWidth     =   3960
       LinkTopic       =   "侠义道补药"
       MaxButton       =   0   'False
       MinButton       =   0   'False
       ScaleHeight     =   1065
       ScaleWidth      =   3960
       ShowInTaskbar   =   0   'False
       StartUpPosition =   3  '窗口缺省
       Begin VB.TextBox Text2 
          Height          =   390
          Left            =   1200
          TabIndex        =   2
          Text            =   "Text2"
          Top             =   585
          Width           =   2655
       End
       Begin VB.TextBox Text1 
          Height          =   375
          Left            =   360
          TabIndex        =   1
          Text            =   "Text1"
          Top             =   120
          Width           =   3495
       End
       Begin VB.CommandButton Command1 
          Caption         =   "读"
          Height          =   375
          Left            =   360
          TabIndex        =   0
          Top             =   600
          Width           =   735
       End
    End
    Attribute VB_Name = "Form1"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option ExplicitPrivate Sub Command1_Click()
    'On Error GoTo m_ErrDim SaveArr() As Byte
    Dim sLen As Long
    GamePid = GetPid'也可以用FINDWINDOW:
    '("ThunderRT6FormDC", "Form1")
    '("工程1", "工程1")也可以'获取
    '读字符串个数长度
    sLen = LenB(Text1.Text)ReDim SaveArr(sLen)GetData GamePid, &HD00AE8, SaveArr(), sLenMe.Caption = "读入成功"Dim i
    For i = 0 To sLen - 1
        Print SaveArr(i)
    NextText2.Text = StrConv(SaveArr, vbUnicode)Exit Sub'm_Err:
    'MsgBox "err:" & Err.DescriptionEnd Sub工程:
    Type=Exe
    Form=Form1.frm
    Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\System32\stdole2.tlb#OLE Automation
    Module=Module1; Module1.bas
    IconForm="Form1"
    Startup="Form1"
    HelpFile=""
    Title="工程1"
    ExeName32="工程1.exe"
    Command32=""
    Name="工程1"
    HelpContextID="0"
    CompatibleMode="0"
    MajorVer=1
    MinorVer=0
    RevisionVer=0
    AutoIncrementVer=0
    ServerSupportFiles=0
    VersionCompanyName="YY"
    CompilationType=0
    OptimizationType=0
    FavorPentiumPro(tm)=0
    CodeViewDebugInfo=0
    NoAliasing=0
    BoundsCheck=0
    OverflowCheck=0
    FlPointCheck=0
    FDIVCheck=0
    UnroundedFP=0
    StartMode=0
    Unattended=0
    Retained=0
    ThreadPerObject=0
    MaxNumberOfThreads=1
    DebugStartupOption=0[MS Transaction Server]
    AutoRefresh=1
    按上一个回复的试试,不行留个MAIL,给你发过去。
      

  4.   

    用CopyMemory
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As String, ByRef Source As Long, ByVal Length As Long)Dim strTmp as string
    strTmp=space(字符长度)
    CopyMemory strTmp,[内存地址],[字符长度]
      

  5.   

    搞错一点东西,是
    CopyMemory strTmp,ByVal [内存地址],[字符长度]
      

  6.   

    谢谢各位朋友的帮助。to zcsor:
    你的代码我调试了一下,其他一切还正常。
    就是读取位数这里有点问题,好像无法用text1的数值来正确获取内存字符串位数。
    另:有没有什么办法能直接从特定地址开始读取,一直读到“Hex(00)”后自动结束读取的?希望zcsor能明白我的意思,谢谢。:)
      

  7.   

    不好意思啊,才下班,正在边吃边打字,读的个数确实有点问题,嘿嘿,当时看到了,窗体下面多了0,没改,比较容易你自己改就好啦~~~~
    我代码里的内存地址吗,呵呵最近在写修改器,工具很多,这个很容易找,你用什么修改器都能找到。。
    从指定地址读你就设置GATDATA里面的参数就可以了
    GetData GamePid, &HD00AE8, SaveArr(), sLen
    第一个参数是PID,第2个是要开始读的地址,第3个是长度,
    你想读到00就终止,那可以这样做:
    设置最后一个参数为1,读一个比较一次是不是0
    还可以
    读一定的字节,例如1024个,然后再去比较数组里面的元素。。
    但是无论你用什么办法,都必须进行错误处理,内存的保护也许会造成程序运行的错误
    我没实践,另外还要识别是不是到了程序的最后面,这个我在帖子里问过了,当时只是问了问PE结构,没求代码,想实现来着,呵呵不过到底还是没做,又扎到外挂里了。
      

  8.   

    另外:
    CopyMemory函数:
    dim SwpHandTmp(19) as byte,BuffArray(100) as byte,i as long
    '初始化BuffArray数组
    for i=0 to 100
       BuffArray(i)=i
    next
    CopyMemory SwpHandTmp(0), BuffArray(10), 20
    for i=0 to 19
       debug.print SwpHandTmp(i)
    next
    以上代码可以正常运行,换为:CopyMemory ByVal VarPtr(SwpHandTmp(0)), BuffArray(10), 20试试请测试以上代码,别的我没什么好说了。
    给楼主的代码只是我最近写的那个红色警戒修改器改出来的,呵呵。图方便了。代码在下载区的源码-GAME里有,我的BLOG上也有。