Непонятки [DELPHI] Всем доброго времени суток! Собственно не спрашиваю что и как.. А прошу объяснить кусочек кода... Заранее спасибо! Вот вопрос: Собственно на днях прочитал статью: _http://www.chemax.ru/articles/trainer_delphi_api_1.php В статье абсолютно всё понятно кроме одного, вот вначале программы описаны две константы: Address = $01B40C64; PokeValue = $FFFFFFFF; Вот с ними и непонятка... Внимание вопрос! Откуда берутся эти значения? Каким софтом пользоваться? И вот ещё вопросик думаю тоже в тему: Есть у кого нибудь примеры с комментариями по: CreateRemoteThread Ещё раз огромное спасибо!
CreateRemoteThread poke = запись элемента данных Адрес ищи в artmoney.... подойдут только те переменные в игре\программе, адреса значений которых не динамические... ИМХО
скорее всего, адреса - offsetЫ каких либо значений или функций которые манипулируются читом. возможно, что на твоём компе они будут другими (basepointer+offset) . для их поиска и изменения юзай cheatengine и ollydbg. всё это не так просто. читай туториалы по хаку игр, асму, крекингу.
ищи значения прогой "TSearch", она выдаёт дизассемблированный код в месте где значение изменяется - очень помогает в поиске указателя на значение. Address - указатель на изменяемое значение в игре, который ты и должен найти. В этом и вся сложность. Ты запускаешь игру - считываешь из неё значение указателя и по считанному адресу вписываешь PokeValue. AlexTheCoder, не усложняй. ТС, Это всего-лишь то значение денег, hp или чего угодно, которое ты бы хотел в игре, его ты и записываешь вместо старого.
На гугл и MSDN нам пофигу да? Создаётся однафикственно как обычный поток. А вообще зачем это? По той ссылке всё прекрсно закоментированно, что не понятно? Мышу молотком.... ТС, что тебе надо? Если не хочешь искать сам софт, то напиши похожий(по теме). Я просто не пойму суть топика...По функци можно в MSDN найти, а про адрес и значение разжевать?
Address - Виртуальный адрес в памяти, по которому нужно изменить значение. PokeValue - Число (размер 4 байта). т.е. через WriteProcessMemory() по этому адресу записывается значение размером в 4 байта. Artmoney, OllyDbg, IDA и подобными. Code: {Level 0} function InjectLibraryAPI(lpProcessID: Cardinal; lpDllname: String): LongBool; var hProc: Cardinal; oAlloc: Pointer; cWPM: Cardinal; hRemThread: Cardinal; begin result := false; SetLastError(ERROR_SUCCESS); hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); // открываем процесс if hProc <> 0 then begin oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE); // если существует выделяем память в процессе if oAlloc <> nil then begin if WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM) = true then begin // если получилось выделить, то копируем туда содержимое своей DLL CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread); // создаем удаленный поток, по адресу kernel32.dll -> LoadLibraryA, чтобы подгрузить DLL средствами WinAPI, в чужом процессе if GetLastError = ERROR_SUCCESS then result := true; end; end; end; CloseHandle(hProc); // закрываем Handle процесса end;
Выходит так: Берём Art Money, запускаем, ищем в игре допустим 1000 денег, допустим нашлось два значения, выбираем из них большее или меньшее? P.S Всем респект за помощь!
Обычно берётся большее по адресу, хотя разницы я не вижу (или не понимаю) Да, и не забывай про DMA ! Адрес значения, который ты найдёшь через ArtMoney поменяется при следующем запуске игры. Нужно искать указатель на этот адрес.
Ладно, потихоньку я вхожу в курс дела, можно немного подробнее про указатель? Или статейками поделиться ?
Юзай гугл!в сети куча примеров трейнеров.на счет указателя памяти,почитай статью,как вытащить пароль из запущенного qip
Эм, вообще-то дальше меняешь значение денег в игре и потом отсеиваешь, пока не останется одно. Случаи, когда находят несколько адресов, связано с тем, что значение может находится в нескольких местах. Например количество ХП в Диабло. Находит 2 адреса с ХП потому, что один адрес показывает их на левой части экрана в виде красного шара, а другой - в меню характеристик персонажа в поле Life.
Бред. ТС подразумевает, что отсеял уже всё что можно и осталось 2 значения. Указатель....эмм...ТС, ты знаешь, что такое DWORD ? Так вот, это обычная переменная, допустим Х . Она находится в памяти по адресу Z. например: Code: var x,y: DWORD; begin x := 999; y := @x; // или y = Addr(x), не помню, но походу можно end; Угадай, что будет в Y? 999? Нет! Там будет Z! То есть Y теперь хранит адрес переменной X, т.е. Y - указатель на переменную Х. Вот и всё, ничего сложного, и не надо талмуды читать