Lua Alien Module - Проблема с использованием функции WriteProcessMemory, неуверенная в типах (unit32) - PullRequest
2 голосов
/ 03 апреля 2010
require "alien"

--the address im trying to edit in the Mahjong game on Win7
local SCOREREF = 0x0744D554 
--this should give me full access to the process
local ACCESS = 0x001F0FFF
--this is my process ID for my open window of Mahjong
local PID = 1136

--function to open proc
local op = alien.Kernel32.OpenProcess
op:types{ ret = "pointer", abi = "stdcall"; "int", "int", "int"}

--function to write to proc mem
local wm = alien.Kernel32.WriteProcessMemory
wm:types{ ret = "long", abi = "stdcall"; "pointer", "pointer", "pointer", "long", "pointer" }


local pRef = op(ACCESS, true, PID)
local buf = alien.buffer("99")

--         ptr,uint32,byte arr (no idea what to make this),int, ptr
print( wm( pRef, SCOREREF, buf, 4, nil))
--prints 1 if success, 0 if failed

Так вот мой код. Я даже не уверен, правильно ли установлены типы.

Я полностью потерян и нуждаюсь в руководстве. Я действительно хотел бы, чтобы было больше онлайн помощи / документации для инопланетян, это сбивает меня с толку.

Что меня совершенно сбивает с толку, так это то, что WriteProcessMemory иногда успешно завершается (хотя, насколько я знаю, вообще ничего не делает), а также иногда не завершается успешно. Как я уже говорил, мой мозг болит.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 07 августа 2018

Я знаю, что этот вопрос давно забыт, но я столкнулся с той же проблемой (с той же функцией), и в Интернете не было ничего, кроме этого вопроса, и затем я решил его сам, поэтому я оставляю свое решение здесь.

КОРОТКИЙ ОТВЕТ

Тип второго аргумента WriteProcessMemory не является «указателем». Я имею в виду, что официально это так, но пришелец не может привести необработанный адрес к «указателю», так что лучше сделать вид, что он «длинный». Так что ваше объявление типов должно выглядеть как

wm:types{ ret = "long", abi = "stdcall"; "pointer", "long", "pointer", "long", "pointer" }

ДОЛГО ОТВЕТ

Я играл с ReadProcessMemory, так как я подумал, что перед тем, как что-то писать, нужно убедиться, что это действительно существует. Итак, однажды я вызвал ReadProcessMemory, и он вернул буфер, который не был тем, что я искал, но он также не был пустым. На самом деле, казалось, что-то там было написано - например, строка ASCII. Не текст, а только цифры. Но этого было достаточно, чтобы убедить меня, что данные на самом деле пришли из где-то .

Итак, я взял Cheat Engine, открыл тот же процесс и запустил поиск по этой строке. И угадайте, что ... это действительно было там, но адрес был совершенно неверным. Это привело меня к мысли, что адрес указан неверно. После попытки найти способ создания объекта «указателя» из числа Lua я отказался и изменил объявление типов - в конце концов, указатель - это просто целое число, интерпретируемое по-другому.

После всего этого я провел некоторое расследование, в том числе прочитал источники как lua ​​и alien, так и прошел соответствующие части с помощью отладчика. Оказывается, полное прохождение ошибки выглядит следующим образом:

  1. Ключевое слово указателя имеет специальное поведение для строк: если ваш аргумент, объявленный указателем, фактически является строкой Lua, то новый буфер создается мгновенно, строка копируется туда и используется в качестве реального аргумента. .
  2. Alien использует функцию lua_isstring для реализации этого
  3. lua_isstring возвращает true не только для реальных строк, но и для чисел, поскольку они автоматически конвертируются в строки.
  4. В результате ваш SCOREREF превращается в строку, копируется во вновь созданный буфер, и адрес THAT передается в WriteProcessMemory как пустота *.
  5. Поскольку схемы большинства процессов в соответствующих им адресных пространствах похожи, эта пустота * чаще всего совпадает с адресом того или иного объекта в целевом процессе. Вот почему системный вызов иногда завершается успешно, он просто записывает в совершенно неправильное место.
0 голосов
/ 03 апреля 2010

Похоже, ваш буфер содержит только 2 байта ("99"), но вы указываете 4 байта в вызове WriteProcessMemory.

Если вы намеревались записать 32-битное значение 99 в память (как число, а не строка ASCII), вы можете использовать:

alien.buffer("\99\0\0\0")

Вы можете преобразовать произвольные целые числа в строковые представления, используя alien.struct.pack:

require "alien.struct"
s = alien.struct.pack('i', 99)
buf = alien.buffer(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...