Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - ya12

Pages: [1] 2
1
Поскольку прошлую тему удалили, выкладываю еще раз.

Получение базового адреса (БА) от адреса загруженной в память DLL.

Delphi7
Code: (Delphi7) [Select]
// Основное тело функции, идет на экспорт, вызывается из кликера

function execute(_mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  Snap: THandle;
  M32: TModuleEntry32;
  st,st1: string;
begin
  result:=0;
  st := 'Engine.dll';   
  // имя DLL которую нужно найти, чувствительно к регистру.
  // _mas  - указатель на начало массива параметров integer
  // _size - размер массива (число параметров)

  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pIntArr(_mas^)[0]);
  //if (Snap = 0) then
    //Exit;

  //ShowMessage(intTostr(snap));
  if Module32First(Snap, M32) then
    begin
      repeat
        st1:=M32.szModule;
        //ShowMessage(st1);
        if st1 = st then
          begin
            //ShowMessage(intTostr(Cardinal(M32.modBaseAddr)));
            Result := Cardinal(M32.modBaseAddr); //
            Break;
          end;
      until not Module32Next(Snap, M32);
    end;
  CloseHandle(Snap);
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.


Code: (clickermann) [Select]
      $_pid=HGETPID($_hwnd)
      call("BA_Engine.dll",$_pid)
      $_adr_Engine = $_return1

Поиск BA и смещения выполняется Cheat Engine.
Данные в памяти программы можно визуально определить и структурировать в шаблон с помощью ReClass2016.
https://disk.yandex.ru/d/YsInZJ3jJEh5GQ

Динамический массив в памяти выглядит так:

абсолютный адрес        указатель на начальный адрес
00000000                       <какое то число похожее на адрес>
00000001                       <число от 0 и больше; 0-первый элемент массива>

Увеличивая и уменьшая количество объектов хранящихся в динамическом массиве можно найти адрес, где храниться счетчик массива. В СЕ ищем инструкцию обращающуюся к этому адресу.
Для каждой найденной инструкции смотрим дизассемблер и пытаемся проследить как формируется адрес где хранится счетчик массива. Если результат записывается не в один и тот же регистр, то цепочка смещений разматывается легко.
Если до БА цепочка смещений не просматривается, то адрес до которого удалось определить смещения ищется в СЕ, определяются и дизассемблируются инструкции .

В итоге должно получится:
[[адр.DLL+смещение]+смещение]+смещение и тд]=счетчик массива

[0а00с561]=содержимое памяти с адресом 0а00с561

https://disk.yandex.ru/d/abXrHf4jzqJLyQ
По ссылке образец структурирования данных в памяти, смотреть через ReClass - Edit - Start_TO или Start_User.
TO - таблица объектов, не все объекты в таблице имеют тип User
User - указатель на таблицу персонажа, у моба структура аналогичная

2
Ошибки / 4.13.014 Проблема с выводом в лог.
« on: December 16, 2020, 09:35:07 AM »
БА и смещения(5 шт) найдены в СЕ. Структура в Reclass. Адреса стабильны. Раз в две секунды считываю данные из памяти игрушки и вывожу в лог: БА и всю цепочку смещений. То все ОК, то в лог выводиться БА, а вместо адресов смещений пусто (нет даже нулей). Через некоторое время вывод в лог, то восстанавливается, то опять отваливается.

1. Есть ли ограничения на вывод в ЛОГ?
2. Какой предельный размер программы на КМ?
3. Максимальное количество потоков?

ps Со считыванием из памяти других данных проблем нет. Если цепочка смещений не стабильна, то хотя бы нули должны быть, а их нет.

3
Ошибки / WNDPOS x32 ошибка при hwnd > 2147483647
« on: November 28, 2020, 08:42:17 AM »
WNDPOS x32 ошибка при hwnd > 2147483647, потому что число в 32 бита не влезает.
В чем именно ошибка КМ не сообщает, поэтому сообразил не сразу. Остальные процедуры и функции не проверял.

4
Здравствуйте.
Помогите с переводом десятичного числа во float (32 битный формат IEEE 754).

ps: Хочу научить бота запрыгивать на камни.
ps2: Dramster формула по переводу float в десятичное число отлично работает.

5
В AutoIT есть ControlSend. С помощью него можно отправить нажатие клавиши в окно без фокуса (отдельно задается продолжительность нажатия клавиши). Защита агрится, я ее придушил (на сколько качественно время покажет).

Есть ли аналог команды в Кликермане или Дельфи?
 

6
Code: (delphi) [Select]

library GetFocus1;
uses
  TlHelp32, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute(_mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  Currentid, id:DWORD;
begin
  id := GetWindowThreadProcessId(GetForegroundWindow, nil);
  Currentid := GetCurrentThreadId;
  AttachThreadInput(Currentid, id, true);
  result:=GetFocus;
  AttachThreadInput(Currentid, id, false);
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.



Code: (clickermann) [Select]
call("GetFocus1.dll")
print($_return1)
halt

7
По умолчанию: первый клик левой кнопкой на не активном окне переводит на него фокус. Не большая задержка. Второй клик  выполнение действия.

Нашел где внести изменения в памяти программы, после чего механизм обработки нажатий левой кнопки мышки ломается до перезагрузки программы (если вернуть как было перестают обрабатываться нажатия левой кнопки мыши).

После изменения первый клик левой кнопкой мыши одновременно переводит фокус и выполняет действие. Т.е. можно кликать по не активным окнам без задержек (есть глюк, периодически камера переключается к виду от первого лица).

Вопрос это фича конкретной программы т.е. придется каждый раз вносить изменения или можно изменить поведение мышки со стороны ОС?

8
Поймал ошибку. CALL при вызовах в нескольких потоках, периодически возвращает значение $_return1 в другой поток.
В общем нужны или локальные переменные или в явном виде указывать в какую переменную возвращать.

Code: (Логи) [Select]
22:47:23 --------------------START
22:47:23 ->ТО
22:47:24 1111
22:47:24 1211
22:47:25 1211
22:47:25 1011
22:47:25 1011
22:47:26 ТО->
22:47:26 ->ТО
22:47:27 1111
22:47:27 1211
22:47:28 1211
22:47:28 1011
22:47:29 1011
22:47:29 ТО->
22:47:29 ->ТО
22:47:30 1111
22:47:30 1211
22:47:31 1211
22:47:31 1011
22:47:32 1011
22:47:32 ТО->
22:47:32 ->ТО
22:47:33 1111
22:47:34 1211
22:47:34 1211
22:47:35 1011
22:47:35 1011
22:47:35 ТО->
22:47:35 ->ТО
22:47:36 1111
22:47:37 1211
22:47:37 1211
22:47:38 1011
22:47:38 1011
22:47:39 ТО->
22:47:39 ->ТО
22:47:40 1111
22:47:40 1211
22:47:40 1211
22:47:41 1011
22:47:41 1011
22:47:42 ТО->
22:47:42 ->ТО
22:47:43 1211
22:47:43 1211
22:47:44 1211
22:47:44 1011
22:47:44 1011
22:47:45 ТО->
22:47:45 ->ТО
22:47:46 1211
22:47:47 1211
22:47:48 1001
22:47:49 1011
22:47:50 108979 <------------- тут должен был быть 4х значный код, а получил координаты Y
22:47:51 ТО->
22:47:51 ->ТО
22:47:53 1211
22:47:53 1001
22:47:54 1211
22:47:54 1011
22:47:55 1011
22:47:56 ТО->
22:48:02                     -F3

9
При попытке оптимизации кода, уперся в ограничение размера блока читаемой информации.
Желательно снять ограничения в READMEM на SIZE, для чтения текстовых данных или добавить новую команду для чтения текстовых данных из памяти процесса.

10
Есть список нужных имен. Из памяти процесса по 2 байта читаются коды букв, до тех пор пока не 00 00. Преобразуются в символы и объединяются в $_name.
Если присутствует символ с кодом 39->' сравнение строк приводит к ошибке. Приходится его пропускать.

Кусок кода
Code: (clickermann) [Select]
                     $_name = ""
                     $_kb = readmem($_pid, ($_addr_zap4 + 0x0000001C), 2)
                     $b = 0
                     WHILE ($_kb != 0)
                        if($_kb!=39)  //  <--- см тут
                           $_bukva = char($_kb)
                           $_name = strconcat ($_name, $_bukva)
                        end_if
                        $b = $b + 2
                        $_kb = readmem($_pid, ($_addr_zap4 + 0x0000001C + $b), 2)
                     end_cyc
                     
                     for($r=0, $r < $_kol_name)  //несколько имен
                        if($arr_name[$r] = $_name) //проверка на совпадение<--см тут

11
Общие вопросы / Работает ли SETVAR?
« on: November 06, 2018, 04:38:25 PM »
Code: (clickermann) [Select]

$_n = 1
$a = 20
$_ar_id[$_n] = 12345678
$id = $_ar_id[$_n]
$tmp = STRCONCAT("$id_", $id)
define($tmp)

SETVAR($tmp, $a) //на этой строке выдает ошибку

halt

12
Нужен совет, как подсчитать количество определенного цвета в многоугольной области. Область задана последовательностью координат Х,Y. Код на кликере или дельфи.

13
Code: (Delphi) [Select]
library poligon32;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, stdctrls, extctrls;

// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  bp:Tcanvas;
  pol: array of TPoint; //x,y - это массив указателей на координаты вершин (количество не известно). //Однако при большом количестве координат может быть затык, потому что при выделения памяти для //новой точки переписываются в новую область памяти все предыдущие

  btm: TBitMap;
  mc: integer; //цвет точки
  i: integer;  //счетчик в массиве указателей переданных в DLL (0-первый эл.)
  n: integer;  //счетчик вершин многоугольника в динамическом массиве(0-первая, 1-вторая и тд)
begin
  // _mas  - указатель на начало массива параметров integer
  // _size - размер массива (число параметров)
  btm := TBitMap.create;

  btm.Width:=pIntArr(_mas^)[_size-2];       //x
  btm.Height:=pIntArr(_mas^)[_size-1];      //y

  i:=2; //с него начинаются координаты вершин многоугольников
  n:=-1;
  with btm.Canvas do
  begin

    while pIntArr(_mas^)[i]<>-3 do
    begin
      if ((pIntArr(_mas^)[i]<>-2) and (pIntArr(_mas^)[i]<>-1))
      then
        begin
          n:=n+1;
          SetLength(pol, n+1);
          pol[n].X := pIntArr(_mas^)[i];
          pol[n].Y := pIntArr(_mas^)[i+1];
          //ShowMessage('i='+IntToStr(i+1)+' n='+IntToStr(n+1)+' x='+IntToStr(pol[n].X)+' y=' + IntToStr(pol[n].Y));
        end
      else
        begin
          //ShowMessage('i=' + IntToStr(i+1)); //i счет от 1
          if pIntArr(_mas^)[i]=-1 then
            begin
              Brush.Color:= clYellow;
              pen.Color := clYellow;
            end;
          if pIntArr(_mas^)[i]=-2 then
            begin
              Brush.Color:= clWhite;
              pen.Color := clWhite;
            end;
          Polygon(pol);
          n:=-1;
          pol:=nil;
        end;
      i:=i+2;
    end;
    mc:= Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]];//:=clRed;
  end;

  if pIntArr(_mas^)[i+1]=-4 then
  begin
    //просто красная точка малозаметна, рисуем красный крест
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0]+1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]+1]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0]-1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
    btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]-1]:=clRed;
    bp:=Tcanvas.create();
    bp.Handle:=getDC(0);// присваиваем идентификатор контекста устройства вывода
    bp.Draw(1024,0,btm);
    bp.Free;
  end;

  btm.Free;

  if mc = 65535   //желтый
    then  result:= 1   //1-разрешенная область
    else  result:= 0;  //0-запрещенная область
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.




Code: (clickermann) [Select]
// в 0,1 элементе x,y-координаты точки (красный)
// предпоследний, последний элемент массива (Width,Height TBitMap) X,Y размеры полигона для рисования
//-1,-1 конец координат разрешенной области (желтый)
//-2,-2 конец координат запрещенной области (белый)
//-3 конец всех координат, если после него идет -4 будет вывод тестовой картинки на рабочий стол
//------------------------------------------------------------------------------
CALL("poligon32.dll",150,150,310,0,184,495,0,500,48,26,-1,-1,150,100,200,100,200,200,100,200,-2,-2,70,450,100,450,100,500,50,500,-2,-2,-3,-4,0,0,0,0,310,500)
print($_return1)
halt

Возвращает 1 если точка принадлежит разрешенной области и 0 - запрещенной.

ps Координаты должны лежать в положительной области. Точка 0,0 - верхний левый угол.

14
Неплохо бы было в место перечисления параметров через запятую, указывать массив. А тип передаваемых данных поднять до int64(когда работаешь с памятью разрядности не хватает). Ну и обратно получать массив. Тогда если чего не хватает можно самому дописать.

15
Как передать в CALL("Plugin.DLL", число1, число2, ..., числоN) неизвестное заранее количество чисел?

Через текстовый файл не желательно из-за частого вызова Plugin.DLL. Одно число изменяется постоянно, остальные считываются 1 раз из файла, 1 раз изменяются и все это передается в плагин.

Pages: [1] 2