题
我正在写MSN Plus脚本,实际上是JavaScript。
对于与Windows互动的,有一个名为 Interop
.
具有静态功能 Call
可以在指定的DLL中调用S指定的函数,最多12个参数。
我的目标是编写一个从PID中获取过程名称的脚本。
我已经做对了,但仍然不起作用。
function GetProcNameFromPID(pid) { var hnd = Interop.Call("kernel32", "CreateToolhelp32Snapshot", 2, 0); var handle = Interop.Call("kernel32", "GetCurrentProcess"); var StructP = Interop.Allocate(4+4+4+4+4+4+4+4+4+260);//*Allocate space for the ProcessEntry32 struct* var hnd_ptr = Interop.Allocate(4); var ress = Interop.Call("kernel32", "WriteProcessMemory", handle, StructP, StructP.size.DataPtr, 4, hnd_ptr); Debug.Trace(ReadInt(hnd_ptr, 0)); var res = Interop.Call("kernel32", "Process32FirstW", hnd, StructP.DataPtr); if(!res) { Debug.Trace("FAAAAIIIILLLLL / " + Interop.Call("kernel32", "GetLastError") + " / " + ress); } else { do { var pos = 0; ReadInt(StructP, pos); ReadInt(StructP, pos); var owpid = ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); var parpid = ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); ReadInt(StructP, pos); var name = ReadString(pos, 50); if(pid == owpid) return name; StructP = Interop.Allocate(4+4+4+4+4+4+4+8+4+50); Interop.Call("kernel32", "WriteProcessMemory", handle, StructP.DataPtr, StructP.size.DataPtr, 4, null); } while(Interop.Call("kernel32", "Process32NextW", hnd, StructP.DataPtr) == true) } } function ReadInt(buffer, pos) { var res = 0; for(var i = 0; i >> 24; var b2 = addr >> 24; var b3 = addr >> 24; var b4 = addr >> 24; return b4 + b3*256 + b2*256*256 + b1*256*256*256; }
这 Process32FirstW
函数总是成功的,但是结构是空的。
这 WriteProcessMemory
功能也成功了。但是书面字节的数量始终为0。
解决方案
我没有计算机的机器,但是您的第一个问题是您似乎没有通过 适当的参数 WriteProcessMemory
:
BOOL WINAPI WriteProcessMemory(
__in HANDLE hProcess,
__in LPVOID lpBaseAddress,
__in LPCVOID lpBuffer,
__in SIZE_T nSize,
__out SIZE_T *lpNumberOfBytesWritten
);
你经过...
handle => hProcess,
StructP => lpBaseAddress, // ???
StructP.size.DataPtr => lpBuffer, // ???
4 => nSize,
hnd_ptr => lpNumberOfBytesWritten
让我们从WriteProcessMemory的概述开始:应该在curent过程中获取大量数据,该数据由LPBuffer指向,长度为lpbuffer。它将数据复制到由Hprocess指示的过程的存储空间中,并将数据放在地址LPBASEADDRESS中的数据中。
我在您的代码中看到的问题是:
lpBaseAddress
应该是您写作的另一个过程中的地址。自从你handle
指向当前过程,我什至不知道为什么您将此功能开始。您可以使用StructP.WriteWORD(Offset, Data)
将数据写入您的结构。但是我想现在,您是出于最低限度的演示目的而这样做的 - 看看您是否可以得到WriteProcessMemory()
完全工作。我认为这甚至不是有效的代码。
StructP.size
存在,但这是一个INT,不是一个对象. 。它没有DataPTR成员。StructP.DataPtr
也存在。实际上,StructP.DataPtr
如果您只是指定的是发送的StructP
根据帮助文件. 。所以你要写 从 右后背的结构 到 该结构再次作为最低测试?如果是这样,两个指针都应该是StructP
之后,我不知道在哪里 ReadInt()
您使用的功能来自。在我看来,DataBloc具有几个用于阅读值的成员函数,但是您将它们称为: hnd_ptr.ReadWORD(0)
我毫不奇怪,该结构在打电话后是空的 Process32FirstW()
, , 作为 它检查了 dwSize
结构成员. 。由于您没有成功编写它,因此我希望价值通常为0,因此没有编写数据。
我从来没有摆弄Messger Plus,所以您必须原谅我的很多事情。让我知道是否有用。