Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Сообщения, опубликованные MasterGH

  1. Решил сегодня сгенирить трейнер в текущей версии GodGame v 1.5

    Очень обрадовало автогенерация кода функцией "Скопировать код формы".

    Размер трейнера около 150 кб с демо-картинкой, которая весит 76кб. Без картинки получается 74Кб. Я так понимаю в этот размер входит поддержка функций ниже.

    Не уже ли ассемблер и и дизассемблер могут вместиться в 74кб-ный трейнер?

    Функции

    // Assemble ( Mnemonic: string; Address: Integer; var Bytes: string ) - Преобразует ассемблерную инструкцию в байт код

    // Disassemble ( Address: Pointer ) - Дизасембелирует инструкцию и возвращает ее строковое представление

    // GetInstructionSize ( Address: Pointer ) - Возвращает размер инструкции

    Эти функции работают с SIMD инструкциями, т.е. с инструкциями типа movsd и т.п.?

    Работают ли эти функции с 64-разрядными приложениями? Вроде я читал что не работают. Тогда будет ли это дело планироваться?

    Будут ли события в инспекторе объектов для формы?

    Если это дело сейчас не поддерживается и возможно планируется, то когда это можно будет поюзать?

    Пока я вынужден юзать Cheat Engine из-за поддержки 64-разрядных систем.

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

    Ты бы что ли тутор сделал бы на своём сайте по созданию простого трейнера с демо-скином. А то я не знаю. Демо скрипт есть, демо скин есть, а как они связаны не понятно. Я ещё еле угадал как кнопки разместить на форме демоскина.  

  2. Короче первый совет. Читать статьи и форум.

    Второй совет. Создать запрос на трейнер для игры в соответствующем разделе форума. И ждать.

    Третий совет. Подробно всё расписываем, что делаешь по шагам в этой теме.

    Если выбрала третий путь, то читаем ниже

    Могу развёрнуто описать: запускаю игру, запускаю ArtMoney, начинаю поиск точного значения, ищу в диапазоне, ищу разные по байтам, с точкой и так далее. Адрес не находится.

    Да, уже хоть что-то :) , но это все-равно плохо описано. Как будто это какая-то подачка всем или мелкая подсказка. Решение проблемы нужно тебе больше всего и поэтому нужно все шаги расписывать и даже лучше со скриншотами чтобы интереснее было рассматривать проблему другим. Можешь, конечно, не расписывать, но тогда скорее всего никто и не поможет. Если своей работы ноль, то тогда обычно и никто не помогает.

    Зачем нужно долго и нудно описывать свои действия? Это нужно потому, что мало кому хочется все делать за кого-то и заниматься чьей-то проблемой. Можно расписывать следующим образом.

    1. Запускаю игру.

    2. Запускаю Артмани.

    3. Начинаю поиски параметра %"какого?"

    3.1 Правило: Поиск и отсев точного значения

    3.1.1 Первый поиск, значение %"такое-то"

    3.1.2 Иду в игру меняю значение, для этого делаю %"то-то"в игре. Значение поменялось на %"такое-то". Делаю отсев нахожу столько адресов. Повторяю шаги отсева по правилу точного значения примерно столько-то раз. ничего не нашлось.

    3.2. Правило: Поиск "Неизвестное/уменьшилось/увеличилось"

    3.2.1 Первый поиск, значение %"такое-то", ищу неизвестное

    3.2.2 Иду в игру уменьшаю значение, для этого делаю %"то-то"в игре. Значение поменялось на %"такое-то". Делаю отсев "уменьшилось" нахожу столько адресов.

    3.2.3 Иду в игру увеличиваю значение, для этого делаю %"то-то"в игре. Значение поменялось на %"такое-то". Делаю отсев "увеличилось" нахожу столько адресов.

    Повторяю шаги отсева по правилу точного значения примерно столько-то раз. ничего не нашлось.

    ..... И так далее и тому подобное. И если проведёшь такую работу по всем пунктам описывая что и как делаешь и это будет понятно, то вот тогда можно будет тебе что-то подсказать.   

  3. Проблема у неё только одна - она упрямо сопротивляется любой попытке взломать её (как всегда, я пользовалась ArtMoney). Что бы я ни пыталась найти и подвергнуть изменению себе на пользу, меня настигала неудача, вследствие чего вопрос.

    Либо полностью описывай процесс "от и до" о том что получалось и или не получалось. Ну, или жди у "моря погоды".  

  4.  Короче обычно делают все через прыжки и прыжки рассчитывают.Если лень прыги рассчитывать (или есть другие причины (о них выше)) делаем через call.Да, и call в 32-разрыдных системах имеет размер 5 байт. Также и jmp. А вот short прыги (да-да, такие тоже есть) имеют размер два байта, если не ошибаюсь. 

  5. По первому вопросу.

    1) Если использовать call, то для возврата желательно использовать ret.

    2) Если используем jmp, то для возврата должен быть другой jmp.

    Второй пункт явно быстрее первого по выполнению инструкций. Но в то же время первый пункт даёт очень сильное преимущество, когда два и более call-ов "прозванивают" какой-то адрес, тогда по ret будет возврат в место под тем call, который был выполнен. Короче говоря call это своего рода функции.

    int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow){

    SomeFunction(); // возращает eax из call
    //....
    SomeFunction();// возращает eax из call
    //....
    SomeFunction();// возращает eax из call
    //....
    SomeFunction();// возращает eax из call
    //....
    SomeFunction();// возращает eax из call
    //....

    }

    int SomeGunction(){
    //....
    }

  6. Ты вроде просил ссылку по API. Вот хороший мануал (перевод SDK). Быстро сможешь прочитать как построить приложение на API. Это прочный фундамент полезно знать каждому перед тем как что-то писать на WinAPI на каком-то языке программирования.

    И эта информация гораздо лучше воспринимается если знаешь язык С++ (работу с функцими, передачу аргументов, компиляция проекта). Синтаксис не такой насыщенный как у ассемблера и более компактный. А компактность это залог того, что ты увидишь всю программу лучше чем по мелочам на ассемблере. Ну я не говорю, что лучше увидит программист, я говорю о пользователей который немного знает о программирование на /Дельфи(Object Pascal/Pascal)/C#/C/C++

  7. Все твои статьи по асму очень хороши. Поставил по плюс один на каждый пост.

    Боюсь, что только люди, которые знают WinAPI хорошо понимают о чём идёт речь. Те кто первый раз имеет дело с WinAPI боюсь должны приложить много упорства. Чтобы материал возможно лучше воспринимался мои пожелания строить статьи следующим образом.

    1. Показать результат.

    Показать готовый exe-шник и скриншот. Покаазать весь исходник без комментариев, который пользователь должен скомпилить и сам убедиться что его код работает. И лучше это скомпилировать сейчас и почувствовать сейчас в начале статьи, а не в конце статьи. Т.е. пользователь вынужден запоминать правила построения приложения, но ещё не увидел конечный результат, а только смутно представил.

    2. А вот теперь по кускам разбираем участки кода, т.е. то что ты обычно пишешь.

    3. Ещё очень было бы полезно поучить читателя работать с документацией WinAPI по состовлению приложения "Простой диалог" на C++ и сравнить это дело с fasm-ов или другим ассемблером:

    Можно найти этот исходный код по запросу "MSDN Создание приложения Win32 (C++)"


    // compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <tchar.h>

    // Global variables

    // The main window class name.
    static TCHAR szWindowClass[] = _T("win32app");

    // The string that appears in the application's title bar.
    static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

    HINSTANCE hInst;

    // Forward declarations of functions included in this code module:
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
    MessageBox(NULL,
    _T("Call to RegisterClassEx failed!"),
    _T("Win32 Guided Tour"),
    NULL);

    return 1;
    }

    hInst = hInstance; // Store instance handle in our global variable

    // The parameters to CreateWindow explained:
    // szWindowClass: the name of the application
    // szTitle: the text that appears in the title bar
    // WS_OVERLAPPEDWINDOW: the type of window to create
    // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
    // 500, 100: initial size (width, length)
    // NULL: the parent of this window
    // NULL: this application does not have a menu bar
    // hInstance: the first parameter from WinMain
    // NULL: not used in this application
    HWND hWnd = CreateWindow(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 100,
    NULL,
    NULL,
    hInstance,
    NULL
    );

    if (!hWnd)
    {
    MessageBox(NULL,
    _T("Call to CreateWindow failed!"),
    _T("Win32 Guided Tour"),
    NULL);

    return 1;
    }

    // The parameters to ShowWindow explained:
    // hWnd: the value returned from CreateWindow
    // nCmdShow: the fourth parameter from WinMain
    ShowWindow(hWnd,
    nCmdShow);
    UpdateWindow(hWnd);

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return (int) msg.wParam;
    }

    //
    // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    // PURPOSE: Processes messages for the main window.
    //
    // WM_PAINT - Paint the main window
    // WM_DESTROY - post a quit message and return
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Hello, World!");

    switch (message)
    {
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    // Here your application is laid out.
    // For this introduction, we just print out "Hello, World!"
    // in the top left corner.
    TextOut(hdc,
    5, 5,
    greeting, _tcslen(greeting));
    // End application-specific layout section.

    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    break;
    }

    return 0;
    }
    // GT_HelloWorldWin32.cpp

  8. Grom-Skynet, твой пятый пост довольно хорош :):) Чем чаще будешь использовать подобные "витиеватые приемы" по установке определённых типов бряков на определённые адреса, тем больше ты овладеешь интуицией в создании очень сложных читов. Поздравляю B)

    Как и Xipho я тоже сходу подумал про поток на АА-скриптах createthread("метка в выделенной памяти") и совсем забыл, что адрес из структуры может постоянно или с другой периодичностью читаться для установки прыжка при инициализации "person controller". Действительно надо ставить бряк на чтение и экспериментировать, что ты в принципе успешно сделал.

    "person controller" это название условного класса кода по управлению 3D-моделью героя. Модель героя и этот класс инициализируются вместе с новой сценой. Данные прыжка, позиции 3D-модели, позиции камеры и другие устанавливаются из данных в ресурсах в структуру героя. Когда пользователь пытается прыгать, то читается адрес со значением высоты прыжка из этой структуры. Как-то так...

  9. Значит ты исправил только визуальное отображение. Попробуй исследовать что влияет на это "визуальное отображение зацепки крюка" после "чтения координат твоего героя". Т.е. поставь бряк на прохождение "отображения крюка". Игра должна остановиться. Просканируй стек в котором могут быть координаты твоего героя или один из указателей связанный со структурой твоего героя. Если найдёшь подозрительный участок стека поднимайся по ретам вверх выходя из callo-в. Короче говоря тебе нужно найти развилку кода.

    Если "что-то", то "показывать возможность зацепить крюком", иначе "не показывать"

    Объяснил как смог. Сам заниматься этим не могу, очень много работы. 

  10. ZOCKIR, если что-то вылетает в казалось бы нормальной инъекции, то советую проверять работоспособность твоей инъекции кода в OllyDbg, а не подбирать по какому-то странному принципу инструкции которые бы подходили :) И если можно избавиться от использования pushad/popad то лучше это и делать (зачем нам сохранять и восстанавливать данные из регистров которые мы не трогаем). Если что напоминаю, что эта команда не "кладёт" в стек EIP и не кладёт регистр флагов EFLAGS.

  11. >> Есть вероятность того что свободные регистры в этой инструкции они будут постоянно свободный для внедрение своего чита?

    ZOCKIR, по этому участку кода на скриншоте ничего не могу сказать. Может быть да, а может быть и нет. А ebx тут зачем класть в стек и восстанавливать, если им не пользуешься?! ))

  12. Скорее всего процесс происходит так:

    1) В цикле программы Луч исходящий из камеры собирает информацию о том какие объекты он пересекает

    2) Если эти объекты есть, то берём первый и вычисляем расстояние между координатами камеры и координатами текущего объекта.

    3) Если это расстояние является допустимым, то появляется графический элемент о том что можно выпустить крюк

    Итак. Ключевой момент следующий.

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

    Найти адрес состояния и поставить бряк "на чтение и запись".

    Исправляем код игры так, чтобы крюк всегда мог цепляться.

  13. Спасибо за статью :)

    Несколько вещей, которые я никогда не делаю и не советую так делать

    1) Не искать указатель сканером указателей, а искать (его в отладчике + возможно использовать сканер памяти для поиска адреса)

    2) Не проверять указатель перезагрукой ПК. 99% эта необходимость отпадает если применять способ в пункте1, когда мы достаточно уверены в работе указателей.

    3) Не писать в АА-скриптах mov [[[..]...]..]..],(float)100 . Вместо этого нужно писать ассемблерный код.

    Дело в том что

    mov [[[..]...]..]..],(float)100

    Будет как:

    mov [адрес],(float)100

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

    Желаю успехов автору статьи :)

  14. По поводу адреса азота. Скорее всего, те кто искал не нашли именно нужный адрес. Я бы искал неизвестное значение которое уменьшалось бы при уменьшении азота, если бы не нашёл искал бы значение которое увеличивалось при уменьшении азота. Типы 1,2,4,4 float, double. Если бы не нашёл что хотел, то копал бы ввырх по ретам из этой MSVCR90.dll, т.к. это тоже зацепка.

  15. Автор, если хочешь защитить свой трейнер, то наверно об этом надо спрашивать не у нас, а делать это самому и тайно от всех. Иначе, что это будет за защита, которую тебе кто-то предложил или хуже того за тебя сделал.

    Закрыто.

  16. Я путаю "два режима - ядра и пользовательский" с ring0-1-2-3 защищённого x86? Нипанятна. :(

    Или это просто такое разделение на "ядро \ дрова" и "всё остальное"?

    Ссылка на необходимую краткую информацию по режимам. Кратко написаны функции режимов.

    Разделение обязанностей юзер- и кернел-модев на рисунке.

    Архитектура x86 поддерживает 4 уровня привилегий — от 0 до 3 , но используются только 0 и 3 уровень. Режим пользователя использует уровень 3, а режим ядра — 0.

    Я не думаю, что стоит заморачиваться на режимах больше чем нужно. Возможно в нашем деле это потребуется тогда, когда, например, нужно писать в память процесса через кернел-режим, если сделать это обычными способами будет невозможно из-за защит.  

    • Плюс 1
  17. В системе Windows есть объекты ядра и ИХ описатели. Последние чаще называют дескрипторами, "хендлами", "hadle(s)".

    Вот пример использования хендла типа Окно (тип HWND):

    int WINAPI MessageBox(
      __in_opt  HWND hWnd,
      __in_opt  LPCTSTR lpText,
      __in_opt  LPCTSTR lpCaption,
      __in      UINT uType
    );

     

    Сразу напрашивается расшифровка этой абривиатуры HWND. H- handle , WND - window. Получаем handle window.

    Для чего нужен этот описатель для казалось бы независимого диалога MessageBox?! Идём в справку MSDN и смотрим:

    A handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.

    Оказывается этот параметр, если его указать, свяжет мессагу и описатель HWND. У мессаги появится "хозяин"... Если окно закроется, то и мессага закроется... Разбирать эту связь я не буду, кому надо глянут. Это был просто пример.

    Описатели или дескрипторы это структуры данных. Используются в работе разных режимов.

    На Windows cуществует два режима. Режим Ядра и "Пользовательский"

    Ошибки на уровне Ядра покажут вам Синий экран. Ошибки на Пользовательском уровне должны привести максимум к закрытию пользовательского приложения. "Должны" это не значит, что так и будет, но на все 100% нельзя быть уверенным.

    "Режим пользователя" это программирование на WinAPI где мы работаем с дескрипторами Пользовательского режима (а система в свою очередь обрабатывает эти дескрипторы работая с объектами ядра), и если что-то на этом уровне Пользователя пойдёт не так, то в предположительно в худшем случае ваше приложение закроется с критической ошибкой.

    "Режим ядра" это тот режим на котором писать программы очень "мерзко", если что, то синий экран. Если опять что-то, то опять синий экран. При чем компьютер после перезагрузки может не запустить операционную систему...

    Итак. В Пользовательском режиме Хендлы или дескрипторы это номера, по которым идентифицируются структуры данных в системе. Эти структуры разного размера в зависимости от названия типа хендла. Эти структуры созданы для взаимодействия процессов Пользовательского уровня в обход уровня Ядра.

    Более подробнее читаем Рихтера. Глава3.

    • Плюс 1
  18. Сплошной косяк.

    Особенно, когда после условия идёт функция:


    if (count>1) then
    function No(hotkey)
    ....

    Лучше убрать функцию myattach(timer) и работу таймера.

    Начни с простого - подготовь форму и реакции на хот-кеи

    post-3-1323863781,48_thumb.png


    function No()
    --...
    end

    function Norma()
    --...
    end


    function SetHotKey(func, hotkey)
    local objectHotKey = createHotkey(func, hotkey)
    generichotkey_setKeys(objectHotKey, hotkey)
    generichotkey_onHotkey(objectHotKey, func)
    end

    function onOpenProcess(processid)
    SetHotKey(No, VK_R)
    SetHotKey(Norma, VK_V)
    control_setCaption(formTrainer, "Trainer Run ....")
    setProperty(infoLabel, "Enabled", "true")
    end

    function OnCloseTrainerForm(sender)
    closeCE()
    return caFree
    end

    formTrainer = createForm(true)
    form_centerScreen(formTrainer)
    control_setCaption(formTrainer, "Process game is not exist")
    form_onClose(formTrainer, OnCloseTrainerForm)

    infoLabel = createLabel(formTrainer)
    control_setCaption(infoLabel, "Key R - ....\n\rKey V - ....")
    control_setPosition(infoLabel, 20, 10)
    setProperty(infoLabel, "Enabled", "false")

    listProcess = getAutoAttachList()
    strings_add(listProcess, "test.exe")

  19. Для начала это.

    << Я так понимаю, что AOBScan мы можем найти заданный массив байт?

    Можем. Можем найти адрес массива или адреса по которым находятся похожие массивы.

    << У меня задача отыскать большой массив (х х х х х х х х х х х х х) и заменить его на (у у у у у у у у у у у у у)

    Поиск массива через AOBScan или класс MemScan

    Запись байт

    writeBytes(address, x,x,x,x,...) : Write the given bytes to the given address from a table

    writeBytes(address, table) : Write the given bytes to the given address from a table

    В Lua коде нужно написать, что дескать, если нашли адреса массива, то по каждом адресу записать такие-то байты. Или записать только по первому найденному адресу. Или ещё дописать условие,что если найденных адресов больше чем 1, то вывести сообщение об ошибке, о том что должен был найтись только один адрес.

    >> Пересмотрел операторы языка, но подходящего не разглядел.

    Я дал несколько подсказок, а дальше сами.

  20. Нам уже исполнилось 2 года

    11 Декабря 2009 это дата регистрации первого пользователя на нашем форуме. В принципе, этой датой можно считать рождение именно этого форума. Первым появился форум, а через год в 2010 в декабре появился сайт. За эти два года много пользователей ознакомились с ресурсом gamehacklab[ru]. Всё больше людей продолжает испытывать интерес к созданию читов различными способами. Количество интересующихся такой сложной темой только растёт. Примерно в 60% случаев новые пользователи ищут информацию по читингу в мультиплеерных играх. Конечно, это расстраивает, т.к. с людьми надо играть честно поэтому мы этим и не занимаемся.

    Когда-то давно во времена 2007 годов существовала команда Team-X. Два человека Ветераны создания трейнеров размеров ~2кб до 80кб до сих пор пишут на форуме это Xipho и SER[G]ANT. В их сторону дань уважения. Многие зарубежные товарищи создают команды и следуют прежним далёким традициям. Трейнер в виде *.exe файла с инфошкой, с музыкой, некоторыми эффектами. У нас же, как многие могли заметить, почти всё крутится около Cheat Engine без всяких прошлых традиций. И это произошло очевидным образом. Cheat Engine наиболее удобная стартовая база для людей, которые ничего о программировании под Windows не знают. Эта программа именно для тех кто желает побыстрее понять принципы создания читов (о том как изменять код игры) и побыстрее приступить к делу. Если человек (а таких весьма мало) захочет писать трейнеры на языках программирования, то примеры на форуме у нас тоже есть, но 100% готовых исходников трейнеров можно не встретить, а найти их в Интернете.

    Итак, поздравляю всех с событием "2 года нашему форуму". Желаю всем интересных открытий в создании читов.

  21.  Почитай мануалы в Интернете о записи данных в файл + обработку исключений, чтобы всегда, как в данном примере так и в других уметь определять ошибку. А также отладку dll-ок в Visual Studio в редакторе кода, если это тебе надо. 

  22. Статья хорошая. Это я писал в личном сообщении автору.

    Напоминаю способы сравнения свой-чужой:

    1) Сравнение данных в структурах как это было в этой статье. Если в этом случае ничего не находится, то ищем новый уровень в цепочке указателей и сравниваем структуры на этом уровне. Если опять не нашли, то опять ищем указатель и сравниваем аналогично. И так делать пока не построим полную цепочку указателей.

    2) Если тратим много времени на пункт1, запутались или долго искать указатели, то ищем инструкции которые работали бы только с игроком за которого играем. Но и здесь свои трудности в случае, когда у героя есть дружественные единицы. Как бы там не было всегда надо помнить "код игры умеет выбирать кто друг твоему герою, а кто враг". При чем это сравнение может вообще отсутствовать, помним об этом.

    Код дружественного бота может работать с адресом главного героя своими алгоритмами "дружбы". А код "врага" будет также работать с адресом вашего героя своими алгоритмами "врага". И никаких СРАВНЕНИЙ "кто свой, а кто чужой НЕТ (и нет их в структурах данных)" - только работа с адресами.

    3) Наконец, третий вариант, если на верхние два тратили много времени. Учим как автоматически вести лог и трейсить места из call-ов из глубины вверх до места срабатывания клика мышкой или ввода с клавиатуры (делается на Cheat Engine или других отладчиках). Именно в местах, где читается ввод с мышки или клавиатуры, будет дизассемблированный код который будет работать только с твоим управляемым персонажем. Затем может идти вход в call или call-ы которые вызывались бы уже и ботами.

    Когда у нас есть логи какие call-ы работают от ботов, а какие от мест сравнений нажатий мышки или клавиатуры, то мы можем составить схему какие участки кода работают, когда что-то происходит в игре... и это 99-100% поможет найти решение задачи "кто свой, а кто чужой".

    Все пункты 1,2,3 требуют времени и опыта работы в отладке, а также интуицию. На интуицию благоприятно влияет опыт программирования 3Dигр или хотя бы представление как эти игры работают.

  23. Вроде, так должно работать и так проще:

    function onOpenProcess(processid)
    control_setCaption(UDF1_someLabel, "Process is exist")
    end

    listAAProcess = getAutoAttachList()
    strings_add(listAAProcess, 'game.exe')

    control_setCaption(UDF1_someLabel, "Process is not exist")
    form_show(UDF1)

    Функция onOpenProcess всегда срабатывает, когда процесс найден.

    Форму нужно предварительно создать в дизайнере с именем UDF1 и на форму "бросить" лейбл с именем someLabel.

    Код этот не тестировал, может работает,а может нет.

    ---

    Только что проверил, всё работает :)

    • Плюс 1
  24. >> form_setBorderStyle(form, borderstyle, bsNone)

    Чтобы работать с этой функцией нужна подходящая версия CE с соответсвующей ревизией не раньше чем эта функция была включена.

    >> А возможно ли сделать создаваемую форму при нажатии на кнопку передвигаемой, если не назначены события ?

    Нет, нельзя.

    Должно обрабатываться как минимум одно событие, когда пользователь удерживает левую кнопку мышки на форме. Это событие должно быть присоединено к названию Lua-функции в дизайнере форм.

    ------------

    В новой версии CE 6.2 Альфа3 r1131 доступны функции:

    1) Работы со стилями границы формы

    form_setBorderStyle(form, borderstyle): 6.2+: Sets the borderstyle of the window

    form_getBorderStyle

    Для работы с form_setBorderStyle(form, borderstyle) в "документации"нет описания borderstyle. Понятно что borderstyleдолжно иметь тип integer, а какое именно число не понятно.

    2) Перетаскивание формы

    form_dragNow(form)

    function FormMouseDown(sender, button, x, y)

    form_dragNow(UDF1)

    end

    Но, поскольку эта альфа, а не официальная версия, то думаю эти функции использовать рано, если конечно не делать автономные трейнеры.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.