x 1279\10=127+400=527
z 219\10 = 21
y 1154\10=115+550 = 665
почему то у меня все идеально работает... а почему у тебя не правильные выдает, так тут все просто )) сейчас я напрягу свои экстрасенсорные способности и все сразу станет ясно )) хотя... может ошибку найти будет немного проще если ты выложишь код ))
Добавлено через 2 минуты
Цитата:
Сообщение от akeks249
дайте ссылку откуда вы берете эту прогу и вообще основы для чайников Хд!
как использовать инжекты (пример) (желательно с коментариями для тугадумов )
ТутHellD вроде бы понятно объяснил...Попробую зайти с другого бока. Вот [Ссылки могут видеть только зарегистрированные пользователи. ] очень старая ветка, правда, на немецком сервере, кодировка иногда хромает, да и мУсора в ней много. Но для новичка очень полезная - сам с нее начинал. Задавать вопросы там бессмысленно - уже не посещается. НЕ РЕКЛАМИРУЮ.
Про инжект - начну с Autoit - ты на нем писал. Представь, что у тебя в боте есть функция получения значения любой ячейки из структуры игрока.
Если я получу доступ к твоему исходнику, я могу написать абсолютно в любом месте свою функцию
Код:
Func Read()
$Money = ReadTo(0x554)
;далее пересылка денег если больше заданного
EndFunc
и передам где нибудь на нее управление. Все, я поставил твоего бота на деньги - это и есть инжект. Настоящий инжект пишется, конечно, в машинном коде. Или, если поддерживает компилятор - на ассемблере. Не слишком далеко начал? Его основная задача - заставить работать кусок кода оригинальной программы со своими входными данными.
Как искать. Elementclient
Допустим, хочу взлететь. Ищу флаг полета. Нашел 0x64C. Ставлю на него брекпоинт и смотрю, команда с какого адреса его изменяет при взлете. (Хотя тут я привел несколько неправильный пример взлет происходит по приходу подтверждающего пакета с сервера) Можно в OllyDbg посмотреть, можно в TSearch. Записываю адреса. Дальше некоторые работают тут же в OllyDbg, некоторые предпочитают IDA. Нужно идти вверх по функциям (Subroutine), разбирая, что они делают. Занятие не из благородных. Без знания ассемблера не обойтись.
Есть и другие методы, но большинство все таки основаны на брекпоинте - точке останова при обращении к ячейке памяти. А далее - опыт. Можно найти через пять минут, а можно через неделю. Именно поэтому я не верю HellD, что хорошего многофункционального бота с нуля можно написать за два дня. Хотя, если подумать, гениев еще никто не отменял. Может, он SendMessage управляется...
Вот кусок оригинального кода, который подготавливает пакет и обращается к функции PackCall для его отсылки. Он просто намного короче для примера, чем тот, который взлетает.
Код:
00696D20 56 push esi
00696D21 6A 06 push 6
00696D23 E8 68 2C 1E 00 call sub_879990
00696D28 8B F0 mov esi, eax
00696D2A 83 C4 04 add esp, 4
00696D2D 85 F6 test esi, esi
00696D2F 74 26 jz short loc_696D57
00696D31 8B 44 24 08 mov eax, [esp+arg_0]
00696D35 66 C7 06 02 00 mov word ptr [esi], 2
00696D3A 89 46 02 mov [esi+2], eax
00696D3D 8B 0D 04 7A B2 00 mov ecx, dword_B27A04
00696D43 6A 06 push 6
00696D45 56 push esi
00696D46 8B 49 20 mov ecx, [ecx+20h]
00696D49 E8 62 CA FD FF call PackCall
00696D4E 56 push esi
00696D4F E8 4C 2C 1E 00 call sub_8799A0
00696D54 83 C4 04 add esp, 4
00696D57 5E pop esi
00696D58 C3 retn
Долго смотрим, что он делает, и если стало понятно, пишем свой кусок, запихав туда данные, которые нужны. ОБЯЗАТЕЛЬНО начало pushad - сохранить все регистры в стек, а окончание popad - восстановить и ret - возврат. Иначе будет светофор.
В регистр ecx сохраняем адрес BA +0x1C +0x20. Почему +20 - не знаю, думал, что будет +0x34, но кусок выше - из сегодняшнего официального клиента. И раньше было +20. Гм...
В стек сохраняем сначала длинну пакета, потом адрес пакета (об этом позже) и передаем управление функции PackCall.
Теперь считаем стек. В начале и в конце функции величина стека должна быть одинаковой. Или - светофор. Выровнять можно add esp, N
Готовим свой пакет. (Пакеты есть в других ветках, видел) Заливаем его или на свободный участок памяти процесса клиента (непредсказуемо и глючно) или выделяем память в процессе и заливаем туда. Адрес запоминаем для нашей функции. Снова выделяем память, заливаем нашу функцию и передаем ей управление. Хотя я делаю немного иначе. В самом начале работы бота выделяю (резервирую) участок памяти и работаю с ним постоянно. Закрываю (снимаю резервацию) при выходе из бота. Хватает на все нужды.
Исходники работы с памятью процесса не привожу - их полно в сети - что тут, на Жуке, что в Гугле Тем более все пишут на разных языках высокого уровня, а я на скрипте ((( убил бы того пипла, который мне мышление Бейсиком в детстве испортил.
Все. Тут превосходная тема, больше добавлять бессмысленно.
Написал, конечно, криво - во всем прошу винить Сибирскую корону.
Запутывал специально, чтобы никто ничего не понял и на серверах не началась революция.
Хорошо, что там, где играю я , не читают по русски.
Любые имена и фамилии прошу считать банальными совпадениями.
Спасибки ставить не советую - мой пост очень вредный, возможно вас загребут вместе со мной, как соучастников...
Последний раз редактировалось sumikot; 23.11.2011 в 22:54.
var
hProcess,i,PID,BytesCount,MaxHP,j,hp,buf:dword;
WndHndl:THandle;
begin
for i:=0 to $300 do
begin
WndHndl:=findwindow(nil,'Perfect World');
GetWindowThreadProcessId(WndHndl, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
ReadProcessMemory(hProcess,ptr(base_addr),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$1C),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$8),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$20),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$18),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+i*4),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$4),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+HP_OFFSET_addr),@hp,4,BytesCount);
//Соответственно тут мы уже непосредственно выводим.
Edit4.text := IntToStr(hp);
closehandle(hProcess);
правдо я незнаю как записать (+0)^J
Цитата:
(+0)^J - специальный символ, отображающий количество (J) страниц (+0) в связанном списке.
Запись BA +218 +8 +[I*4] + (+0)^J +4 для разных значений J расшифровывается как:
Продолжать, пока не будут найдены все элементы. Элементы неравномерно распределены по всему массиву. Количество элементов можно посмотреть по адресу, указанному в первой строке описания каждой структуры.
жду подсказок или готовый кусок кода... на пвлаб не посылать...
________________
Почти забросил раздел Pw скажем спасибо TBX1n и серверу
ну если я правильно понял что ты пытаешься сделать, то тут изначально идея не правильная... хп ты получишь тока после того как возьмешь цель в таргет, до этого на скок мне помнится эти данные не передаются... это во первых... во вторых... зачем цикл так рано?? ну а в остальном вроде все верно...
Код:
var
hProcess,PID,BytesCount,MaxHP,hp,buf:dword;
i,j:integer;
WndHndl:THandle;
begin
WndHndl:=findwindow(nil,'Perfect World');
GetWindowThreadProcessId(WndHndl, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
for J:=0 to 5 do
begin
for i:=0 to $300 do
begin
ReadProcessMemory(hProcess,ptr(base_addr),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$1C),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$8),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$20),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$18),@buf,4,BytesCount);
//цикл вообще отсюда начинать можно если 8+20+18 записать в отдельную переменную ))
ReadProcessMemory(hProcess,ptr(buf+i*4),@buf,4,BytesCount);
ReadProcessMemory(hProcess,ptr(buf+$4),@buf,4,BytesCount);
//предположим, что хп читается и без таргета )) тогда все верно ))
ReadProcessMemory(hProcess,ptr(buf+HP_OFFSET_addr),@hp,4,BytesCount);
//Соответственно тут мы уже непосредственно выводим.
Edit4.text := IntToStr(hp);
end;
end;
closehandle(hProcess);
но за вычетом мелких недочетов, код то верный )) тока вот J в цикле не учел ))