Author Topic: Плагины :)  (Read 4959 times)

0 Members and 1 Guest are viewing this topic.

Elad

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Плагины :)
« on: April 11, 2018, 09:51:54 PM »
Появилась идея добавить плагин в кликер, немного почитав справку ( на много количество информации не тянет ) решил я написать тестовую  .dll на c#, которая будет принимать в себя два числа а выводить их сумму ( тестовая ребят, просто проверить как работает, я знаю, что кликер и так считать умеет ). Постарался соблюсти все рекомендации из справки и на выходе содержимое файла представляло из себя:

Code: [Select]
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, перемещаю в папку с кликером и там же создаю следующий сценарий полностью скопированный из справки:

Code: [Select]
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 - байты, которые будут учитываться, а ?, которые нет, на выходе получаем адрес в памяти ...

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Re: Плагины :)
« Reply #1 on: April 12, 2018, 11:02:35 AM »
Случайно не линейку ковыряешь?
Я БА и смещения до информации о персонаже нашел, а смещения к координатам мобов  пока нет.

Без координат мобов получается бот-ближнего боя бегающий по кругу с наведением по /targetnext, а хотелось сделать мага.

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Плагины :)
« Reply #2 on: April 12, 2018, 06:24:52 PM »
Появилась идея добавить плагин в кликер, немного почитав справку ( на много количество информации не тянет ) решил я написать тестовую  .dll на c#, которая будет принимать в себя два числа а выводить их сумму ( тестовая ребят, просто проверить как работает, я знаю, что кликер и так считать умеет ). Постарался соблюсти все рекомендации из справки и на выходе содержимое файла представляло из себя:

Code: [Select]
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++ может там чего почерпнешь

Elad

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: Плагины :)
« Reply #3 on: April 12, 2018, 08:00:06 PM »
Случайно не линейку ковыряешь?
Я БА и смещения до информации о персонаже нашел, а смещения к координатам мобов  пока нет.

Без координат мобов получается бот-ближнего боя бегающий по кругу с наведением по /targetnext, а хотелось сделать мага.

Не линейку :)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Плагины :)
« Reply #4 on: April 23, 2018, 07:11:04 PM »
еще раз попробовал заставить работать длл. когда то пытался, ничего не вышло. как и в прошлый раз, взял примеры из v4.7 SE , немного поковырял в дэлфи7, и снова неудача  :( .   че за ....  >:(

код из примера Delphi 7
Code: (clickermann) [Select]
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 :

тест на разных версиях:

код км:
Code: (clickermann) [Select]
CALL("cmann_plugin.dll", 1, 2, 3)
print("result: ", $_return1)
halt

прям чудеса какието, впервые увидел такое в кликермане :D . еще бы немного разобраться в дэлфи, и можно засовывать сложные расчеты и и прочие фишки в длл  ::)


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Плагины :)
« Reply #5 on: July 18, 2018, 02:37:41 PM »
еще бы немного разобраться в дэлфи, и можно засовывать сложные расчеты и и прочие фишки в длл  ::)
:o ???
Я вот как раз взялся все же за dll-ки... А под прочими фишками я бы туда всякие формы запихал. К примеру - форму с чекбоксами...
Только на сколько я понял, кликер, после того, как использует dll, из памяти ее потом не выгружает?
« Last Edit: July 18, 2018, 02:41:51 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Плагины :)
« Reply #6 on: July 18, 2018, 04:15:58 PM »
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt
Я не ду... Потому и не бу...

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Re: Плагины :)
« Reply #7 on: July 18, 2018, 04:19:08 PM »
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Плагины :)
« Reply #8 on: July 18, 2018, 04:27:01 PM »
Народ, а хде эту статью искать? Я что-то не нахожу ее нигде...
https://imgur.com/ZYLJ9Rt
Спс большое. Я хоть понял - как переменные передаются в dll из кликера. Ато я их чистоганом передать все пытаюсь...
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Плагины :)
« Reply #9 on: July 18, 2018, 09:54:04 PM »

Я вот как раз взялся все же за dll-ки... А под прочими фишками я бы туда всякие формы запихал. К примеру - форму с чекбоксами...
Только на сколько я понял, кликер, после того, как использует dll, из памяти ее потом не выгружает?

я даже и не в курсе что там насчет форм, и будут ли они работать из длл.  ;D я не знаю как формы создавать.
а насчет выгрузки из памяти, напротив, пока функция длл не отработает, то и кликер будет ждать окончания работы этой длл. скорее всего и с формами также будет, пока не закроешь, кликер будет ждать, по крайней мере с диологовыми окнами так. тот пример что я писал выше, который из версии км 4.7, он именно для делфи 7. в делфи 10 он выдает ошибку несуществующего модуля Dialogs, наверно в делфи 10 этот модуль както по другому называется  :-\.



Спс большое. Я хоть понял - как переменные передаются в dll из кликера. Ато я их чистоганом передать все пытаюсь...

заметил койчего при приеме параметров из км, если писать вот так:
Code: (clickermann) [Select]
par1 :=  pIntArr(_mas^)[0];
par2 :=  pIntArr(_mas^)[1];
par3 :=  pIntArr(_mas^)[2];
то при компиляции вылазит ошибка.

но если писать так:
Code: (clickermann) [Select]
par1 :=  pIntArr(_mas^)[0];
par2 :=  pIntArr(_mas^)[_size - 2];
par3 :=  pIntArr(_mas^)[_size - 1];
то все норм. естественно, это если мы точно знаем сколько параметров должно прийти.

« Last Edit: July 18, 2018, 09:56:35 PM by dramster »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Плагины :)
« Reply #10 on: July 19, 2018, 06:41:15 AM »
а насчет выгрузки из памяти, напротив, пока функция длл не отработает, то и кликер будет ждать окончания работы этой длл
Ну, просто я длл удалить не могу, после запуска ее кликером... Пишет, что типа файл запущен другим приложением.
Я не ду... Потому и не бу...

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Re: Плагины :)
« Reply #11 on: September 13, 2018, 10:53:31 AM »
А еще компилятор можно обойти так:

Code: (clickermann) [Select]
    par1 :=  pIntArr(_mas^)[0];
    par2 :=  pIntArr(_mas^)[_size - _size + 1];
    par3 :=  pIntArr(_mas^)[_size - _size + 2];

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Плагины :)
« Reply #12 on: September 13, 2018, 04:53:50 PM »
Quote
_size - _size
повеселил  :)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Плагины :)
« Reply #13 on: September 13, 2018, 06:21:48 PM »
Code: (clickermann) [Select]
par1 :=  pIntArr(_mas^)[0];
par2 :=  pIntArr(_mas^)[_size - _size + 1];
par3 :=  pIntArr(_mas^)[_size - _size + 2];
повеселил  :)
:)
А че, так более наглядно и понятнее при написании.

Просто если писать так:
Code: (clickermann) [Select]
par1 :=  pIntArr(_mas^)[0];
par2 :=  pIntArr(_mas^)[1];
par3 :=  pIntArr(_mas^)[2];
то компилятор выдает ошибку.

Я обходил эту ошибку так:
Code: (clickermann) [Select]
par1 :=  pIntArr(_mas^)[0];
par2 :=  pIntArr(_mas^)[_size - 2];
par3 :=  pIntArr(_mas^)[_size - 1];

Но с вариантом что предложил ya12, сложнее накосячить с элементами.