Вопрос

Я пишу сценарий 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 в этом целевом процессе.

Проблемы, которые я вижу в вашем коде:

  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