我正在写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中的数据中。

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

  1. lpBaseAddress 应该是您写作的另一个过程中的地址。自从你 handle 指向当前过程,我什至不知道为什么您将此功能开始。您可以使用 StructP.WriteWORD(Offset, Data) 将数据写入您的结构。但是我想现在,您是出于最低限度的演示目的而这样做的 - 看看您是否可以得到 WriteProcessMemory() 完全工作。

  2. 我认为这甚至不是有效的代码。 StructP.size 存在,但这是一个INT,不是一个对象. 。它没有DataPTR成员。 StructP.DataPtr 也存在。实际上, StructP.DataPtr 如果您只是指定的是发送的 StructP 根据帮助文件. 。所以你要写 右后背的结构 该结构再次作为最低测试?如果是这样,两个指针都应该是 StructP

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

我毫不奇怪,该结构在打电话后是空的 Process32FirstW(), , 作为 它检查了 dwSize 结构成员. 。由于您没有成功编写它,因此我希望价值通常为0,因此没有编写数据。

我从来没有摆弄Messger Plus,所以您必须原谅我的很多事情。让我知道是否有用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top