По поводу выделения моба - нужны viewangles и координаты моба. Прокалькулировать разницу углов, далее аля-аимботом вывести моба по ПКМ на центр и ЛКМ кликнуть по центру. Вот вам и приближение к реальному персу. А не просто селект во все стороны.
Можете кинуть помидором, но я, да и не только я, такое делал - хотя бы мозги размять хорошо.
Вот это как раз по моему чушь получается. Мозги размять можно в процессе поиска адресов. А кликать мышкой... боты на Autoit еще и клавиатуру жмут.. не проще ли тогда бомжа какого нибудь усадить- он будет бегать, мобов мочить, чиниться, лут продавать :-D
Я себе задачу поставил, чтобы мой бот не прикасался к клавиатуре и мышке. чтобы можно было во первых- хоть 10 окон открыть с игрой, во вторых, чтобы у меня не скакали буквы, не залипали клавиши Alt Shift Ctrl- болезнь Autoitовских ботов. ну и тд. Кроме того, процессор они жрут непомерно.. в общем, стараюсь рациональнее подойти))
Один раз попариться- и потом наслаждаться простотой и удобством.
И с другими поделиться благами труда.
Может я не прав - хотелось-бы быть не правым .. НО..
Не в обиду тем кто програмит на Атоите, действительно язык этот характеризуется как "Интерпретатор" команд .. Он скриптовый и в большей степени напоминает Basic. Конечно его создатели вложили в него возможность вставки кодов на Ассемблере и обращение к процессам других приложений это его достоинства, так-же куча операторов для работы с окнами и элементами управления. В конечном итоге он формирует EXE файл, то-есть машинный код. Все вроде-бы как у Языков Высокого уровня, таких как Дельфи, Визул С++ Борланд С++.
Но дело в том что Код его машинный (псевдо-код) - управляет не машиной а средствами Системы Windows ее WinApi функциями, вызовами и т.п. - то есть интерпретирует скриптовые операторы в команды манипулирования системой а та уже в свою очередь управляет процессором.
Языки высокого уровня компилируют настоящий машинный код - лучше которого на этой планете еще не придумали.. Они не мешают системе -
Не отвлекают ее не дергают ее за веревочки - поэтому настоящий продукт програмного обеспечения должен быть написан на них ..
Я тоже начал с Ботом с Автоита, ........оОчень можно что сделать но
попробывав его на практике - решил перевести проект на VC++ - не потому что я не достиг того чего хотел - нет, потому-что это не практично для системы и .... стыдно - писать серъезную вещь на скрипте ..
Вот чушь написал.
Языки высокого уровня так же работают с API (не только WinAPI, а вобще с очень много какими API). И точно так же для управления окнами, доступом в память чужого процесса "дёргают систему за ниточки".
Единственная принцпиальная разница между нормальным языком, код которого компилируется сразу в машинный и скриптового, - это то что основные (базовые) операции компилируются в исполняемый машинный код. А в скриптовых языках либо парсится скрипт и исполняется команда за командой, либо сначала текст программы переводится в промежуточный байт-код и потом этот байт-код исполняется.
В AutoIt как раз используется байт-код. Т.е. экзешник написанный на автоите состоит из 2-х частей:
- самого интерпретатора и исполнителя байт-кода,
- а так же твоей программы превращённой в байт-код.
Если посмотришь бинарник программы, то увидишь, что после манифеста в ней и таблицы используемых dll, идёт:
последоватльность байт: A3 48 4B BE 98 6C 4A A9 99 4C
визуально смотрится в Far как: ?HK??lJcTL
Вот с этого места и до конца файла зашифрованный байт-код программы на AutoIt.
Кстати, байт-код используют такие платформы как Java и .Net.
Там твоя программа так же превращается из текста в байт-код. Только вот есть небольшие отличия в современном развитии этих платформ. В момент первого вызова некоего кода (метода обычно, там же всё построенно на классах) в них - он динамически компилируется в машинный код и тут же исполняется. При повторном вызове уже используется данный компилированный код. Ну это до тех пор пока программу не закрыл и она у тебя в памяти.
ну да, может не так грамотно изложил, но почему-же тогда псевдо-код этот или Байт-код - нагружает систему приложения открытые в момент работы EXE от Автоита - глючат, они - то тут причем - пусть сам бы и глючил ..
может Автоит еще только развивается, но ждать некогда - надо работать ..
а разве - проект на VC++ например не компилируется в машинный код вместе с API и другими функциями и библиотеками в одну кучу и не обращается к системе при работе эксешки а исполняет эти функции отдельно (какие нужны были он их отдельно компилит в себя) ???
ну да, может не так грамотно изложил, но почему-же тогда псевдо-код этот или Байт-код - нагружает систему приложения открытые в момент работы EXE от Автоита - глючат, они - то тут причем - пусть сам бы и глючил ..
может Автоит еще только развивается, но ждать некогда - надо работать ..
Тут больше глючит интерпретатор этого байт-кода. Либо кривая реализация самого исполняемого скрипта. Если вы в VC++ не будете корректно с памятью работать - вы ещё и не такие глюки огрести можете.
Quote:
Originally Posted by origmas
а разве - проект на VC++ например не компилируется в машинный код вместе с API и другими функциями и библиотеками в одну кучу и не обращается к системе при работе эксешки а исполняет эти функции отдельно (какие нужны были он их отдельно компилит в себя) ???
Немного оффтоп всё это, давай лучше в приват обсудим как и что там на низком уровне работает.
Вот это как раз по моему чушь получается. Мозги размять можно в процессе поиска адресов. А кликать мышкой... боты на Autoit еще и клавиатуру жмут.. не проще ли..........
Тем-не менее, сколько-то страниц назад кто-то ныл - давай ему селект не отличающийся от настоящего. И его поддерживали.
Разумеется, что лично я - не за посыл нажатий клавиш/кручение мыши, а за непосредственное исполнение процедуры в клиенте.
Пристали тут к этому автоиту.. небось из-за того что первый исходник бота был получен именно на нём
Был-бы сишный или на дельфях, сидели бы там
Итак, в приложении:
от автора WangMeiWG
(который по ходу знает меньше нашего, куда сунулся, тк он юзал готовенькое) PWI-шный element-client с которым вроде как работает WangMeiWG
Архив проекта исходниками автоопределения смещений
(аля ntKid receiver)
и статья, описывающая принцип проекта, идею, так сказать.
проэктовские надписи и комментарии я перевел гугл-транслейтом.
статью переводите сами. Она переводится весьма приблизительно, но смысл понятен. Честно говоря, очень красиво придумали.
еще мне этот тип дал контакт чела, который собсна все эти адреса копал.
Но тот не говорит по английсски. А через гугл.. как то стремно))
В общем, это на будущее пока заметка.
Короче, прога выдает список офсетов и inject-адресов.
Принцип действия- поиск последовательности байтов прямо в exe, рассчет адреса который будет в памяти по сдвигу в exe.
Это несомненно гениальная идея, чтобы до нее додуматься, потребовалось года два наверное. Есть еще одна проблема, до которой можно додуматься еще через пару лет - в зависимости от билда екзешника последовательность кодов может слегка меняться (адреса переходов, регистры, смещения на стеке). Поэтому бинарный поиск неплохо бы проводить как минимум с маской.
Но это непосильная задача походу.
поиск по маске для желающих
алгоритм не совсем совершенен, но вполне достаточен
Code:
/**
* Find a sequence of data bytes in memory
*
* @param pid id of process to find of
* @param va_hint start address to search from
* @param lookupLength length of data to lookup
* @param pattern pattern of data bytes
* @param mask mask of pattern bytes - any non-zero value indicates byte to match
* @param patternLength length of pattern data
*
* @return byte * address of last byte of first matched pattern
* NULL if pattern was not found
*/
byte * findPattern( DWORD pid
, uintptr_t va_hint
, int lookupLength
, const byte *pattern
, const byte *mask
, int patternLength)
{
uintptr_t exeBaseAddr_ = (uintptr_t) GetModuleHandle(NULL);
uintptr_t curntAddr = va_hint + exeBaseAddr_;
int fragmentLen = 0;
bool found = false;
MemoryReader memory(pid);
while ( !found && (lookupLength > 0) )
{
if (mask[fragmentLen] != 0)
{
// nonzero mask, compare data
if (memory[curntAddr] == pattern[fragmentLen])
{
fragmentLen ++; // data ok, continue search
}
else
{
fragmentLen = 0; // data mismatch, reset position
}
}
else
{
// zero mask, just increment position
fragmentLen ++;
}
if (fragmentLen >= patternLength)
{
found = true;
break;
}
curntAddr ++;
lookupLength --;
}
if ( !found )
{
curntAddr = NULL;
}
return (byte*)curntAddr;
}
muzhig
Возможно, версия клиента у меня другая (хотя мало вероятно), но по адресу $42a6e0 нет никакой функции. Далее
p1:=aPParams.Param1 -> p1:=aPParams^.Param1
+ желательно занести p1 в регистр и затем уже в стек, т.е. вместо push p1 ->
mov eax, p1
push eax