MSN Plusスクリプトの読み取り/書き込みメモリ
-
30-09-2019 - |
質問
私は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のデータを配置することをコピーします。
私があなたのコードで見た問題は次のとおりです。
lpBaseAddress
あなたが書いている別のプロセスのアドレスであるべきです。あなたからhandle
現在のプロセスを指して、なぜあなたがこの関数を最初から呼ぶのかさえ知りません。使用することができますStructP.WriteWORD(Offset, Data)
構造にデータを書き込む。しかし、私は今のところ、あなたが最低限のデモンストレーションの目的でこれを行っていると思います - あなたが得ることができるかどうかを確認するためにWriteProcessMemory()
まったく働くこと。これは有効なコードでさえないと思います。
StructP.size
存在しますが、それはintであり、オブジェクトではありません. 。 DataPtrメンバーはありません。StructP.DataPtr
存在します。実際には、StructP.DataPtr
指定した場合に送信されるものですStructP
ヘルプファイルによると. 。それで、あなたは書こうとしていますか? から すぐに構造 に 構造は、再び、最小限のテストとして?もしそうなら、両方のポインターはそうあるべきですStructP
それに続いて、どこにいるのかわかりません ReadInt()
使用している関数は由来します。 Datablocには値を読むためのいくつかのメンバー関数があるように見えますが、次のように呼びます。 hnd_ptr.ReadWORD(0)
私は電話後に構造が空であることに驚かされません Process32FirstW()
, 、 なので の値をチェックします dwSize
構造のメンバー. 。あなたはそれに正常に書くことができないので、私はその値が通常0であるため、データは書かれていないことを期待しています。
私はMessger Plusをいじったことがないので、あなたはこれの多くに悩まされるために私を少し許さなければならないでしょう。これのいずれかが有用であるかどうか教えてください。