質問

私はMSN Plusスクリプトに書いています。これは実際にはJavaScriptです。
Windowsとの相互作用には、呼ばれるクラスがあります Interop.
静的関数を使用して Call 最大12の引数を持つ指定されたDLLで指定された関数を呼び出すことができます。
私の目標は、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の概要から始めましょう。これは、lpbuffer、nsize bytes long bytesを指し示すキュアントプロセスで一連のデータを取得することになっています。そのデータは、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