2010-10-14 75 views
0

我正在写一个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

+0

没有人有什么想法吗? – alex 2010-10-24 15:02:17

回答

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的概述:它应该采取数据块在CURENT过程中,lpBuffer指出,n大小字节长。它将该数据复制到hProcess指示的进程的内存空间中,并将该数据放置在该目标进程的地址lpBaseAddress中。

我与你的代码中看到的问题是:

  1. lpBaseAddress应该是一个你正在写另一个进程的地址。由于你的handle指向当前的过程,我甚至不知道你为什么要先调用这个函数。您只需使用StructP.WriteWORD(Offset, Data)即可将数据写入您的结构。但是我现在假设你只是在最小限度的演示目的—这样做,看你是否可以得到WriteProcessMemory()

  2. 我不认为这是有效的代码。 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,所以你不得不原谅我一点,因为被很多这样的东西弄糊涂了。让我知道这是否有用。

+0

嗯,我正在尝试与其他脚本结合使用PID来处理名称脚本,它可能非常有用。现在我已经删除了WriteProcessMemory()函数,并试图用StuctP.WriteDWORD(0,296);然后Interop.Call(“kernel32”,“Process32FirstW”,hnd,StructP.DataPtr);但它仍然失败。我真的不知道还有什么要做。 – alex 2010-10-27 18:59:39

相关问题