msn加上脚本读/写内存

时间:2010-10-14 16:11:19

标签: javascript interop msn

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

1 个答案:

答案 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中。

我在您的代码中看到的问题是:

  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

  3. 之后,我不知道您使用的ReadInt()功能来自哪里。在我看来,Databloc有几个用于读取值的成员函数,但您可以将它们称为:hnd_ptr.ReadWORD(0)

    Process32FirstW()调用it checks the value of the dwSize member of the structure之后,结构为空,我并不感到惊讶。由于您没有成功写入它,我希望该值通常为0,因此不会写入任何数据。

    我从来没有摆弄过Messger Plus,所以你不得不原谅我被其中的许多人弄糊涂了。如果其中任何一项有用,请告诉我。