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

MasterGH

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

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

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

    129

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

  1. ZOCKIR, если ищешь ответ, то тебе надо копать функции по получению данных из процесса и модулей. Если таких не найдёшь для .NET фреймверка, то ищи их в API Windows. Как поймёшь их работу переноси на C# через импорт необходимых функций, если тебе нужно писать на C#.

    Общее впечатление - ищешь лишних трудностей, когда уже есть Cheat Engine

  2. Надеюсь этот товарищ (вопрос к нему) напишет ответ на главный вопрос с какой целью он копировал информацию с нашего форума на свой сайт?

    По его ответу можно хотя бы какое-то представление иметь какую цель ставил перед собой человек. У меня только несколько версий

    1) Отомстить всем на GameHackLab[RU] (может обидел кто, не помог ломать ММОРГ- игрулю?! :blink: )

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

    3) А может просто раздражает "интерфейс и угловатость" нашего форума...

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

  3. Мы обсудим с Xipho новые дополнения к правилам форума чтобы пользователям не приходилось к каждому посту или в своей подписи писать о запрете публикации его материалов.

    Во всяком случае на текущий момент, как это обычно делают правообладатели, можно вежливо потребовать удалить свой материал.

  4. решаю пока как лучше реализовать, в виде классов или просто функций ?

    Это зависит всё-таки от поставленных целей. Удобно, когда в объектах нужно хранить инкапсулированные данные и работать с ними через методы. Плюсы возможности наследования и полиморфизма. Но в случае отладки, можно обойтись и без классов. Я имею ввиду там, где пишем скрипты, а не в исходниках программы GodGame.

    Например, у текущей ревизии CE есть работа как с отладчиком так и с дизассеблированием/ассемблированием. Довольно важная функция-событие:

    function debugger_onBreakpoint():
    When a breaking breakpoint hits (that includes single stepping) and the lua function debugger_onBreakpoint() is defined it will be called and the global variables EAX, EBX, .... will be filled in
    Return 0 if you want the userinterface to be updated and anything else if not (e.g: You continued from the breakpoint in your script)

    Она работает всегда, когда вызывается точка останова при этом откуда-то с потолка, т.е. с глобальными переменными регистров можно работать. Хотя они могли бы передаваться в аргумент функции через переменную данных о событиях. Но, кто знает, может это сделано в целях производительности и может быть правильно.

    Кстати также пригодилась бы функция-событие:

    function onOpenProcess(processid) : When this function is defined it will be called each time a process has been opened (note that a process can be opened multiple times in a row, e.g when attaching the debugger it might first open it and then attach the debugger which opens it again...)

    Ещё некоторые функции:

    disassemble(address): Disassembles the given address and returns a string in the format of "address - bytes - opcode : extra"
    splitDisassembledString(disassembledstring): Returns 4 strings. The address, bytes, opcode and extra field


    getInstructionSize(address): Returns the size of an instruction (basically it disassembles the instruction and returns the number of bytes for you)
    getPreviousOpcode(address): Returns the address of the previous opcode (this is just an estimated guess)

    По работе со сканером памяти можно самый простой сканер по поиску адресов по сигнатурам байткода вида "FFxxxxFFAA....". Сканирование в один этап без отсеивания. Эта функция может возвращать список из адресов.

  5. Основные плюсы:

    1) Программа имеет приятный интерфейс. Кнопки, панельки, иконки. Здорово. Меню настроек хорошо. Впрочем это было и в прошлых версиях GodGame.

    2) Поддержка GUI для трейнеров на первый взгляд лучше чем у Cheat Engine.

    post-3-1321643307,17_thumb.png

    И я сужу не по этом скриншоту, а по тому что можно писать в коде. Поддержка GUI или VCL более широкая и наверно все функции работают. У CE проблемы со свойствами цветов похоже для всех визуальных компонентов и присутствуют многие другие косяки с VCL.

    3) Весьма удобна всплывающая справочная информация когда пишем скрипт. Чего у Cheat Egnine Lua_Engine не хватает так это именно этого.

    Данный код примера мне понравился.



    {-----------------------------------------------------------------------------------}
    // Функция автозавершения кода срабатывает, когда вы вводите "." в окне редактора.
    // Вы можете в любое время вызвать функцию автозавершения кода нажатием "Ctrl+Пробел" в окне редактора.
    // Попробуйте также нажать "Ctrl+Shift+Пробел", когда курсор находится между скобками, где перечислены аргументы функции...
    // Зажмите клавишу "Ctrl" и наведите курсор на переменную или функцию, затем нажмите левую кнопку мыши, вы перейдете на место объявления этой функции/переменной...
    // Вы можете использовать шаблоны для кода нажав "Ctrl+J" в окне редактора.
    // Для того что-бы отредактировать или добавить свои шаблоны, отредактируйте файл "AComplete.dci".
    {-----------------------------------------------------------------------------------}
    // ShowMessage ( Msg: Variant ) - Показывает диалог с сообщением
    // MessageDlg ( Msg: string, DlgType: TMsgDlgType, Buttons: TMsgDlgButtons, HelpCtx: Longint ) - Показывает диалог с сообщением
    // IsProcessRunning ( void ) - Проверяет не завершился ли процесс
    // StopProcess ( void ) - Останавливает текущий процесс
    // ResumeProcess ( void ) - Возобновляет текущий процесс
    // TerminateProcess ( void ) - Завершает текущий процесс
    // ReadProcessMemory ( Address: Pointer, Buffer: string, Size: DWORD ) - Чтение памяти процесса
    // ReadInteger ( Address: Pointer ) - Чтение памяти процесса
    // ReadFloat ( Address: Pointer ) - Чтение памяти процесса
    // ReadDouble ( Address: Pointer ) - Чтение памяти процесса
    // WriteProcessMemory ( Address: Pointer, Buffer: string, Size: DWORD ) - Запись в память процесса
    // WriteInteger ( Address: Pointer, Value: Integer ) - Запись в память процесса
    // WriteFloat ( Address: Pointer, Value: Float ) - Запись в память процесса
    // WriteDouble ( Address: Pointer, Value: Double ) - Запись в память процесса
    // GetModuleName ( Address: dword ) - Возвращает имя модуля
    // GetModuleAddress ( Module: string ) - Возвращает адрес модуля
    // GetProcAddress ( ProcName: string ) - Возвращает адресс функции
    // CallRemoteFunction ( FuncName: string, Param: DWORD ) - Вызывает удаленную функцию
    // GetGodGameDir ( void ) - Возвращает папку откуда запущенна программа
    // Disassemble ( Address: Pointer ) - Дизасембелирует инструкцию и возвращает ее строковое представление
    // GetInstructionSize ( Address: Pointer ) - Возвращает размер инструкции
    // OpenProcessByName ( Name: string ) - Открывает процесс по его имени
    // VirtualAlloc ( Size: DWORD ) - Выделяет память в открытом процессе и возвращает указатель на выделенный блок памяти
    // InjectDll ( FileName: string ) - Внедряет DLL в текущий процесс
    // IsKeyPressed ( Key: Integer ) - Проверяет нажата ли клавиша
    // DoKeyPress ( Key: Integer ) - Эмулирует нажатие клавиши
    // GetPixel ( X: Integer, Y: Integer ) - Возвращает цвет точки в формате RGB
    // GetMousePos ( var X: Integer, var Y: Integer ) - Возвращает позицию мыши
    // SetMousePos ( X: Integer, Y: Integer ) - Устанавливает позицию мыши
    // Sleep ( milliseconds: DWORD ) - Задержка выполнения в мс
    // CreateProcess ( FileName: string, CommandLine: string ) - Создает процесс
    {-----------------------------------------------------------------------------------}

    const
    PROCESS_NAME = 'Trainer_Spy.exe'; // Имя процесса
    op
    var
    Panel : TGRTitlePanel;
    btnOpenProcess : TGRButton;
    btnCloseProcess : TGRButton;
    btnReadProcess : TGRButton;
    btnWriteProcess : TGRButton;
    btnCallRemoteFunc : TGRButton;
    btnPlaySound : TGRButton;
    btnStopSound : TGRButton;

    //------------------------------------------------------------------------------

    procedure CreateProcessClick(Sender: TObject);
    begin
    if CreateProcess(GetGodGameDir + PROCESS_NAME, '') then
    btnOpenProcess.Enabled := True
    else
    MessageDlg('Не удалось создать процесс: "' + PROCESS_NAME + '".', mtError, mbOK, 0)
    end;

    //------------------------------------------------------------------------------

    procedure OpenProcessClick(Sender: TObject);
    begin
    if OpenProcessByName(PROCESS_NAME) then
    begin
    btnCloseProcess.Enabled := True;
    btnReadProcess.Enabled := True;
    btnWriteProcess.Enabled := True;
    btnCallRemoteFunc.Enabled := True;
    end else
    MessageDlg('Не удалось открыть процесс: "' + PROCESS_NAME + '".', mtError, mbOK, 0)
    end;

    //------------------------------------------------------------------------------

    procedure CloseProcessClick(Sender: TObject);
    begin
    TerminateProcess;
    end;

    //------------------------------------------------------------------------------

    procedure ReadProcessClick(Sender: TObject);
    var
    S: string;
    D: Double;
    F: Float;
    I: Integer;
    begin
    S := '$00401000';

    if InputQuery('Введите адрес', 'Адрес:', S) then
    begin
    D := ReadDouble(S);
    F := ReadFloat(S);
    I := ReadInteger(S);

    ShowMessage(Format('ReadDouble: %f'#13#10 +
    'ReadFloat: %f'#13#10 +
    'ReadInteger: %d', [D,F,I]));
    end;
    end;

    //------------------------------------------------------------------------------
    // Запись в память через указатель --- абстрактный пример ----------------------
    //------------------------------------------------------------------------------

    procedure WriteProcessClick(Sender: TObject);
    const
    Ptr = $00401000; // Указатель
    Offset = $0F4; // Смещение
    var
    Addr: Integer;
    begin
    Addr := ReadInteger(Ptr); // Читаем значение указателя
    Inc(Addr, Offset); // Прибавляем смещение к указателю
    WriteProcessMemory(Addr, HStr('FF 00 00 00'), 4); // Пишем в память
    end;

    //------------------------------------------------------------------------------
    // Выполнить свой код в чужом процессе
    //------------------------------------------------------------------------------

    procedure CallRemoteFuncClick(Sender: TObject);
    var
    AllocMem : Pointer;
    Code : string;
    AddrMB : Pointer;
    begin
    // Выделяем память в открытом процессе
    AllocMem := VirtualAlloc($1000);
    AddrMB := GetProcAddress('MessageBoxA');

    // Создаем ассембелерный код
    // ----------------------------------
    // 6A 00 | push 00
    // 6A 00 | push 00
    // 6A 00 | push 00
    // 6A 00 | push 00
    // FF D3 | call ebx // ebx - адрес MessageBoxA
    // C3 | ret
    // ----------------------------------

    Code := HStr('6A 00 6A 00 6A 00 6A 00 FF D3 C3');
    // Внедряем код в открытый процесс
    WriteProcessMemory(AllocMem, Code, Length(Code));
    // Запускаем наш код
    CallRemoteThread(AllocMem, AddrMB);
    end;

    //------------------------------------------------------------------------------

    procedure PlaySoundClick(Sender: TObject);
    begin
    XMPlayer_Play(GetGodGameDir + 'DEMO\Sound.xm');
    end;

    //------------------------------------------------------------------------------

    procedure StopSoundClick(Sender: TObject);
    begin
    XMPlayer_Stop;
    end;

    //------------------------------------------------------------------------------
    // Создаем главную форму
    //------------------------------------------------------------------------------

    function MainFormCreate: TForm;
    begin
    Result := TForm.Create(Application);
    Result.SetBounds(0, 0, 393, 283);
    Result.Position := poDesktopCenter;
    Result.BorderStyle := bsDialog;
    Result.Caption := 'Demo Script';
    Result.Font.Name := 'Tahoma';

    with TImage.Create(Result) do
    begin
    Parent := Result;
    SetBounds(0, 0, 385, 55);
    Picture.LoadFromFile(GetGodGameDir + 'demo\logo.bmp');
    Show;
    end;

    Panel := TGRTitlePanel.Create(Result);
    with Panel do
    begin
    Parent := Result;
    SetBounds(4, 60, 380, 194);
    Style := vsOfficeOlive;
    Title.Font.Name := Result.Font.Name;
    Title.Caption := 'Settings';
    Title.Picture.LoadFromFile(GetGodGameDir + 'demo\icon.ico');
    Show;
    end;

    with TLabel.Create(Panel) do
    begin
    Parent := Panel;
    SetBounds(15, 47, 360, 21);
    Caption := 'Process name:';
    Show;
    end;

    with TLabel.Create(Panel) do
    begin
    Parent := Panel;
    SetBounds(90, 47, 360, 21);
    Font.Style := fsBold;
    Font.Color := clGreen;
    Caption := PROCESS_NAME;
    Show;
    end;

    with TGRSectionLabel.Create(Result) do
    begin
    Parent := Panel;
    SetBounds(10, 75, 360, 10);
    Font.Name := Result.Font.Name;
    Caption := 'Actions';
    Show;
    end;

    with TGRButton.Create(Result) do
    begin
    Parent := Panel;
    SetBounds(10, 100, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Create process';
    OnClick := @CreateProcessClick;
    Show;
    end;

    btnOpenProcess := TGRButton.Create(Result);
    with btnOpenProcess do
    begin
    Parent := Panel;
    SetBounds(10, 130, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Open process';
    Enabled := False;
    OnClick := @OpenProcessClick;
    Show;
    end;

    btnCloseProcess := TGRButton.Create(Result);
    with btnCloseProcess do
    begin
    Parent := Panel;
    SetBounds(10, 160, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Close process';
    Enabled := False;
    OnClick := @CloseProcessClick;
    Show;
    end;

    btnReadProcess := TGRButton.Create(Result);
    with btnReadProcess do
    begin
    Parent := Panel;
    SetBounds(120, 100, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Read memory';
    Enabled := False;
    OnClick := @ReadProcessClick;
    Show;
    end;

    btnWriteProcess := TGRButton.Create(Result);
    with btnWriteProcess do
    begin
    Parent := Panel;
    SetBounds(120, 130, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Write Memory';
    Enabled := False;
    OnClick := @WriteProcessClick;
    Show;
    end;

    btnCallRemoteFunc := TGRButton.Create(Result);
    with btnCallRemoteFunc do
    begin
    Parent := Panel;
    SetBounds(120, 160, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Call remote func';
    Enabled := False;
    OnClick := @CallRemoteFuncClick;
    Show;
    end;

    with TGRButton.Create(Result) do
    begin
    Parent := Panel;
    SetBounds(230, 100, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Play sound';
    OnClick := @PlaySoundClick;
    Show;
    end;

    with TGRButton.Create(Result) do
    begin
    Parent := Panel;
    SetBounds(230, 130, 100, 24);
    Style := vsOfficeOlive;
    Caption := 'Stop sound';
    OnClick := @StopSoundClick;
    Show;
    end;

    Result.ShowModal; // Показываем модально, дальше скрипт не будет выполняться, пока не закроем форму
    Result.Free; // Уничтожаем форму
    end;

    //------------------------------------------------------------------------------
    // --- Вызывается при запуске скрипта --- //
    //------------------------------------------------------------------------------
    begin
    MainFormCreate;
    end.
    program Test;

    Понравился мне потому, что я тут вижу привычный Дельфи с классами. У Lua в Cheat Engine с классами большая проблема. Так же вижу обилие компонентов и рабочих функций. Надеюсь что я хвалю не зря и это всё работает :)

    Минусы:

    1) В как бы Инспекторе объектов очень не достаёт обработчиков событий.

    2) Хорошо бы иметь возможность встраивать ассемблерный код или ассемблерный скрипт, а не байты как в этом примере:


    var
    AllocMem : Pointer;
    Code : string;
    AddrMB : Pointer;
    begin
    // Выделяем память в открытом процессе
    AllocMem := VirtualAlloc($1000);
    AddrMB := GetProcAddress('MessageBoxA');

    // Создаем ассембелерный код
    // ----------------------------------
    // 6A 00 | push 00
    // 6A 00 | push 00
    // 6A 00 | push 00
    // 6A 00 | push 00
    // FF D3 | call ebx // ebx - адрес MessageBoxA
    // C3 | ret
    // ----------------------------------

    Code := HStr('6A 00 6A 00 6A 00 6A 00 FF D3 C3');
    // Внедряем код в открытый процесс
    WriteProcessMemory(AllocMem, Code, Length(Code));
    // Запускаем наш код
    CallRemoteThread(AllocMem, AddrMB);
    end;
    procedure CallRemoteFuncClick(Sender: TObject);

    3. Может быть я плохо смотрел, вроде нет функций для работы с отладчиком, сканером памяти... Ну в общем чего не достаёт, но это на первый взгляд. Пока с программой не поработал как следует. Может потом что ещё прокомментирую.

    Программа наверно будет в будущем платная, как я понял из соглашения дистрибутива.

    Общее впечателнеие: неплохо. Просто мне надо поюзать её как-нибудь.

  6. Ну, какие ещё способы могут быть :) Учи отладку и программирование и ты будешь видеть пути решения.


    public class SomeGun(){

    ....

    void Fire(){
    .....
    }

    void UpdateInput(){
    if (Unput.Mause(0)){
    if(!timerStart){
    timerStart = true;
    lastTime = 0;
    }
    else{
    lastTime += Time.delta;
    if (lastTime > shotDelay){ // делаешь инъекцию кода "если оружие принадлежит твоему герою, то стрелять сразу"
    Fire();
    timerStart = false;
    }
    }
    }
    }

    }

    Напиши программу на языке программирования под Windows выстрелов с задержкой - простое окно со строкой патронов. Как мышкой стреляешь, то у выстрелов задержка. Затем компилируешь в бинарник и отлаживаешь с Cheat Engine и учишься искать нужный участок кода, а лучше это делать с IDA.

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

  7. Что касается задачи темы например для игры Crimsonland в которой довольно много монстров наседают со всех сторон. Функцию типа "если вижу объект А, то двигаться к нему" можно попробовать позаимствовать у ботов - существ, которые как только видят главного героя, то двигаются к нему. Для этого хорошо бы изучить код, который читает координаты героя именно для того чтобы боты двигались к ним... Затем изучить найденную функцию или участок в ней и возможно модифицировать в новую функцию в которой мы не двигаемся к объекту, а стреляем в него. Для начала, если будет даже выстрел не обязательно в ближайшего монстра, то это будет неплохо.

  8. Вот пример.

    trainerActivated.wav помещаем в ресурсы.


    using System;
    using System.Media;
    using System.Windows.Forms;

    namespace PlaySound
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private readonly SoundPlayer _soundPlayer = new SoundPlayer();

    private void Button1Click(object sender, EventArgs e)
    {
    _soundPlayer.Stream = Properties.Resources.trainerActivated;
    _soundPlayer.Play();
    }
    }
    }

  9. Вряд ли это можно сделать с помощью Артмани для любых игр.

    В современных играх под Windows замена модели персонажа возможна, но не всегда это сделать просто. В некоторой игре можно распаковать ресурсы, изменить их, запаковать обратно. Изменение может ограничиться редактированием скриптов, а может и нет. Это был простой случай. Другой случай довольно сложный, который я пока не делал. Проанализировать в отладчике машинный код, когда он создаёт модели персонажей. Ну и соответственно попытаться что-то сделать, чтобы решить поставленную задачу.

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

    Также создать класс по работе с процессом игры в котором бы инкапсулировалась работа по записи адресов через SystemProcess.WriteMemoryData(....)

    Да, и лучше чуть-чуть переписать SystemProcess сделав его не статичным классом, а с конструктором запоминания имени процесса.

  11. CheatEngine 6.2 Alpha3

    LINK

    What's new:

    Some bugfixes. (Try and find out which ones are fixed and which ones are not. Tell me to confirm. It's a fun game!)

    Implemented some more menu items in the dissect data window

    Bunch of new lua functions (memoryrecord and structure related)

    Added a new type of trainer and give the trainer creator the choice to have a Tiny trainer or a Gigantic trainer

    d3d gui options should now disable themselves when activated when detected that it's not working anymore

    add address/change address window: hold ctrl to change the offsets by 1

    Report any bug and you find and gui suggestions, even if you think I already know about it

  12. ANT' date='01 Ноябрь 2011 - 04:59' timestamp='1320101995' post='5058']

    CE теперь умеет создавать миниатюрный трейнер

    Для примера взять пустой трейнера с 1 опцией, в виде заморозки адреса

    Размер обычного трейнра - 3.22мб

    Размер миниатюрного трейнера - 58.5кб

    Единственное условие для работы мини-трейнера - у пользователя должен быть установлен CE

    Пока не знаю, какие преимущества у этого варианта трейнера. Получается аналогия с *.CETRAINER, только в виде самостоятельной программы, а не ввиде разметки xml.

    Вот теперь интересно, если найти все-таки то, что нужно этому миниатюрному трейнеру (в СЕ), будет ли игра стоить свеч?

    Если ты имеешь ввиду как сделать так, чтобы не таскать за собой CE, то получишь скорее всего тот же автономный трейнер не меньше 3 Мб. Когда была CE 5.6 мне удалось уменьшить размер автономного трейнера до ~420 Кб где-то. Но не факт что такой размер можно сделать на CE 6.2.

    Как бы там не было по поводу танцев с размерами трейнеров. Я уверен, что один из лучших вариантов это существующий вариант с .CETRAINER. При запуске формата этих скриптов, автоматически скрывается CE и запускается Lua-скрипт. При чем вероятно, то что отрабатывает Lua скрипт будет работать не только на платформе Windows, но и на Mac и других...

  13. MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id

    1F0FF 

    (хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?

    Я мало что понял из твоего сообщения.

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

    Потом мы изучали язык C по курсу программы, но в него что-то не въезжал "хоть убей или лбом об стенку"... Я принялся за Дельфи и нажал на ООП в Дельфи. Давалось трудно, но тупиков не было. Потом как-то случайно начал читать книжку Шилдта Справочник по C++ и я стал понимать вещи, которые раньше не понимал, наконец C++ мне стал нравится. Потом я узнал про C# и ощутил его преимущества перед C++. C# и его поддержка VS2010 просто созданы для того чтобы выполнять задачи по работе с информацией на удобном языке. Такую работу как работу с текстовой информацией, с файлами и папками, с базой данных в XML или ином формате... там очень много областей применений.

    Больше всего эмоций доставляет программирование графики будь то 2D или 3D. Например, можно сделать так чтобы на области рисования передвигался круг когда мы нажимаем кнопки на клавиатуре влево, вправо, вверх и вниз. Это приложение можно сделать на любом языке программирования под Winodws.

    Потом я решил подтянуть знания по Win API и опять принялся за C++. В первую очередь обратил внимание на цикл работы основной программы... Дальше писать не буду что было, основное уже написал.

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

    Но мне кажется, что удобнее чем C# по работе с информацией пока нет ничего подобного. Хотя может быть я ошибаюсь, не все возможные языки я знаю. Но у C# хорошая справочная поддержка MSDN.

    Лично тебе советую изучить C# по работе с созданием форм без Visual Studio. Это тему освещал Эндрю Троелсен в своих толстых книжках от версии нет 3.5.

    Я приведу пару примеров.

    После изучения простых примеров далее установить Visual Studio и обязательно Resharper, он будет помогать использовать определённый стиль. Все это дело бесплатное на 30 дней для некоммерческого использования. Есть свободная лицензия на Express версию VS. Здесь будем работать с проектами Windows Forms или консольными приложениями.

    Также есть другие среды разработок такие как MonoDeveloper на котором я сейчас работаю. Эта среда разработки "встроена" в Unity3D.

    После того как надоест Windows Forms можно рискнуть попробовать WPF. Но чтобы нормально писать на WPF мне пришлось довольно много времени потратить на изучение, не думаю что это будет легкой задачей.

    Как знакомо, но я перестал этой камастурой заниматься и перешел на PABC : ) Никогда не любил паскаль и никогда не использовал "досовскую" версию, есть намного лучше - http://pascalabc.net...achivaniya.html, сейчас там 4 фреймворк поддерживается и конструктор форм. ;)

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

    sc3_4c.png

    В этом приложении ничего сложного нет. Я за своё время таких кучу наделал на Дельфях и C#, одно из них меня попарило на неделю - особый календарь-органайзер со своей отрисовкой чисел и их подсветкой. У каждой клетки числа было своё поведение под мышкой и связь с небольшой базой данных. Писал я это дело на Дельфи в качестве задания на собеседовании. Программу я написал, но опыта как оказалось у меня было не достаточно в ОПП и в стиле написания кода... и мне отказали. Ну, что я хотел. Мне было 22 года, а там где я был сидели дяди от 30 лет, человек 8 в одной комнате за столами и долбили по клавишам с такой скоростью словно не программу, а простой текст печатали.

    Я Паскаль не люблю из-за его синтаксиса. Я не люблю слова begin, end, объявление переменных в начале функции, а самое главное :) терпеть не могу ":=" вместо "=" как на C#.

  15. Попробуй так:

    using System;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;

    namespace SimpleTrainer
    {
    public partial class TrainerForm : Form
    {
    public TrainerForm()
    {
    InitializeComponent();
    }

    const string ProcessName = "winmine"; // изменить на имя другого процесса

    private void Button1Click(object sender, EventArgs e)
    {
    // Изменить на нужный адрес
    SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x010056A4, new uint[] { 0xFFFFF }, 4);
    }


    public static class SystemProcess
    {
    [DllImport("kernel32.dll")]
    public static extern Int32 CloseHandle(IntPtr hObject);

    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);

    [DllImport("kernel32.dll")]
    public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten);

    public static void WriteMemoryData(string processName, IntPtr address, uint[] writeData, uint sizeData)
    {
    var idProcess = (UInt32)System.Diagnostics.Process.GetProcessesByName(processName).First().Id;
    var hProcess = OpenProcess(0x1F0FFF, 0, idProcess);

    WriteProcessMemory(hProcess, address, writeData, sizeData, (IntPtr)0);
    CloseHandle(hProcess);
    }
    }
    }
    }

  16. Cheat Engine 6.2 Alpha 2

    Link

    What's new:

    Some bugfixes. (Try and find out which ones are fixed and which ones are not. Tell me to confirm. It's a fun game!)

    Added feature to automatically fill in pointers in structures

    Rightclicking registers in memview while debugging for show in disview/hexview

    While single stepping, and changing eip, will change the selected address if eip is the currently selected line...

    Appease the autoassembler NOP haters by just using the biggest instruction instead of filling with nops

    The addresslist now has a lua function to return the selected records

    Add address/change address should now support custom types (known bug: Editing an address with custom type doesn't set the typename)

    Report any bug and you find and gui suggestions, even if you think I already know about it

  17. На 100% я не знаю что делает "Lock mouse", т.к. в CE ещё не проверил, но обычно функция "Lock mouse" это принуждении курсора всегда быть по центру при чем курсор может не отображаться.

    Если это так, то у этой функции есть как минимум одно полезное применение.

    Когда в игре используешь InGameMenu, то блокировку курсора надо снять. Да, но когда меню надо закрыть курсор же надо так же "вернуть обратно" - зафиксировать его по центру, и продолжать играть как играли. Вот тут и пригодится эта функция.

  18. C# как и любой другой язык программирования имеет техническую справочную документацию.

    Чтобы освоить язык на минимуме и применять его в таких простых вопросах сначала изучают назначения основных сборок, пространств имен в этой документации. Затем идём по классам. И находим класс Keyboard

    System.Windows - пространства имен 
    System.Windows.Input
    Keyboard - класс
    Keyboard - методы
    AddGotKeyboardFocusHandler - метод
    AddKeyboardInputProviderAcquireFocusHandler - метод
    AddKeyDownHandler - метод
    AddKeyUpHandler - метод
    AddLostKeyboardFocusHandler - метод
    AddPreviewGotKeyboardFocusHandler - метод
    AddPreviewKeyboardInputProviderAcquireFocusHandler - метод
    AddPreviewKeyDownHandler - метод
    AddPreviewKeyUpHandler - метод
    AddPreviewLostKeyboardFocusHandler - метод
    ClearFocus - метод
    Focus - метод
    GetKeyStates - метод
    IsKeyDown - метод --- > вот что тебе надо
    //....

    Перейди по ссылке на которой найдёшь описание нужного примера.

    Вот ещё пример:


    //...
    if (Keyboard.IsKeyDown(Key.A)) return true;
    //...

  19. CheatEngine62Alpha1

    Link

    What's new:

    New tutorial step

    D3DHook and lua extensions (mainly for creating gui's inside games)

    Rewrote the dissect data window from scratch (needs thorough testing)

    Merged Add Address and Change Address in one window redesigned from scratch

    Native threads for lua

    Some graphical functions have been exported to lua

    LuaCall AA command

    Some disassembler fixes

    Bunch of other bugfixes

    Still some stuff to add, but it got enough to test/play with.

    Know/reported bugs:

    custom types can not be set in the new Change Address window (yet)

    Report any bug and you find and gui suggestions, even if you think I already know about it

  20. keng, я думаю что не пять, а более.

    В моих целях применять ассемблер и диззассемблер во время работы трейнера используя CE Lua-engine - скрипты для создания автоматически формируемых инъекции по неизвестным дизассемблерными инструкциям по адресам внедрения нового кода с условиями в виде правил. Возможно твои цели менее глобальны и сканер на MASM-е тебя вполне устроит.

    Например, я желаю, чтобы программа нашла адрес сигнатуры кода и независимо от того какой именной машинный код там будет произойдёт внедрение постоянного условия - чтобы значение на текущей инструкции соответствовало правилу "Постоянное значение 500". Т.е. если у нас там будет mov eax, ebx, то сформируется АА-скрипт по записи в ebx числа 555, записи в eax значения из ebx и прыжок обратно в игровую рутину.

    Суть в том, что нужен не только сканер сигнатур, а дизассемблер и ассемблер и всё это во время уже запущенного трейнера. Пока я эту фишку с автоматически формируемыми инъекциями на CE Lua-Engine не реализовал. Зато сделал на Дельфи (где-то больше года назад что ли) для самых распространённых инструкций: mov, add, sub.... Исходники лежат в закрытом подфоруме, но видны Разработчикам..

  21. Как раз здесь не нужен этот модуль . И здесь код хаотичный, т.к. аналогично - без инкапсуляции данных. Без инкапсуляции приходится читать код в 2-3 раза медленнее. Суть такова. Есть чексбокс. Когда в нём ставим галку то, происходит заморозка по таймеру.

    Очевидно что нужно создать статический класс Трейнера и из обработчиков класса формы использовать методы класса трейнера.

    В C# нельзя обратиться к API функциям без объявления их импорта, типа этого.

            [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
    private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, [Out] int lpNumberOfBytesRead);

    Если писать на VC++, то с этим меньше гемора, т.к. там все эти функции используются через windows.h. А вообще как я сказал код без классов смотрится как "каша" или как бордак на рабочем столе как у меня сейчас. Куча ярылков, все некогда разгрести.

    Если сравнивать C# и С++ для создания трейнеров, то есть свои плюсы и минусы, которые зависят от того, какой трейнер нужен Разработчику. В качестве интерфейса C# нагляднее для новичков в программировании.

    А вообще на Visual Studio можно создавать два вида форм. Windows Forms и WPF. Последняя технология более смахивает на программирование по html разметке, только там разметка называется XAML. Я на ней уже не кодил почти два месяца, а раньше в захлёб писал только на WPF + C# каждый день в течении года, но когда я нашёл работу по Unity3D, то пришлось о Visual Studio пока забыть и писать на MonoDevelop. В данный момент вожусь с импортом и оптимизацией под Андроид, а затем под IPAD и Web-плеер в качестве плагина. Вообще я не жалею, что столько времени угрохал на GUI Windows и перешёл на GUI в Unity3D. Не жалею что сейчас работаю с .NET2.0, когда привык к .NET4.0 к Linq-выражениям.... Ладно, что-то я от темы отклонился.

    Короче, советую писать трейнеры на Cheat Engine. Есть прекрасное направление -> создание АА-скрипта по дизассемблерному коду, когда вы заранее не знаете, какая инструкция будет по адресу сигнатуры, но вы знаете первый байт.

    Адрес1: mov "вы не знаете что здесь","вы не знаете что здесь"

    *Адрес1 находим по сигнатуре

    На Lua-engine можно написать небольшой парсер для основных инструкций

    mov [reg1], reg2

    mov reg1, [reg2]

    mov reg1,reg2

    И если по адресу1, есть какой-то известный шаблон из трёх выше, то можно сделать генерацию АА-скрипта по шаблону и правилу. Например, правило "постоянное значение". В результате сгенерировать АА-скрипт с постоянным значением...

    Большинство трейнеров на языках программирования под Windows не обладают той потенциальной мощью, которую предоставляет Cheat Engine + Lua. Если эта мощь не нужна и хочется делать трйенеры для каждой версии игры, где каждый трейнеры весит от 16 кб (хороший трейнер на С++ или Дельфи без VCL или на MASM) до размера трейнера в 3 Мб сгенерированного на CE, то конечно это предпочтение каждого.

  22. VAMemory.dll как один из вариантов должна быть рядом. Второй вариант включить в ресурсы и извлекать из них. Третий вариант, написать свою обвёртку по работе Api Windows. Есть и другие.

    Делать трейнеры на C# как и на любом другом языке программирования круто до поры до времени. Потом можно понять, что придётся прикручивать что-то типа автоассемблера из Cheat Engine, потом в конце поймёшь зачем прикручивать, когда можно пользоваться CE и когда последний периодически обновляется с новыми идеями и возможностями.

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

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

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