问一个vb.net读写内存的问题,查不到毛病出在哪里了

问题描述

这是api定义<DllImport("kernel32.dll")>PublicSharedFunctionWriteProcessMemory(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByValbufferAsByte(),ByValsizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInt32EndFunction<DllImport("kernel32.dll")>PublicSharedFunctionWriteProcessMemory(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByValbufferAsInteger,ByValsizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInt32EndFunction

下边是代码DimxrbpmcAsIntegerDimstrbpidAsInteger=5000DimstrbpmcAsString=bpmc.TextDimencbpmc()AsByte=Encoding.Unicode.GetBytes(strbpmc)Hwd=FindWindow(vbNullString,"喜喜喜喜喜喜")IfHwd=0ThenMsgBox("喜喜喜喜喜喜")ElseGetWindowThreadProcessId(Hwd,pid)hProcess=OpenProcess(PROCESS_ALL_ACCESS,False,pid)IfhProcess=0ThenMsgBox("不能读取进程",,"提示")ElseReadProcessMemory(hProcess,&HD3432C,p,4,0)'获得内存中的基址ReadProcessMemory(hProcess,p+&H1C,p1,4,0)'获得内存中的一级偏移ReadProcessMemory(hProcess,p1+&H28,p2,4,0)'环境偏移WriteProcessMemory(hProcess,p2+&H684,strbpid,4,0)ReadProcessMemory(hProcess,p2+&H814,xrbpmc,4,0)'玩家帮派名称ReadProcessMemory(hProcess,xrbpmc+&HC,xrbpmc,4,0)'玩家帮派偏移ReadProcessMemory(hProcess,xrbpmc+&H0,xrbpmc,4,0)'玩家帮派偏移ReadProcessMemory(hProcess,xrbpmc+&H0,xrbpmc,4,0)'玩家帮派偏移WriteProcessMemory(hProcess,xrbpmc+&H0,encbpmc,32,0)EndIfCloseHandle(hProcess)'读完关闭进程,防止崩溃EndIf

为什么字节型的帮派名称可以写入,整数型的帮派ID写不进去内存呢?

解决方案

解决方案二:
<DllImport("kernel32.dll")>PublicSharedFunctionWriteProcessMemory(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByValbufferAsByte(),ByValsizeAsInteger,ByVallpNumberOfBytesWrittenAsInteger)AsInt32EndFunction

<DllImport("kernel32.dll")>PublicSharedFunctionWriteProcessMemory(ByValhProcessAsInteger,ByVallpBaseAddressAsInteger,ByRefbufferAsInteger,ByValsizeAsInteger,ByReflpNumberOfBytesWrittenAsInteger)AsInt32EndFunction

将第3个和第5个的形参由byval改为byref后问题解决了ByVal与ByRef(默认值)这两个是子过程的参数传递时,指定参数按什么传递的ByVal(按值传递)ByRef(按地址传递)
解决方案三:
嗯,看原型BOOLWINAPIWriteProcessMemory(_In_HANDLEhProcess,_In_LPVOIDlpBaseAddress,_In_LPCVOIDlpBuffer,_In_SIZE_TnSize,_Out_SIZE_T*lpNumberOfBytesWritten);

本来就是指针。
解决方案四:
你把指针声明为整数没有问题,但是你这个整数中应该保存的是指针地址,而不是最终的整数值。

时间: 2024-08-31 02:05:16

问一个vb.net读写内存的问题,查不到毛病出在哪里了的相关文章

问一个VB的小问题

问题描述 在VB中如何构造一个16位的负整数? 解决方案 解决方案二:DimaAsString=(-1*(Int((9*Rnd())+1))).ToStringDimiAsInteger=0DoWhilei<3DimbAsString=Rnd()IfLen(b)>7Thena=a&b.Substring(2,5)i=i+1EndIfLoopDimcAsLong=aMsgBox("个是一个随机的16位负数:"&c) 解决方案三:Short数据类型保存16位(2

pyqt-求问一个PyQt的问题,退出时候内存错误

问题描述 求问一个PyQt的问题,退出时候内存错误 1C 写了一个pyqt的程序,有多个tab页,其中一个tab页是通过matplotlib画图,当这个模块存在时,整个程序在退出的时候就会出现exit code -1073741819,这个是出现了内存错误.但是当我去掉这个模块时,程序不会出现这个问题.而且当我把其他的tab页注释掉,仅仅只有这模块的时候,也不会出问题.这说明,这应该是这个模块与其他的某个模块导致了问题. 于是我一个模块一个模块的注释,想找到到底哪个模块与这个画图的模块同时会导致

微机原理-求问一个计算机组成原理内存访问边界对齐的问题

问题描述 求问一个计算机组成原理内存访问边界对齐的问题 看不懂对于地址Oxff00ff01为什么要先输出高30位,,,还有bank0-3每个保存7位一个字,,但是图上为什么地址04和00都在bank0.,bank0到底是一个怎么样的存储空间,一个地址四个存储空间,那这四个是相当于一个地址对应一行吗,地址加4才读取bank0的D24-D31又是为什么? 如果有OXff0000f3.是不是bank0-3保存d8-15,d16-23,d24-31,d0-7进行两次总线操作?

java-新手问一个很奇怪的问题

问题描述 新手问一个很奇怪的问题 class Demo { int num = 1; int add = 2; Demo() { num = 5; add = 6; } void show() { System.out.println("Fu num="+num+" Fu add="+add); } } class DemoA extends Demo { DemoA() { this.num = 3; this.add = 4; } void show() { S

有关VB的字符串内存分配的问题

问题描述 有关VB的字符串内存分配的问题 用C++开发的DLL型函数库,C++的Struct中包含字符串,在VB中转换成Type型,关于内存的使用是怎么样的定义 解决方案 http://blog.csdn.net/jiftlixu/article/details/5351741 解决方案二: 关于字符串的内存分配问题 解决方案三: VB中没有纠结过内存分配的问题,在VB中TYPE就是一个自定义数据类型. 不同类型的变量可以组合起来用来创建用户定义的类型(如熟知的 C 编程语言中的 structs

objective-c-ios 问一个关于crash日志 错误类型的问题

问题描述 ios 问一个关于crash日志 错误类型的问题 比如想问两个问题1.Exception Type: EXC_BAD_ACCESS 一般都是访问了一块已经被回收(不可用的内存)造成的 那Exception Type: EXC_CRASH (SIGABRT)Exception Codes: 0x0000000000000000 0x0000000000000000Exception Note: EXC_CORPSE_NOTIFY 这种EXC_CORPSE_NOTIFY.EXC_CRASH

gdb-手上没有源码,只有可执行程序,如何通过终端直接读写内存堆栈?

问题描述 手上没有源码,只有可执行程序,如何通过终端直接读写内存堆栈? 上图说gdb不加-g参数可以看到内存地址,我试验的结果却不是这样的: ~/Desktop/hello$ gcc hello.c -o hello~/Desktop/hello$ lshello hello.c:~/Desktop/hello$ gdb helloGNU gdb (GDB) 7.1-ubuntuCopyright (C) 2010 Free Software Foundation Inc.License GPL

c语言-求问一个C语言字符指针的问题

问题描述 求问一个C语言字符指针的问题 #include void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = ''; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE];

新手java-Java新手,想问一个关于在线考试系统的问题。

问题描述 Java新手,想问一个关于在线考试系统的问题. 现在做一个在线考试系统,从数据库拿到了一整张试卷(有单选,多选,判断,简答题),把题目一题占一页的显示在页面上,然后点击next到第二题.如何把选的这些答案保存到数据库?是点击一下next保存一个,还是一张试卷全做完了点击submit一起保存?具体怎么解决呢? 解决方案 随便呗,要是一起保存,就写全局的静态Map存数据,最后一次提交,保存Map数据,然后在清空占用内存 解决方案二: 你在去题目的同时为何不一起把答案取出来,然后在做完试卷的