Сценарий чтения / записи MSN Plus - PullRequest
0 голосов
/ 14 октября 2010

Я пишу на сценарии 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.

1 Ответ

1 голос
/ 26 октября 2010

У меня нет машины для тестирования, но ваша первая проблема - вы, кажется, не передаете правильные параметры 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) для записи данных в свою структуру. Но сейчас я предполагаю, что вы делаете это для минимальных демонстрационных целей & mdash; чтобы узнать, можно ли вообще заставить WriteProcessMemory() работать.

  2. Я не думаю, что это даже правильный код. StructP.size существует, но это int, а не объект . У него нет члена DataPtr. StructP.DataPtr также существует. Фактически, StructP.DataPtr - это то, что отправляется, если вы просто указываете StructP в соответствии с файлом справки . Итак, вы пытаетесь записать из структуры обратно в структуру, опять же, как минимальный тест? Если это так, оба указателя должны быть StructP

После этого я не знаю, откуда берется используемая вами функция ReadInt(). Мне кажется, что в Databloc есть несколько функций-членов для чтения значений, но вы бы назвали их так: hnd_ptr.ReadWORD(0)

Я не удивлен, что структура пуста после вызова Process32FirstW(), так как проверяет значение dwSize члена структуры . Поскольку вы не пишете в него успешно, я ожидаю, что это значение обычно равно 0, и, следовательно, данные не записываются.

Я никогда не возился с Messger Plus, так что вам придется немного простить меня за то, что меня это сильно смутило. Дайте мне знать, если что-нибудь из этого было полезно.

...