MSN Plus сценарий чтения/записи памяти
-
30-09-2019 - |
Вопрос
Я пишу сценарий MSN Plus, который на самом деле является javascript.
Для взаимодействия с Windows существует класс под названием Interop
.
Благодаря своей статической функции Call
можно вызвать указанную функцию в указанной dll с максимум 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:Предполагается, что он принимает фрагмент данных текущего процесса, на который указывает lpBuffer, длиной nSize байт.Он копирует эти данные в пространство памяти процесса, указанного 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, так что вам придется меня немного простить за то, что меня многое из этого сбило с толку.Дайте мне знать, если что-то из этого было полезно.