vfp 了解一下 读写内存!

yrt888 2008-10-06 01:59:18
在行者孙博客里有一篇关于显示扫雷游戏的文章,里面涉及到读写进程内存,看了后有想象了,想起在玩游戏时,有时会拿起金山游侠修改器去修改游戏内存数据,现在突发奇想,可不可以在VFP里,也好像那样去读写内存,比如:有个数是:12345678,或者有句文字:学习再学习。那如何用VFP 去尝试搜寻这些内存东西呢?各位大侠看看这个如何做,了解一下,谢谢!
...全文
225 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrt888 2008-10-06
  • 打赏
  • 举报
回复
不好意思,刚回来,马上学习,谢谢大侠!
都市夜猫 2008-10-06
  • 打赏
  • 举报
回复
ReadProcessMemory / WriteProcessMemory 这对函数拥有相同的参数,其中:
参数1: 进程句柄
参数2: 开始读写的地址
参数3: 读取后放入/要写入 的数据缓冲区地址
参数4: 要读写的字节数
参数5: 用于返回成功读取/写入的字节数
返回值:操作失败时返回 0, 成功时为非 0

进程句柄通常用 OpenProcess 来获取,只是要注意,如果读取数据的话,打开进程时需要指定 PROCESS_VM_READ 权限,写入数据则需要 PROCESS_VM_WRITE + PROCESS_VM_OPERATION 权限,当然你也可以不管 3721 的用 PROCESS_ALL_ACCESS(所有权限)来打开这个进程。如果访问某个进程的空间时遇到失败,可能先需要提升你自己进程的权限,例如提升到调试权限。当然,有些进程本身也做了一些自我保护的操作,你提升了权限也未必可以读写成功。

用于读写访问的缓冲区最好另外用 api 函数(例如像 GlobalAlloc/GlobalFree 函数)来申请和释放,直接用 vfp 的字符串可能会失败,因为 vfp 在必要时会自己整理内存。

其它几个参数都很明确,不用多解释。操作系统在执行这对函数时会检查你指定的读写内存区域是否允许访问,你只要根据返回的值来判断读写是否成功即可。

如果你要搜索特定的字符串,只要读取操作成功,然后就可以将读到的内容用 sys(2600,... )复制到 vfp 的一个字符串中再搜索就行了。
yrt888 2008-10-06
  • 打赏
  • 举报
回复
在行者孙的博客里有 ReadProcessMemory 的 VFP 定义格式,我主要是了解一下,怎样通过这些API 去读写内存,也可说是,怎样入手去读写,或者是,希望了解读写过程的清晰说明!当然,有实例最好,比如上面所说的搜寻某进程一个数字:12345678,或着字符串: 学习在学习,等!
yrt888 2008-10-06
  • 打赏
  • 举报
回复
谢谢 apple_8180 版主,正在学习中!
十豆三 2008-10-06
  • 打赏
  • 举报
回复
api方面:dkfdtf和行者孙是专家,实在不行,就找他们。
十豆三 2008-10-06
  • 打赏
  • 举报
回复
MSDN

http://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx
十豆三 2008-10-06
  • 打赏
  • 举报
回复
[DllImport( "Kernel32.dll")]
public static extern bool ReadProcessMemory
(
IntPtr hProcess,
IntPtr lpBaseAddress,
byte[] lpBuffer,
UInt32 nSize,
ref UInt32 lpNumberOfBytesRead
);


public byte[] ReadProcMem(IntPtr handle, IntPtr address, UInt32 size, ref UInt32 bytes)
{
byte[] buffer = new byte[size];

//handle is the id of the process you need to access
ReadProcessMemory(handle, address, buffer, size, ref bytes);

return buffer;

}
yrt888 2008-10-06
  • 打赏
  • 举报
回复
正在学习一下二楼的资料!
yrt888 2008-10-06
  • 打赏
  • 举报
回复
不错的资料,我希望的是读写其他进程的,在行者孙的文章里,提到ReadProcessMemory 这个API 不过对这个函数不甚了解,不知如何使用?!谢谢!
十豆三 2008-10-06
  • 打赏
  • 举报
回复
看看这两个对你有用吗,可以通过下面第一个,取得内存信息,然后截取到你要到的部分。或者替换指定部分,然后写回去。不过个人感觉还是MyFll.Fll简单。

* Allocating a memory block with GlobalAlloc
* 分配、指定、写入、读出、释放一个内存块
*-------------------------------------------------
Clea
#Define GMEM_DDESHARE 8192
#Define GMEM_DISCARDABLE 256
#Define GMEM_DISCARDED 16384
#Define GMEM_FIXED 0
#Define GMEM_INVALID_HANDLE 32768
#Define GMEM_LOCKCOUNT 255
#Define GMEM_LOWER 4096
#Define GMEM_MODIFY 128
#Define GMEM_MOVEABLE 2
#Define GMEM_NOCOMPACT 16
#Define GMEM_NODISCARD 32
#Define GMEM_NOTIFY 16384
#Define GMEM_NOT_BANKED 4096
#Define GMEM_SHARE 8192
#Define GMEM_VALID_FLAGS 32626
#Define GMEM_ZEROINIT 64

Declare integer GlobalAlloc in kernel32 integer wFlags, integer dwBytes
Declare integer GlobalSize in kernel32 integer hMem
Declare integer GlobalFree in kernel32 integer hMem
Declare Integer GlobalLock IN kernel32 Integer hMem
Declare Integer GlobalUnlock IN kernel32 Integer hMem

lcin = " abc./'[]@ #-_4 7defg江南红雨klmn opz "
? "写入字符 :", lcin
Hmem = GlobalAlloc(0, len(lcin)) && 创建内存块
? "内存块指针:", hMem
lncb = GlobalSize ( hMem ) && 获得内存块大小
? "内存块大小:", lncb
= CopytoMem ( hMem, lcin, lncb ) && 写入内存块内容
lcout = REPLICATE(chr(0), lncb)
= CopyfromMem(hMem, @lcout, lncb) && 读取内存块内容
? "读取字符 :", lcout
? "释放内存块:", GlobalFree(hMem) && 释放内存块

Clea dlls
Return

*----------------------
Function CopytoMem
Lparameter lnDestBuffer, lpVoidSource, lpcb
Declare integer lstrcpyn in kernel32 as RtlCopytoMem integer lnDestBuffer, string @lpSource, integer nLength
= RtlCopytoMem( lnDestBuffer, lpVoidSource, lpcb )
Return lpVoidSource
Endfunc

Function CopyfromMem
Lparameter lpVoidSource, lpDestString, lpcb
Declare integer lstrcpyn in kernel32 as RtlCopyfromMem string @lpDestString, integer lpSource, integer nLength
= RtlCopyfromMem( @lpDestString, lpVoidSource, lpcb)
lpDestString = chrtran( lpDestString, chr(0), "")
Return lpDestString
Endfunc





* Using ZeroMemory function
* 清空内存到 0
*-------------------------------
Clea
Declare RtlZeroMemory IN kernel32 As ZeroMemory;
STRING @ dest,;
INTEGER numBytes

lcText = REPLI("A", 50)
? "[" + lcText + "]"

= ZeroMemory (@lcText, Len(lcText))
? "[" + lcText + "]"
十豆三 2008-10-06
  • 打赏
  • 举报
回复
在木瓜的MyFll.Fll有:

MemRead           读取指定地址的内存
MemWrite           写入指写内存
--------------------------------------------------
函数名:MemRead(nAddress,nBytes)
缩写:memr
读取指定地址的内存,注意,只能读取本进程的内存
返回值:
字符型
参数:
nAddress:整型,内存地址,比如0x12fdc4
nBytes :整型,要读取的字节数
示例代码
Set Library To myfll

?MemRead(0x12fdc4,60)

Set Library To


----------------------------------------------------------
函数名:MemWrite(nAddress,cValue)
缩写:memw
将内容写入指写内存地址
返回值:
无,写入失败时会产生异常,应该用Try来检测错误,确保指写内存是可写的。以免引起内存不能为Write的错误
参数:
nAddress:整型,内存地址
cValue:字符型,要写的内容
示例代码
Set Library To myfll

?MemRead(0x12fdc4,60)
?MemWrite(0x12fdc4,"----------")
?MemRead(0x12fdc4,60)

Set Library To

vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列表。 若想打印这些附注,请从“文件”菜单中选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 中移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其中包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接。 问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其中包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单中的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品中的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 中任何错误的修正都将包含在 Visual Studio Service Pack 中。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品中带有丰富的示例,其中有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 中可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品中所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧