我正在写一个MSN Plus脚本,实际上是javascript
对于Windows的互操作,有一个名为Interop
的类
使用静态函数Call
,可以在指定的dll中调用最多12个参数的s指定函数
我的目标是编写一个脚本,从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.
答案 0 :(得分:1)
我没有机器来测试,但你的第一个问题是你似乎没有通过the proper parameters to 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的概述开始:它应该在当前进程中获取一大块数据,由lpBuffer指向,nSize字节长。它将该数据复制到hProcess指示的进程的内存空间中,并将该数据放在该目标进程的地址lpBaseAddress中。
我在您的代码中看到的问题是:
lpBaseAddress
应该是您要写入的另一个进程中的地址。由于您的handle
指向当前进程,我甚至不知道您为什么要开始使用此函数。您只需使用StructP.WriteWORD(Offset, Data)
将数据写入结构即可。但我现在假设你这样做只是为了最低限度的演示目的 - 看看你是否可以让WriteProcessMemory()
完全工作。
我认为这甚至不是有效的代码。 StructP.size
exists, but it's an int, not an object。它没有DataPtr成员。 StructP.DataPtr
也存在。事实上,StructP.DataPtr
is what is sent if you just specify StructP
according to the help file。那么,您是否正在尝试将从结构写入到结构,再次作为最小测试?如果是这样,两个指针都应该是StructP
之后,我不知道您使用的ReadInt()
功能来自哪里。在我看来,Databloc有几个用于读取值的成员函数,但您可以将它们称为:hnd_ptr.ReadWORD(0)
在Process32FirstW()
调用it checks the value of the dwSize
member of the structure之后,结构为空,我并不感到惊讶。由于您没有成功写入它,我希望该值通常为0,因此不会写入任何数据。
我从来没有摆弄过Messger Plus,所以你不得不原谅我被其中的许多人弄糊涂了。如果其中任何一项有用,请告诉我。