Injection Codes - Delphi/C++/AutoIt
Все адреса в функциях устарели!
[Ссылки могут видеть только зарегистрированные пользователи. ]
По скольку большенство умных сдесь людей несколько эгоистичны, я решил написать свой гайд и поделится им с форумом!
Ну начнем, во перых Injecting это лучший способ написания своего бота или чего нибудь другого, а во вторых, давайте перестанем быть нубами и просто менять адреса, давайте играть жестко!
Вся информация здесь основана на Perfect World International
Для начала:
Давайте разберёмся кое в чем. Все люди здесь говорят о изменении адресов, офсетах и указателях...Вы понимаете о чем я говорю? (идите в google и поищите парочку гайдов)
Я нашел 4 типа адресов:
1. Базовый адрес (0x0096d1dc)
--> [Ссылки могут видеть только зарегистрированные пользователи. ] (EN)
--> Мы начнём отсюда. Все Inject функции нужно начинать с указателя от правильного адреса!
--> Используйте гайд как найти базовый адрес...Когда вы нашли базовый адрес, вычтите 0x1C и выполните еще один поиск в Hex значении для того что бы узнать РЕАЛЬНЫЙ базовый адрес.
--> Все Inject функции начинаются отсюда. Попробуйте найти ассемблерный код [0096d1dc] в отладчике [Ссылки могут видеть только зарегистрированные пользователи. ] и вы будите иметь все возможные адреса для Injecting`а
2. Динамический адрес (0x0096d1dc + 0x1C -> указывает на 0x0096d87c)
--> Это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
--> Its the Load-in-Time allocator... in other words, its a memory redirector.
3. Окружающая среда Адреса (0x0096d87c + 0x8 -> указывает на динамический адрес)
--> Указатель, который выделяет динамической адресации для петель и охраняемые блоки.
4. Роль Адреса (0x0096d87c + 0x20 -> указывает на динамический адрес)
--> Указатель, который выделяет динамический адрес как глобальные переменные, константы и типы.
Разъяснение:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Функции для Injecting`а
Delphi: (by asgborges)
Код:
procedure InjectFunc(ProcessID: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Write function address
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Address to write parameters
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Create a remote thread
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Thread to wait for the end of
WaitForSingleObject(hThread, 3000);
GetExitCodeThread(hThread,lpExitCode);
TerminateThread(hThread,lpExitCode);
VirtualFreeEx(ProcessID,ThreadAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,Func,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,aParams,0,MEM_RELEASE);
CloseHandle(hThread);
end
end;
Sirioga, уважаемый, вы переводили чем? гуглом? перевод очень разниться с тем, что написано в оригинале. Если вы не владеете технической стороной вопроса, то не надо такие статьи переводить. Сначала надо понять что такое указатели, как хранятся данные в памяти и т.д.
Вот мои дополнения/корректировке к програмной части:
[BA] - базовый адрес
[BA + 1C] - это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
[BA + 1C + 20] - это адрес начала блока информации о персонаже, отсюда находят все основные значения параметров игрока, такие как ману, жизни, таргет и т.д.
Таким образом, в терминах адрес значения HP будет :
[BA] + 0x1C + 0x20 + 0x454, где 0x454 оффсет для моей версии ПВ, в ваших клиентах он может быть другим.
________________ Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
Последний раз редактировалось Kitsune; 16.02.2010 в 12:33.
Sirioga, уважаемый, вы переводили чем? гуглом? перевод очень разниться с тем, что написано в оригинале.ваших клиентах он может быть другим.
Переведено пол часа назад ручками, технической стороной вопроса владею, но вот к терминам принятым в русской ветке epvp не привык. Буду рад в помощи устранения ошибок перевода и приведения перевода в более читабельный вид.
Тема стоящая внимания) А нужные оффсеты ковырять через CE? Я читал на форумах взлома pwi про CE, и то что через этот движок можно получить оффсеты. Так ли это и как можно это сделать?
Да и еще вопросик, как допустим ntKid получает базовый адрес? Вероятно ищет окно, получает путь к файлу, лезет в него по какому-нибудь указателю (а значит он статический?), который указывает на Base Adress. Если я ошибаюсь - поправьте, если не ошибаюсь - дайте адрес этого указателя.
Тема стоящая внимания) А нужные оффсеты ковырять через CE? Я читал на форумах взлома pwi про CE, и то что через этот движок можно получить оффсеты. Так ли это и как можно это сделать?
Да и еще вопросик, как допустим ntKid получает базовый адрес? Вероятно ищет окно, получает путь к файлу, лезет в него по какому-нибудь указателю (а значит он статический?), который указывает на Base Adress. Если я ошибаюсь - поправьте, если не ошибаюсь - дайте адрес этого указателя.
Нет такого указателя, там используется несколько другой метод)
а насчёт офсетов...знаешь где More Information находится в СЕ?
получится ли использовать следующее:
- Ищем игру
- Открываем память
- Используем процедуру readprocessmemory для получения значения по адресу (базовый адрес + офсет)
- Обрабатывать значение
?
Просто писать не охото если оно не работает.. Если ты знаешь, получится или нет напиши либо тут либо в личку)
Последний раз редактировалось АпАпАпчих; 17.02.2010 в 19:37.
Причина: Добавлено сообщение
получится ли использовать следующее:
- Ищем игру
- Открываем память
- Используем процедуру readprocessmemory для получения значения по адресу (базовый адрес + офсет)
- Обрабатывать значение
?
Просто писать не охото если оно не работает.. Если ты знаешь, получится или нет напиши либо тут либо в личку)
Ну базовый+цепочка офсетов скорее. А вообще получится. Боты так и читают инфу о чаре.
________________
Ни одно доброе дело не остается безнаказанным.
ну допустим - базовый адрес 0x000AAAAA
офсет на хп допустим 400 (да и кстати, представление офсета должно быть в какой именно СС? 16 или 10? или не имеет значение?)
Значит надо написать 0x000AAAAA+400? только это больше смахивает на мой предложенный вариант. Если я ошибаюсь, то... как должна выглядеть цепочка офсетов?
Я просто не особо знаком с офсетами, раньше баловался со статическими, с динамикой памятью не баловался, пора уже научиться =)
(пы. сы. Спасибка почему-то недоступна )
пы. сы язык Delphi.
С++ не установлен у меня.
СС не имеет значения, цепочка адресов потому что показатели чара находятся через 2 офсета от базового адреса.
[ba]+1c+20+45C - лвл для руофа
код писать лень, поэтому псевдокод)
buf - буфер.
readprocessmemory(дескриптор процесса,[ba],buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+1c,buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+20,buf,количество байт для чтения, число прочитанных байт)
readprocessmemory(дескриптор процесса,buf+45c,buf,количество байт для чтения, число прочитанных байт)
ХП перса := buf.
Спасибка не доступна потому что нет 10 постов.
________________
Ни одно доброе дело не остается безнаказанным.
Супер, спасибо, сейчас попробую написать, о результатах сообщу чуть позже)
Добавлено через 59 минут
Код:
var
buf, ba, process, pid: integer;
wr: cardinal;
Begin
if th<>0 then
begin
EnableDebugPrivilege(true);
GetWindowThreadProcessId(th, @pid);
process:=OpenProcess(PROCESS_ALL_ACCESS, false, pid);
ba:=10007676; {базовый адрес в 10СС, получил при помощи [MHS-RETRIEVER].exe}
if process<>0 then
begin
readprocessmemory(process, ptr(ba), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$1c), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$20), @buf, sizeof(buf), wr);
readprocessmemory(process, ptr(buf+$45c), @buf, sizeof(buf), wr);
p_lvl_inf.Caption := 'Уровень: ' + inttostr(buf);
CloseHandle(process);
end;
end;
end;
Написал кодик, странно, но выдает не лвл, а число 70386754. Причем постоянно это число. Где я мог напортачить?
th - хендл окна
Последний раз редактировалось АпАпАпчих; 17.02.2010 в 21:18.
Причина: Добавлено сообщение
Написал кодик, странно, но выдает не лвл, а число 70386754. Причем постоянно это число. Где я мог напортачить?
th - хендл окна
Мы с тобой говорим о разных "базовых" адресах, [MHS-RETRIEVER] находит
[BA + 1C] - начало блока игровой сесии, Реальный базовый адрес для офа на данный момент времени 98addc.
Поэтому для того что бы найти уровень верно, нужно либо задавать реальный базовый либо убрать из кода строку
Так что же это такое - Injection Codes ? Способ получить информацию о персе?
В последних настройках MHS-Bot появилась строка Base_Inject=10005980 - можете пояснить что это за параметр?
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
krukovis,
1. Injection Codes - инъекция своего года в запущенный процес и непосредственно выполнение его там.
2. Адрес инжекта функции простой атаки.
3. Вопросы связанные с ботом задавайте в соответствующей теме.
________________ Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
Последний код работает на чтение. И путем несложных манипуляций можно основные числовые параметры достать. А где найти Имя себя и свой клан? по каким адресам?