msn加脚本读取/写入内存
我正在写一个MSN Plus脚本,其实是JavaScript。
对于与Windows的互操作,有一个名为Interop
的类。
使用其静态函数Call
,可以在指定的dll中调用指定的函数,最多有12个参数。
我的目标是编写一个脚本,从PID中获取进程名称。
我做的一切都正确,但它仍然无法正常工作。msn加脚本读取/写入内存
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
函数总是suceeds,但结构是空的。 WriteProcessMemory
功能也成功。但是写入的字节数始终为0
我没有一台机器上测试的事情,但你的第一个问题是你不出现路过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的概述:它应该采取数据块在CURENT过程中,lpBuffer指出,n大小字节长。它将该数据复制到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 specifyStructP
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,所以你不得不原谅我一点,因为被很多这样的东西弄糊涂了。让我知道这是否有用。
嗯,我正在尝试与其他脚本结合使用PID来处理名称脚本,它可能非常有用。现在我已经删除了WriteProcessMemory()函数,并试图用StuctP.WriteDWORD(0,296);然后Interop.Call(“kernel32”,“Process32FirstW”,hnd,StructP.DataPtr);但它仍然失败。我真的不知道还有什么要做。 – alex 2010-10-27 18:59:39
没有人有什么想法吗? – alex 2010-10-24 15:02:17