Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua外来模块-使用WriteProcessMemory功能时出现故障,类型不确定(unit32)_Lua_Lua Alien - Fatal编程技术网

Lua外来模块-使用WriteProcessMemory功能时出现故障,类型不确定(unit32)

Lua外来模块-使用WriteProcessMemory功能时出现故障,类型不确定(unit32),lua,lua-alien,Lua,Lua Alien,这就是我的代码。我甚至不确定我是否正确设置了类型 我完全迷路了,需要一些指导。我真希望有更多关于外星人的在线帮助/文档,这让我可怜的大脑感到困惑 据我所知,记忆有时会成功完成,尽管它什么也不做,但有时也会失败。正如我说过的,我的大脑很痛 非常感谢您的帮助。看起来您的缓冲区只包含2个字节99,但您在调用WriteProcessMemory时指定了4个字节 如果您打算将32位值99作为数字而不是ASCII字符串写入内存,则可以使用: require "alien" --the address im

这就是我的代码。我甚至不确定我是否正确设置了类型

我完全迷路了,需要一些指导。我真希望有更多关于外星人的在线帮助/文档,这让我可怜的大脑感到困惑

据我所知,记忆有时会成功完成,尽管它什么也不做,但有时也会失败。正如我说过的,我的大脑很痛


非常感谢您的帮助。

看起来您的缓冲区只包含2个字节99,但您在调用WriteProcessMemory时指定了4个字节

如果您打算将32位值99作为数字而不是ASCII字符串写入内存,则可以使用:

require "alien"

--the address im trying to edit in the Mahjong game on Win7
local SCOREREF = 0x0744D554 
--this should give me full access to the process
local ACCESS = 0x001F0FFF
--this is my process ID for my open window of Mahjong
local PID = 1136

--function to open proc
local op = alien.Kernel32.OpenProcess
op:types{ ret = "pointer", abi = "stdcall"; "int", "int", "int"}

--function to write to proc mem
local wm = alien.Kernel32.WriteProcessMemory
wm:types{ ret = "long", abi = "stdcall"; "pointer", "pointer", "pointer", "long", "pointer" }


local pRef = op(ACCESS, true, PID)
local buf = alien.buffer("99")

--         ptr,uint32,byte arr (no idea what to make this),int, ptr
print( wm( pRef, SCOREREF, buf, 4, nil))
--prints 1 if success, 0 if failed
可以使用alien.struct.pack将任意整数转换为字符串表示形式:


看起来您的缓冲区只包含2个字节99,但在调用WriteProcessMemory时指定了4个字节

如果您打算将32位值99作为数字而不是ASCII字符串写入内存,则可以使用:

require "alien"

--the address im trying to edit in the Mahjong game on Win7
local SCOREREF = 0x0744D554 
--this should give me full access to the process
local ACCESS = 0x001F0FFF
--this is my process ID for my open window of Mahjong
local PID = 1136

--function to open proc
local op = alien.Kernel32.OpenProcess
op:types{ ret = "pointer", abi = "stdcall"; "int", "int", "int"}

--function to write to proc mem
local wm = alien.Kernel32.WriteProcessMemory
wm:types{ ret = "long", abi = "stdcall"; "pointer", "pointer", "pointer", "long", "pointer" }


local pRef = op(ACCESS, true, PID)
local buf = alien.buffer("99")

--         ptr,uint32,byte arr (no idea what to make this),int, ptr
print( wm( pRef, SCOREREF, buf, 4, nil))
--prints 1 if success, 0 if failed
可以使用alien.struct.pack将任意整数转换为字符串表示形式:


我知道这个问题早就被遗忘了,但我遇到了同样的问题,同样的功能,网上除了这个问题什么都没有,然后我自己解决了,所以我把我的解决方案留在这里

简短回答

WriteProcessMemory的第二个参数的类型不是指针。我的意思是,官方是这样的,但外星人不能把一个原始地址投射到指针上,所以你最好假装它是一个长地址。所以您的类型声明应该如下所示

require "alien.struct"
s = alien.struct.pack('i', 99)
buf = alien.buffer(s)
长话短说

我在玩ReadProcessMemory,因为我认为在写东西之前,你需要验证这个东西是否确实存在。有一次我调用了ReadProcessMemory,它返回了一个缓冲区,这个缓冲区不是我想要的,但也不是空的。事实上,这里似乎写了一些东西——比如ASCII字符串。但不是文本,只是一些数字。但这足以让我相信数据确实来自某个地方

所以我抓起作弊引擎,打开同样的程序,搜索这个字符串。猜猜看——它确实在那里,但地址完全错了。这使我相信地址被错误地指定了。在试图找到一种从Lua数字生成指针对象的方法之后,我放弃并更改了类型声明——毕竟,指针只是一个不同解释的整数

在所有这些之后,我做了一些调查,包括阅读lua和alien的源代码,并使用调试器逐步完成相关部分。事实证明,错误的完整演练如下所示:

pointer关键字对字符串有特殊的行为:如果指针声明的参数实际上是一个Lua字符串,则立即创建一个新的缓冲区,将该字符串复制到该缓冲区,并将其用作实际参数。 Alien使用lua_isstring函数来实现这一点 lua_isstring不仅为实际字符串返回true,也为数字返回true,因为它们可以自动转换为字符串。 结果,SCOREREF被转换为字符串,复制到新创建的缓冲区中,其地址作为void*传递到WriteProcessMemory中。 由于大多数进程在其各自的地址空间中的布局是相似的,所以这个空白*经常与目标进程中某个事物的地址重合。这就是为什么系统调用有时会成功,它只是写入了一个完全错误的位置。
我知道这个问题早就被遗忘了,但我遇到了同样的问题,同样的功能,网上除了这个问题什么都没有,然后我自己解决了,所以我把我的解决方案留在这里

简短回答

WriteProcessMemory的第二个参数的类型不是指针。我的意思是,官方是这样的,但外星人不能把一个原始地址投射到指针上,所以你最好假装它是一个长地址。所以您的类型声明应该如下所示

require "alien.struct"
s = alien.struct.pack('i', 99)
buf = alien.buffer(s)
长话短说

我在玩ReadProcessMemory,因为我认为在写东西之前,你需要验证这个东西是否确实存在。有一次我调用了ReadProcessMemory,它返回了一个缓冲区,这个缓冲区不是我想要的,但也不是空的。事实上,这里似乎写了一些东西——比如ASCII字符串。但不是文本,只是一些数字。但这足以让我相信数据确实来自某个地方

所以我抓起作弊引擎,打开同样的程序,搜索这个字符串。猜猜看——它确实在那里,但地址完全错了。这使我相信地址被错误地指定了。在试图找到一种从Lua数生成指针对象的方法之后,我 放弃并更改了类型声明-毕竟,指针只是一个不同解释的整数

在所有这些之后,我做了一些调查,包括阅读lua和alien的源代码,并使用调试器逐步完成相关部分。事实证明,错误的完整演练如下所示:

pointer关键字对字符串有特殊的行为:如果指针声明的参数实际上是一个Lua字符串,则立即创建一个新的缓冲区,将该字符串复制到该缓冲区,并将其用作实际参数。 Alien使用lua_isstring函数来实现这一点 lua_isstring不仅为实际字符串返回true,也为数字返回true,因为它们可以自动转换为字符串。 结果,SCOREREF被转换为字符串,复制到新创建的缓冲区中,其地址作为void*传递到WriteProcessMemory中。 由于大多数进程在其各自的地址空间中的布局是相似的,所以这个空白*经常与目标进程中某个事物的地址重合。这就是为什么系统调用有时会成功,它只是写入了一个完全错误的位置。
这似乎并没有改变程序的行为。谢谢你的回复!更多信息;OpenProcess函数返回userdata:00000048。这是它应该返回的正确示例吗?我认为OpenProcess不起作用,我正试图让它按我们所说的那样工作。@jefferysanders:OpenProcess返回非零结果意味着它成功了。如果WriteProcessMemory失败,可以调用GetLastError查看原因。也许你需要先调用VirtualProtectEx给自己写权限。这似乎不会改变程序的行为。谢谢你的回复!更多信息;OpenProcess函数返回userdata:00000048。这是它应该返回的正确示例吗?我认为OpenProcess不起作用,我正试图让它按我们所说的那样工作。@jefferysanders:OpenProcess返回非零结果意味着它成功了。如果WriteProcessMemory失败,可以调用GetLastError查看原因。也许你需要先打电话给VirtualProtectEx给自己写权限。