Затем что, при смене фокуса окна клиент опять 1 сменит на 0.
Ага, ясно, спасибо.
Вопрос к fds255:
WriteProcessMemory(hProcess,ptr($00B9070C),@unfree ze,1,temp);
Почему мы записываем 1 байт? По моему мнению там должно быть sizeof(DWORD), т.е. 4 байта...
Почему мы записываем 1 байт? По моему мнению там должно быть sizeof(DWORD), т.е. 4 байта...
Не fds255, но всё же отвечу. Потому, что правим лишь один байт с 0 на 1, если попытаться записать 4 байта, то не получим никакого анфриза, а скорее всего крэш клиента. Можешь проверить с помощью SizeOf и после записи посмотреть в lpNumberOfBytesWritten, у тебя это temp, а еще легче, посмотри чему у тебя равен @unfreeze и посчитай сколько там байт...
Sirioga, перезапись значения с sizeof(DWORD) (4 байта), размораживает окно нормально и краха клиента не вызывает, да и вообще буфер у нас содержи целочисленную переменную, которая на наших операционных системах равна 4 байтам и мы ее записываем в память, я не вижу там(в этой функции) никаких операций работы с байтами(битами)...
Саму функцию замораживающую окно, пока не патчил, поэтому пока приходится постоянно вызывать ф-цию перезаписи значения в памяти...
hProcess [in]
A handle to the process memory to be modified. The handle must have PROCESS_VM_WRITE and PROCESS_VM_OPERATION access to the process.
lpBaseAddress [in]
A pointer to the base address in the specified process to which data is written. Before data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for write access, and if it is not accessible, the function fails.
lpBuffer [in]
A pointer to the buffer that contains data to be written in the address space of the specified process.
nSize [in] The number of bytes to be written to the specified process.
lpNumberOfBytesWritten [out]
A pointer to a variable that receives the number of bytes transferred into the specified process. This parameter is optional. If lpNumberOfBytesWritten is NULL, the parameter is ignored.
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError. The function fails if the requested write operation crosses into an area of the process that is inaccessible.
Так ладно, приступим к тому, что у меня вообще не получалось - к инжекту асм кода.
Фунцкию инжекта я напишу, а вот где бы взять асм код:
1) простенький - для проверки рабочести;
2) для перемещения в координаты карты (пешком)...?
Просмотрев пол форума, я увидел что, допустим в гайде по написанию бота человек пишет через отсылку пакетов, а в гайде по инжекту от Dinmaite используется asm вставка (я ее очень опасаюсь, но нужно когда-нибудь это сделать). Да, и наверняка у Dinmaite асм вставки(адреса) уже устаревшие. Поделитесь пожалуйста асмом...
Как вставлять спойлеры на форуме?([SPOOLER][/SPOILER] не работает(()
Добавлено через 15 часов 28 минут
Все-таки, у кого как реализована ф-ция перемещения? С помощью пакетов или асм вставки?
Последний раз редактировалось Xantrax2150198; 24.05.2013 в 15:22.
Причина: Добавлено сообщение
Sirioga, перезапись значения с sizeof(DWORD) (4 байта), размораживает окно нормально и краха клиента не вызывает
Это да, я просто подумал ты спрашиваешь именно о пропатчивании, а не о перезаписи. В общем неверно тебя понял. Еще мне не ясна такая вещь - ты постоянно, приводишь в пример sizeof(dword), почему же ты не поставишь sizeof в саму функцию WriteProcessMemory? Конечно это будет не совсем правильно с точки зрения предназначения и возможно запутает в будущем, но универсально и успокоит тебя...
Цитата:
Сообщение от Xantrax2150198
Как вставлять спойлеры на форуме?([SPOOLER][/SPOILER] не работает(()
почему же ты не поставишь sizeof в саму функцию WriteProcessMemory?
Я всегда ставлю sizeof(), я ж вроде так и пишу (по-русски): "перезапись значения с sizeof(DWORD)", естественно, что я ее вставляю...
На самый главный вопрос так и не ответил, как перемещение осуществлять?
Я всегда ставлю sizeof(), я ж вроде так и пишу (по-русски): "перезапись значения с sizeof(DWORD)", естественно, что я ее вставляю...
Ок, значит я в упор не понимаю всего того, о чем ты пишешь, а мой риторический вопрос "зачем" - просто не имеет смысла
Цитата:
Сообщение от Xantrax2150198
На самый главный вопрос так и не ответил, как перемещение осуществлять?
Я и не старался на него ответить, потому, что я не знаю. Судя по теме Dinmaite это занятие не из простых, с точки зрения понимания о чем идёт речь в этой вставке, да и лично у меня не было нужды заниматься именно этим, по этому даже сказать что либо точно не могу.
А собственно в связи с чем возникла необходимость перемещения?
А собственно в связи с чем возникла необходимость перемещения?
Ну как, вот допустим вар, первая автоатака, если ее использовать через отсылку пакетов действует так:
1) перс бежит к мобу и ударяет его.
А если я отсылаю пакет с его первой атакой (там название - уровень 1), то он действует так:
1) если моб далеко, он мне пишет в чат - неизвестное умение, т.е. нужно сначала подбежать к мобу на расстояние действия скилла и применить скилл;
2) если моб близко, то все нормально.
Ну, здесь ладно, можно сделать так:
1) использую автоатаку;
2) использую скилл (но и то, пока он подбежит к мобу это время пройдет). Сейчас использование скиллов у меня осуществляется через отправку нажатия клавиш окну игры (моветон, как скажут многие здесь :)), НО! если использовать скилл через отправку пакетов, а не через нажатие клавиш, то он не бежит к мобу, а использует чисто скилл и идентификатор (wid) моба, и если моб далеко, то он не бежит к нему.
И еще один момент, понимаешь, я запущу бота, уйду куда-нибудь(ненадолго), а он (если мобы расположены прилично друг от друга) может убежать фиг знает куда, ведь перемещается он от моба к мобу, а хотелось бы что бы если в радиусе (к примеру) 100-500 метров мобов нет - возвращаемся в такие-то координаты(точку) и продолжает сканировать на наличие в этом радиусе.
Еще, а если у меня друидка, она кастер, если я напишу использование скилла и моб не в радиусе действия заклинания, то мне в чат выдастся просто - неверное заклинание.
Хорошо, он в зоне действия, а как лут собирать? Ведь нужно добежать сначала до той точки где умер моб... Хотя если реализовать поиск лута как осуществляется поиск мобов и юзать скилл подбора лута, то мне кажется она будет собирать....
Последний раз редактировалось Xantrax2150198; 24.05.2013 в 19:32.
И еще один момент, понимаешь, я запущу бота, уйду куда-нибудь(ненадолго), а он (если мобы расположены прилично друг от друга) может убежать фиг знает куда, ведь перемещается он от моба к мобу, а хотелось бы что бы если в радиусе (к примеру) 100-500 метров мобов нет - возвращаемся в такие-то координаты(точку) и продолжает сканировать на наличие в этом радиусе.
Для того, чтобы перс не убежал фиг знает куда, нужно при сканировании мобов, определять удаление их от установленной, тобой, точки фарма, т.е. если допустим все мобы при сканировании находятся дальше установленного тобой расстояния от точки фарма, то отправляешь перса к точке фарма, и снова сканиш мобов, как-то так )))
Цитата:
Сообщение от Xantrax2150198
Хорошо, он в зоне действия, а как лут собирать? Ведь нужно добежать сначала до той точки где умер моб... Хотя если реализовать поиск лута как осуществляется поиск мобов и юзать скилл подбора лута, то мне кажется она будет собирать....
Подолью масла в огонь, так сказать:
Нужно следить, за тем, что если в боте не будет выбора, какой лут собирать, то перс при забитом инвентаре будет постоянно бегать к одному и тому же предмету, но взять его не сможет, выдавая себя и тратя время )))
Написал тоже самое, что и я только немного другими словами.
Для этого и нужно передвижение по координатам, разве нет?
Добавлено через 2 часа 26 минут
Ммм, странно, как мне найти HP своего пета? Я так понимаю так же как и моба, только изменить проверку условия if(mobType(i)==4), но у меня что-то ничего не находит...
Хорошо, как найти оффсет используя CheatEngine? Я нашел адресс соответствующий значению HP пета.
Изменил значение, в игре значение тоже изменилось.
Итак это тот адрес, далее Find out what writes to this adress, а дальше что, как действовать?
Спасибо подсказкам CheatEngine я нашел смещение до HP пета.
Люди, не работает глобальная разморозка окна, клиент просто виснет((, какие адреса ставить то для глобальной разморозки?
Глобально - это значит пропатчил функцию и при смене фокуса с окна игры на другое окно, не надо больше ничего записывать никуда в память, т.е. разморозил окно игры раз и навсегда, пока существует процесс игры...
Локальная разморозка - это когда ты с каждой отправкой окну (допустим) нажатия клавиши еще и перезаписываешь значение в памяти(флаг) отвечающее за заморозку окна...
Цитата:
Лично я размораживаю записью по адресу 436986, вместо test al,al - mov al,1.
Это что? Асм код? А через WriteProcessMemory() в какой адрес и что записывать?
P.S. по поводу твоего поста №38 и моего ответа на него комментарии какие-нибудь будут?
Последний раз редактировалось Xantrax2150198; 26.05.2013 в 16:44.
Присмотрелся к твоему коду, и подумать не мог, что ты догадаешься использовать SizeOf в таком отвратительном ключе, то что он может и уместен в некоторых случаях, не говорит о том, что нужно вписывать внутрь тип данных, там должно быть имя переменной, даже если ты заранее знаешь какой тип данных у неё, но даже это не помогло бы, т.к. SizeOf всё равно выдавал бы 4 байта. Отсюда и вывод, вместо записи 2х байт, ты записал 4 байта. SizeOf для такого дела, нужно убрать, либо патчить по 1 байту, с соответствующим типом данных.
Цитата:
Сообщение от Xantrax2150198
Это что? Асм код? А через WriteProcessMemory() в какой адрес и что записывать?
Код на WinAPI + FreeBASIC
Код:
#include "windows.bi"
Dim PID As UInteger
Dim hProcess As Handle
Dim hWindow as hWnd
Dim Address as dWord = &h436986
Dim lpBuffer As dWord = &h01B0
hWindow = FindWindow("ElementClient Window", "Perfect World")
GetWindowThreadProcessId(hWindow, @PID)
if pid <> 0 then
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
WriteProcessMemory(hProcess, Address, @lpBuffer, 2, NULL)
CloseHandle(hProcess)
print "Succes"
else
print "Can't find game window"
end if
sleep