Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Elad on April 11, 2018, 09:51:54 PM
-
Появилась идея добавить плагин в кликер, немного почитав справку ( на много количество информации не тянет ) решил я написать тестовую .dll на c#, которая будет принимать в себя два числа а выводить их сумму ( тестовая ребят, просто проверить как работает, я знаю, что кликер и так считать умеет ). Постарался соблюсти все рекомендации из справки и на выходе содержимое файла представляло из себя:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dll
{
public class Class1
{
public static int execute(int[] x, int y)
{
return x[0] + x[1];
}
}
}
Сохраняю это все как Dll.dll, перемещаю в папку с кликером и там же создаю следующий сценарий полностью скопированный из справки:
call("Dll.dll", 5, 4)
logwrite($_return1)
HALT
На выходе получаю ошибку при интерпретации строки call("Dll.dll", 5, 4) ...
Да я в курсе, что эта функция бородатая и старая, что ей никто и похоже никогда не пользовался, судя по информации с форума, но у меня появилось одна идея, для решения которой очень бы пригодился именно плагин:
Допустим при помощи CheatEngine ( далее CE) удалось найти в игре адрес интересующего нас параметра ( допустим это x и y координаты моба или предмета в мире игры, как вы понимаете на экране такой информации просто не будет, чтобы считывать ее как картинку ). Но вот засада, этот адрес мало того что меняется при каждом запуске игры, еще и невозможно при помощи смещений привязаться к статичному адресу потому что адрес меняется после смерти моба. Тут остается один выход - Сканить память при помощи маски.
На просторах интернета я нарыл функцию SigScan под c# и немного ее доработал.
Если коротко то эта функция позволяет быстро найти интересующий нас адрес в памяти по заранее приготовленной маске, которая состоит из 2-х частей, первая часть это массив байт, который будет находиться в памяти процесса, вторая - маска для этого массива.
Пример массива { 0x06, 0x00 , 0x03, 0x00, 0x01 }, для него также в функцию подается маска примерно такого вида "xx?xx", где x - байты, которые будут учитываться, а ?, которые нет, на выходе получаем адрес в памяти ...
-
Случайно не линейку ковыряешь?
Я БА и смещения до информации о персонаже нашел, а смещения к координатам мобов пока нет.
Без координат мобов получается бот-ближнего боя бегающий по кругу с наведением по /targetnext, а хотелось сделать мага.
-
Появилась идея добавить плагин в кликер, немного почитав справку ( на много количество информации не тянет ) решил я написать тестовую .dll на c#, которая будет принимать в себя два числа а выводить их сумму ( тестовая ребят, просто проверить как работает, я знаю, что кликер и так считать умеет ). Постарался соблюсти все рекомендации из справки и на выходе содержимое файла представляло из себя:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dll
{
public class Class1
{
public static int execute(int[] x, int y)
{
return x[0] + x[1];
}
}
}
соглашения вызовов надо смотреть или что еще там есть.
так же чето не увидел, где функция execute объявлена как экспортная
в паке версии 4.7 на сайте есть рабочий пример под Visual C++ может там чего почерпнешь
-
Случайно не линейку ковыряешь?
Я БА и смещения до информации о персонаже нашел, а смещения к координатам мобов пока нет.
Без координат мобов получается бот-ближнего боя бегающий по кругу с наведением по /targetnext, а хотелось сделать мага.
Не линейку :)
-
еще раз попробовал заставить работать длл. когда то пытался, ничего не вышло. как и в прошлый раз, взял примеры из v4.7 SE , немного поковырял в дэлфи7, и снова неудача :( . че за .... >:(
код из примера Delphi 7
library cmann_plugin;
uses
Dialogs,
SysUtils;
//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
pIntArr = array[0..0] of Integer;
var
i, sum, tmp: Integer;
_str_par: String;
begin
// _mas - указатель на начало массива параметров integer
// _size - размер массива (число параметров)
sum := 0; _str_par := ''; // инициализация
// Цикл суммирует все принятые параметры
for i:= 0 to _size-1 do
begin
tmp := pIntArr(_mas^)[i]; // приведение указателя к массиву (fuckin delphi ...)
sum := sum + tmp;
_str_par := _str_par + IntToStr(tmp) + ' '; // строка параметров для отчета
end;
result := sum; // присваиваем возвращаемое значение
// отчет
MessageDlg(
'Процедура плагина вызвана успешно!'+#13+
'Переданы параметры: '+_str_par+#13+
'Возвращенная сумма: '+IntToStr(result),
mtInformation, [mbOk], 0
);
end;
//------------------------------------------------------------------------------
// список экспорта
exports execute;
begin
// тело пусто
end.
не знаю как я тестил в прошлый раз и на какой версии кликермана, но как оказалось, во всем виновата версия 4.13... >:( .
на старших версиях я впервые увидел нечно вот такое :D :
тест на разных версиях:
(https://i.imgur.com/Nil9i0z.png)
код км:
CALL("cmann_plugin.dll", 1, 2, 3)
print("result: ", $_return1)
halt
прям чудеса какието, впервые увидел такое в кликермане :D . еще бы немного разобраться в дэлфи, и можно засовывать сложные расчеты и и прочие фишки в длл ::)
-
еще бы немного разобраться в дэлфи, и можно засовывать сложные расчеты и и прочие фишки в длл ::)
:o ???
Я вот как раз взялся все же за dll-ки... А под прочими фишками я бы туда всякие формы запихал. К примеру - форму с чекбоксами...
Только на сколько я понял, кликер, после того, как использует dll, из памяти ее потом не выгружает?
-
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt (https://imgur.com/ZYLJ9Rt)
-
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt (https://imgur.com/ZYLJ9Rt)
-
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt (https://imgur.com/ZYLJ9Rt)
Спс большое. Я хоть понял - как переменные передаются в dll из кликера. Ато я их чистоганом передать все пытаюсь...
-
Я вот как раз взялся все же за dll-ки... А под прочими фишками я бы туда всякие формы запихал. К примеру - форму с чекбоксами...
Только на сколько я понял, кликер, после того, как использует dll, из памяти ее потом не выгружает?
я даже и не в курсе что там насчет форм, и будут ли они работать из длл. ;D я не знаю как формы создавать.
а насчет выгрузки из памяти, напротив, пока функция длл не отработает, то и кликер будет ждать окончания работы этой длл. скорее всего и с формами также будет, пока не закроешь, кликер будет ждать, по крайней мере с диологовыми окнами так. тот пример что я писал выше, который из версии км 4.7, он именно для делфи 7. в делфи 10 он выдает ошибку несуществующего модуля Dialogs, наверно в делфи 10 этот модуль както по другому называется :-\.
Спс большое. Я хоть понял - как переменные передаются в dll из кликера. Ато я их чистоганом передать все пытаюсь...
заметил койчего при приеме параметров из км, если писать вот так:
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[1];
par3 := pIntArr(_mas^)[2];
то при компиляции вылазит ошибка.
но если писать так:
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[_size - 2];
par3 := pIntArr(_mas^)[_size - 1];
то все норм. естественно, это если мы точно знаем сколько параметров должно прийти.
-
а насчет выгрузки из памяти, напротив, пока функция длл не отработает, то и кликер будет ждать окончания работы этой длл
Ну, просто я длл удалить не могу, после запуска ее кликером... Пишет, что типа файл запущен другим приложением.
-
А еще компилятор можно обойти так:
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[_size - _size + 1];
par3 := pIntArr(_mas^)[_size - _size + 2];
-
_size - _size
повеселил :)
-
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[_size - _size + 1];
par3 := pIntArr(_mas^)[_size - _size + 2];
повеселил :)
:)
А че, так более наглядно и понятнее при написании.
Просто если писать так:
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[1];
par3 := pIntArr(_mas^)[2];
то компилятор выдает ошибку.
Я обходил эту ошибку так:
par1 := pIntArr(_mas^)[0];
par2 := pIntArr(_mas^)[_size - 2];
par3 := pIntArr(_mas^)[_size - 1];
Но с вариантом что предложил ya12, сложнее накосячить с элементами.