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

MasterGH

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

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

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

    129

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

  1. Пишу для себя напоминание

    Предложение по брейкпоинтам.

    - Ввести возможность остановки на брекпоинтах.

    - Ввести возможность остановки по условию. Например, когда ecx=0x00546 и т.п.

    1. Остановка на брейкпоинте.

    - Получаем список брейкпоинтов на адресе.

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

    2. Остановка на брейкпоинте с условием.

    - Получаем список брейкпоинтов на адресе.

    - Выделяем нужные бряки, пишем для каждого условие прерывания; на "выделенных бряках" при следующих их прерываниях происходят остановки.

    3. Остановка на на инструкции с условием.

    - Выделяем любые инструкции и можем ставить любые бряки с условиями.

    4. Ввести из старых версий сравнение значений регистров и стека на бряках. Очень полезная возможность, мне помогала что-то исследовать.

    5. Ввести шаблоны в автоассемблер автоматической иньекции:

      - сложные условные бряки заменяются на код иньекции.

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

      

    6. Трассировка с визуальным оформлением и логированием регистров на входах и выходах из call-ов

    7. Менеджер реверсера - окно включающее:

       - последовательные цели реверсера (разделяемые на выполненные и не выполненные)

       - ссылки на окна структур с комментариями целей

       - особые комментарии из дизассемблера

       - особые условные бряки с логами регистров и дополнительными комментариями

       - особая информация о родительских и дочерних вызовах, а также прыжках и ключевых прыжках

       - особые участки, которые можно нопить/изменять прыжки с комментариями

       - окно групп брейкпоинтов, которое позволит включать/выключать бряки группами.

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

  3. ANT' date='16 Октябрь 2010 - 12:50' timestamp='1287208242' post='1464']

    2 MasterGH

    Автоассемблер CE не понимает "movss xmm0,4640E400", поэтому я написал так, как написал.

    Существует такой вариант

    movd eax,4640E400 

    movd xmm0,eax

    Может быть так прокатит

    movd xmm0,4640E400

  4. Я бы так написал

    [ENABLE]
    alloc(newmem,2048)
    label(_GodMode)
    label(_ExitGM)
    label(_BackGM)
    label(_pPlayerID)

    registersymbol(_pPlayerID)


    witcher.exe+37B1B0:
    jmp _GodMode
    _ExitGM:

    newmem:

    _GodMode:
    // save pointer
    push ecx
    mov ecx,[witcher.EXE+850EAC]
    mov ecx,[ecx+B8]
    mov [_pPlayerID],ecx

    pushf
    cmp esi,ecx
    jne _BackGM
    movss xmm0,4640E400

    _BackGM:
    popf
    pop ecx
    movss [esi+48],xmm0
    jmp _ExitGM


    _pPlayerID:
    dd 0

    [DISABLE]
    witcher.exe+37B1B0:
    movss [esi+48],xmm0

    Ошибки проверяются в отладке. Pushf, popf возможно не нужны.

  5. Ладно, дело плёвое и лень писать скрипты.

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

    На тренировке ищем значения некоторого ползунка типа 1 байт.  Находим 4 адреса из них и путём проб находим  рабочий. Лезем в память и видим, что там как писал M4K значения близлежащих ползунков. Соответственно можно исправить их всех вручную или скриптом CE.  Должен быть цикл который читает все ползунки и в нём сделать инъекцию, так чтобы нехватающее количество белых прямоугольников в ползунках до  возможных 6-ти было восполнено.

    Если хотим зелёные прямоугольники в ползунках в меню тренировки, то надо разобраться чем одни отличаются от других. Мне лень с этим возиться. Если хотим зелёные  в меню создания игрока, то как в этом случае быть я без понятия, т.к. я не доделал... Большую часть времени я потратил на разбирательства почему общее количество доступных очков не отображается как надо. Я делал 10, 200 доступных всех очков, но отображалось постоянно 9. Хотя было на самом деле 10 и 200, и можно было добавлять белые прямоугольники так же 10 и все возможные. Вышел я на доступные очки следующим образом. Т.к. я предположил, что читаются количество очков в цикле, суммируются и сравниваются с общим возможным количеством. Если можно, то добавляем очки, если нет, то нет. Вот его-то я и нашёл, и изменил, а всё равно отображалось 9 доступных (белых прямоугольников) заданных при создании игрока. 

    Ну, ладно... 

    • Плюс 1
  6. Я тоже взломал   B)

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

    Как я писал я нахожусь сейчас в меню создания игрока, а в твоём SER[G]ANT меню ещё не был. Может по этому ты быстрее меня нашёл?!

    Ну, ответ тогда напишем чуть позже, т.к. может Лив сам поймёт в чем дело. 

  7. Тема. Управление игровыми персонажами скриптами MHS.

    Заставим Марио бежать и попрыгать при этом.

    post-3-1286358562,15_thumb.png

    Для этого нужно воспользоваться следующим скриптом.


    void send_key_loop (char * pChar, int loop, int wait1, int wait2){
       int counter;
       short letterke ;
       int iLength = StrLen( pChar );
      
       for ( counter = 0; counter < loop ; counter++ )
          {
           letterke = VkKeyScan( pChar[0] );
           KeyboardEvent(letterke,0 );
           Sleep(wait1);
           KeyboardEvent(letterke,KEYEVENTF_KEYUP);
           Sleep(wait2);
          }
    }

    VOID On_HK_23( DWORD dw1, DWORD dw2 ) {
        //Clear();
        CHAR * pCharJamp = Malloc(12);  
        pCharJamp = "c\0";
      
        // Удерживаем вправо 1 секунду - разгоняемся
        KeyboardEvent(VK_RIGHT,0);
        Sleep(1000); // разгончик!
        // Подпрыгиваем три раза!
        send_key_loop(pCharJamp,3,1000,1000);
        // Останавливаеся
        KeyboardEvent(VK_RIGHT,KEYEVENTF_KEYUP);  
          
        PrintF("Попрыгали");
        Free(pCharJamp);
    }

    Этот скрипт можно связать с горячей клавишей, например, с "J" как это было показано выше в постах. Теперь если нажать на J, то Марио выполнит разбег и три прыжка. Этот пример показывает что MHS может посылать нажатия клавиш DirectX-приложениям в том числе. 

    К этому добавлю, что можно написать скрипт чтения нажатий клавишь с сохранением в память или файл. Затем эти нажатия можно эмулировать с различными поправками. С игрой Марио, например, можно записывать каждое прохождение и если Марио погибает, то предыдущее прохождение можно повторить автоматически :) Ну а самое интересное это сделать так чтобы Марио сам проходил игру.

    • Плюс 1
  8. Привет.

    mov eax,[ecx+08] это инструкция вероятно типа C(A).

    post-3-1286060368,89_thumb.png

    Рис.1 Специально поставлены нопы (из-за бага CE...). Стрелкой показано определение адресов. Значения по некоторым адресам весьма большие, возможно это даже не значения, а адреса на другие значения.

     

    Она работает со структурами относящихся к главному герою, если это не так тогда будет C(В). Если хочешь внедрять именно в это место, то придётся писать фильтр. Пока я не понял какой, правда у человека у которого ты взял скрипт уже фильтры "готовы" и можно их применить в своём скрипте. Нельзя делать фильтр только на ecx, т.к. ecx недостаточно - все ecx принадлежат например герою, но есть ещё критерии и их нужно найти.

    Однако я советую, т.к. к этой инструкции идёт частое обращение по всяким "лишним адресам", то попытаться найти

    1) три участка кода для каждого ресурса которые вычитают ресурсы  - внедрить в них новое условие, которое не позволяет ресурсам уменьшаться

    2) при активации читов для ресурсов, должен быть ещё один скрипт, который установит ресурсы и они сразу отобразятся.

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

  9. Внимание в моём посте выше в теме "Создание трейнера на Дельфи для начинающих" теперь правильно расставлены скриншоты. В некоторых местах кода было исправление на OldProtectPage - восстановление предыдущей защиты стариницы памяти. Также я не пояснил для тех кто не знает. Страница памяти кратна 1000 байт. Если изменяем защиту памяти процесса для адреса, то меняется вся страница памяти включающая этот адрес. Более подробно я где-то писал на форуме про защиту памяти.

    Специально для тех кто не хочет регистрироваться или для Лива исходники пока можно скачать с рапиды - ссылка. Сроки хранения исходников на сайте по ссылке ограничены.

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

  10. Создание трейнера на Дельфи для начинающих

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

    Скачайте новый проект Source_SimpleTrainer.rar и можете прочитать, как он был сделан. 

    Цель - записать один раз значение “100” по некоторому адресу. Возьмём за пример тестовую программу test.exe, которая лежит вместе с исходниками.

    Найдём адрес значения в Cheat Engine

    post-3-1285051666,29_thumb.png

    Рис.1

    Поскольку адрес теперь мы знаем,то приступим непосредственно к делу.

    Скачаем среду разработки Дельфи Лайт (размер установщика порядка 70 мб). Дельфи не плохая среда разработки и подходит для начинающих только изучающих язык Паскаль или боле сложный язык Дельфи (Дельфи можно называть языком и средой разработки)

    Писать мы будем на готовой форме, поэтому трейнер будет порядка 500 кб. Если хотите меньше, то просим на наш форум.

    Создадим проект как показано на рисунке.

    post-3-1285051667_thumb.png

    Рис.2

    Разместим компоненты таймера и картинки (шаг 3, шаг 4)

    Кликнем на форму, на которой уже есть таймер и пунктир картинки и заполним поля (шаг 1, шаг 2)

    post-3-1285051668,37_thumb.png

    Рис.3

    Выделим мышкой иконку таймера, которую вы перетащили на форму и поставим в свойствах Interval 100.

    Кликнем на картинку и установим её свойства:

    Align – alClient (выравнивание картинки внутри главного окна)

    picture - выберите вашу картинку. Я взял скрин с нового номер журнала Игромании.

    У таймер поставьте свойство интервала в 10 мс и Enable поставьте true

    Напишем модули (но их писать не надо, т.к. они уже у Вас есть):

    MemoryUse.pas

    Metrik.pas

    Process.pas

    Sound.pas

    MemoryProtect.pas

    Вы можете увидеть их в готовом проекте

    post-3-1285051671,12_thumb.png

    Рис.4

    Дальше сделаем обработчики события: кликаем на компонент, переходим во вкладку events (события), выбираем событие и по два раза кликаем мышкой на нём чтобы сформировать код обработки события.

    Теперь на о том как это делается.

    Кликаем на окно формы. Переходим в events и дальше как на рисунке

    post-3-1285051674,72_thumb.png

    Рис.5

    Тоже самое теперь проделываем с таймером.

    post-3-1285051683,92_thumb.png

    Рис.6

    И наконец, пишем код выделенный красной рамкой.

    post-3-1285051684,74_thumb.png

    Рис.7

    Полный код представляет следующее.

    unit frmMain;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, jpeg;

    type

    TForm3 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;

    var
    Form3: TForm3;

    implementation

    {$R *.dfm}
    uses Process,MemoryUse,MemoryProtect, Metrik, Sound;

    var
    Process : TProcess;
    MemWriter : TMemWriter;
    MemProtected : TMemProtected;

    procedure TForm3.FormCreate(Sender: TObject);
    begin
    Process:=TProcess.Create('test.exe');
    MemWriter:=TMemWriter.Create(Process);
    end;

    procedure TForm3.FormDestroy(Sender: TObject);
    begin
    MemWriter.Free;
    Process.Free;
    end;

    procedure TForm3.Timer1Timer(Sender: TObject);
    begin
    if (GetAsyncKeyState(VK_F2)<>0) then // если нажата клавиша F2 то…
    begin
    MemProtected:= TMemProtected.Create(Process,$0045B5A4,4); // снимем защиту страницы памяти с адреса $0045B5A4
    MemProtected.UnProtectPage;
    MemWriter.TryMemDIGWrite('$0045B5A4','100',_dword); // запишем адрес
     MemProtected.OldProtectPage; // восстановим защиту страницы памяти
    MemProtected.Destroy;
    sleep(500); // пауза, чтобы пользователь
    end;
    end;

    end.

    Компилируем проект: значок плей. В этот момент происходит компиляция и запуск приложения. Проверям. Нажимаем на F2 происходи звук. Кликаем на кнопку тестовой программы и мы видим, что число там стало не 117, а 101.

    Заключение.

     Это руководство всего лишь начальный старт для тех, кто только учится писать трейнеры например на Дельфи. Есть ещё более гибкий язык C++ поддерживается средой разработки Visual Studio. Именно на этой среде разработки создано множество игр под операционную систему Windows. На C++ как-то приятнее писать программы c WinAPI, т.е. трейнеры. Но он и гораздо сложнее, чем Дельфи. Так что выбор за вами.

    Здесь было рассмотрено, как создавать проект в Дельфи. Немного показано как работать с компонентами VCL, как формировать обработчики событий. Было показано как заставить трейнер реагировать на нажатие кнопки клавиатуры записывая значение по адресу. Вы также можете создать ещё один таймер2, который будет замораживать значения по адресу. Таймер горячих клавиш будет включать таймер2.


    procedure TForm3.Timer2Timer(Sender: TObject);
    begin

    if (cheat1 = true)

    begin
        MemWriter.TryMemDIGWrite('$0045B5A4','100',_dword);
    end;

    end;

    Не забудьте перед включением таймер2 использовать один раз


    MemProtected:= TMemProtected.Create(Process,$0045B5A4,4); // снимем защиту страницы памяти с адреса $0045B5A4
    MemProtected.UnProtectPage;

    Без


    MemProtected.OldProtectPage; // восстановим защиту страницы памяти
    MemProtected.Destroy;
    sleep(500); // пауза, чтобы пользователь успел отпустить клавишу

    Когда вы выключите таймер2, то используйте


    MemProtected.OldProtectPage; // восстановим защиту страницы памяти

    MemProtected.Destroy;

    Недостатки этого трейнера:

    1) Я описал поддержку записи только в адрес памяти простым методом. Но этого может "не хватить".

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

    Бывают случаи когда цепочка указателей состоит из динамических звеньев [[[статичный адрес]+смещение1]+смещение2] = значение. Например, смещение 1 постоянно меняется, и найти его можно только через условие, которое можно оформить только программным путём.

    Например,


    Если [[[статичный адрес]+0x250] равно 0x14, то

    {

    смещение1 = [[[статичный адрес]+0x254]
    [[[статичный адрес]+смещение1]+смещение2] = значение.

    }

    Т.е. в данном случае имеем динамический массив объектов, которые часто перетасовываются во время игры. Объекты содержат свой собственный тип. Игра обращается к адресу объекта приводя его к типу, а тип получает по идентификатору, который объект содержит в своей структуре.

    В общем тут свои сложности.

    2) В сжатом виде, если запаковать пакером этот трейнер занимает 270 кб. Можно использовать WinAPI и тогда он будет меньше.

    3) Тем не менее, всё это не то. Трейнер по моему представлению должен представлять из себя загрузчик .dll в процесс игры. И там эта .dll ка может творить многие вещи. Тем более dll-ку можно писать на языке высокого уровня и удобно делать очень сложные читы, которые на ассемблере в скриптах Cheat Engine писать трудоёмко.

    Если у вас есть вопросы, то их можно задать у нас на форуме.

    • Плюс 1
  11. Guru.eXe, если тебя очень волнует вопрос о законности применения трейнера, то можешь не беспокоиться. Трейнеры по сей день выкладывают лицензированные фирмы игровых журналов на своих дисках и ничего страшного - они продолжают выкладывать. Другое дело NoDVD. Его предназначение - отнять потенциальную прибыль у разработчика. Соответственно, он если очень постарается, то сделает всё возможное чтобы свою потенциальную прибыль увеличить. И размещение NoDVD для нас не выгодно, т.к. пускай хоть и немного мы будем стимулировать разработчиков к новым защитам мешающим создавать чит-коды с помощью трейнеров. А самое главное у нас могут быть проблемы с фирмами локализаторами, которые находятся в России и им куда проще разобраться с Xipho :) Да, да... все тумаки достанутся в первую очередь ему, если достанутся ) 

  12. Xipho давно мне писал, что у нас на сайте незаконных вещей не будет. Конечно, можно попробовать в законе лазейки найти, типа "nodvd-программы не хуже чем нормальные, но пользоваться ими нельзя, т.к. это не законно"...

    Но зачем нам nodvd, этого навалом полно на других ресурсах. Наша задача создание читов, а NoDVD к читам отношения не имеет, также как и читы не имеют отношения к NoDVD.

    Посмотрим что напишет Xipho. Я - против.

  13. Тема. Создание и внедрение dll при помощи Cheat Engine.

    Сейчас у меня есть время на то, чтобы открыть самые основы этого метода и обратить внимание на его перспективы. Сразу напишу о перспективах. Ну, что тут сказать, если использовать этот метод внедрения чит-кодов, то открывается возможность использовать всю мощь языка программирования на котором вы пишите dll-ку включая ассемблерные вставки. Я же очень советую готовиться психологически переходить именно на этот метод совместно с языком C++ и использовать именно его, а не автоассемблер из Cheat Engine. Я не смогу раскрыть всё, то что можно сделать, но основы я покажу.

    Скачиваем VisualStudio 2010, если вам удобно, то на русском языке. Создаём проект типа Win32, называем его например AppCheatsLib. Перед вами будет мастер проектов, с различными переходами. Отметьте что проект будет создан как dll и будет пустым. У вас создаться пустой проект.

    В правом верхнем углу выделяем проект AppCheatsLib.dll и кликаем правой кнопкой мышки чтобы вызвать меню. Выберите добавить-> новый элемент. Там выберите Создать класс. Файл описания назовите CheatsLib.h, а реализации описания CheatsLib.cpp. Уберите предкомпиляцию. У вас создастся два файла.

    Пока я хочу показать только такой простой пример. Возьмите какую-нибудь программу или игру. Найдите и запомните в ней адрес параметра, который нужно будет изменить один раз при помощи метода загрузки dll. Допустим этот адрес будет равен 0x0041d090.

    А теперь в двух файлах удалите сгенерированных код и напишем свой:

    // CheatsLib.h

    namespace CheatsLib
    {
    class Cheats
    {
    public:
    // Write value 1000
    static __declspec(dllexport) void Cheat_WriteValue_10000(); // запомните эту экспортируемую функцию

    };
    }


    // CheatsLib.cpp
    #include "CheatsLib.h"
    #include <windows.h>

    namespace CheatsLib
    {

    void Cheats::Cheat_WriteValue_10000()
    {
    *(DWORD *)0x0041d090 = 10000; // поставьте свой адрес и своё значение
    }

    }

    После этого найдите выпадающий список вверху с надписью Debug и смените на Realise и теперь собираем проект горячей клавишей F6. Заходим в директорию с проектом ищем папку Realise и в ней наша супер библиотека AppCheatsLib.dll.

    ЗапускаемCE. Аттачим CE к процессу вашей игры/программы адрес которой вы нашли. В CE находим функцию внедрения dll из меню и вызываем её. Указываем путь к нашей AppCheatsLib.dll и жмём Ок. Сразу будет сообщение о том, не хотим ли мы запустить какую-то функцию из dll. СОГЛАШАЕМСЯ. И перед нами появится список в котором вы сможете узнать функцию

    Cheats::Cheat_WriteValue_10000()

    Выбираем её и жмём ОК. После этого значение в игре/программе должно измениться. На этом всё.

    Также мы могли бы использовать ассемблерные вставки и много всего-того что можно придумать. НО. Это всё дело довольно сырое. Здесь нет считывания горячих клавиш, нет инъекции кода (мы не затирали инструкции), нет сканера сигнатур, нет контроля активации и деактивации и многого другого. Как будет сделано это много другое, то с успехом можно писать загрузчик dll-ки и этот загрузчик можно будет делать как трейнер, а dll-ку поместить в его ресурсы. Ну а после таких нескольких трейнеров можно строить один общий трейнерМакс, про который я уже говорю чуть ли не каждый пост (самому надоело :) ). Дело времени и дело бодрого настроения реализовать это всё...

  14. Может ли СЕ запустить не екзешник, а ярлык с него!?

    Ибо запуск должен быть именно такой: \randevu.exe" k WIN

    Можно (уже был ответ)

    Игра не сворачивавется, в окно принудительно загоняетсо, но глючит зверски,

    Ищи ниформацию как ставить оконный режим.

    Можно ли запустить через СЕ игру с ярлыка и уже убыстренную в 3 разу!?

    Эта функциональность не поддерживается.

  15. Может ли СЕ запустить не екзешник, а ярлык с него!?

    Ибо запуск должен быть именно такой: \randevu.exe" k WIN

    Игра не сворачивавется, в окно принудительно загоняетсо, но глючит зверски,

    а надо с игрой сделать вот чего - убыстрить в 2 или 3 раза!

    ИБО, мне надо играть в  боулинг с 3мя противниками, а по времени это пипец.

    Можно ли запустить через СЕ игру с ярлыка и уже убыстренную в 3 разу!?

    Сколько можно писать сленгом со словами "пипец, глючит, загоняется  ..." Большинство игр, которые тебя интересуют все с уклоном на порнуху.  Взрослеть пора.  

  16.  Трейнер генерируемый CE  довольно навороченный не там где надо и довольно много мусора в коде - надо всё это переделывать, а уже затем думать над упаковщиком. При чём не просто переделывать, а большие куски убирать.  Не нужен там автоасссемблер, не нужны такие навороты с перехватами нажатий клавиш, не нужна эта VCL - оболочка - густая паутина для какого-то простого трейнера. Эти модификации не очень важны на мой взгляд или вообще не нужны. Раньше я думал автоассемблер, который юзает сгенерированный CE трейнер это круто, теперь я думаю что это очень неудобно. Что можно сделать автоассемблером, а что можно сделать полноценным компилятором C++, который поддерживает те же ассемблерные вставки да ещё и объектно-ориентированный код?! ... 

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

    1) создании трейнеров с ограниченными возможностями (не новинка)

    2) шпионаже за writeprocessmemory чужих трейнеров (тоже не новинка)

    3) сканере памяти (изобретение велосипеда, как и остальное)

    Я всё-таки больше склоняюсь к более полезным возможностям. Например, было бы неплохо (и не трудно это сделать) сделать поддержку загрузчика dll-ки в процесс игры созданным потоком. В этой dll-ке специально написанной для игры можно реализовать очень и очень многое вплоть до решений больной темы "обмана количества объектных типов". И при чём написать код в dll-ке  можно на удобном языке высокого уровня поддерживающего ассемблерные вставки. Есть и ещё более гибкий способ (я о нём писал когда-то) это не использоваться код в dll-ках, а копировать код трейнера в процесс игры и исполнять его. Естественно, код трейнера компилируется в среде разработки программ. Это всё для случая, когда пишем авторские трейнеры отдельно для каждой игры.

  18. Жаль мне не до исходников в данный момент.

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

    Если есть фаны ДаркБайта, то не при них будет сказано. У него плохой стиль программирования, точнее "грязный", допуск варнингов, хинтов, названия переменных, куча потоков, сбор сообщений, лишнее потоки... А самый  "ужасный грех" в том, что программа CE плохо и коряво спроектирована на всём этапе разработки и этим автор показывает что не знаком с ООД. Чем дальше он будет писать обновления, тем сложнее будет что-то менять, переставлять, удалять и т.п. - сделано наспех и сделано и делается как "постоянный черновик". Каждая вышедшая версия, должна быть лишена этих недостатков. Тем не менее спасибо ему за программу, т.к. лучше так чем ни чего - ни исходников и не обновлений CE. 

  19. Ошибка и тормоза сканеров памяти, видимо, связаны с нехваткой памяти для сканирования.

    Я бы попробовал искать указатель на структуру щита. 4 байта целое.

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

    После того как я нашёл бы этот указатель, то колдовал бы уже в отладке, чтобы найти свойство активации этого щита.

    Если будет у меня время, то попробую помочь.

  20. Пока работает щит, должен работать таймер по интервалу и счётчик этих интервалов. Например, интервал 1 секунда, а счётчик складывает секунды. Когда время достигнет своего порога щит - пропадёт.

    Так что, скорее всего, ищи счётчик интервалов времени. Я бы взял за поиск 4 байта целое и два правила поиска в прямой и обратной пропорциональности с отсевами не менее через 1 секунду. Так что пробуй.

    Ну и ещё хороший вариант, это поиск и заморозка флагов либо ноль, либо единица в какой-то момент: либо когда щит выключен/включен, либо наоборот включен/выключен. Ну а если флаг найдёшь, а его заморозка ни к чему не привела, то лучше лезть в отладку и искать зацепки как сделать щит.

  21. Простой трейнер на C# (10 кб) для тестого приложения Test.exe

    post-3-1280812041,03_thumb.png

    Основная моменты следующие.

    Мы просто по таймеру пишем значение в какой-то адрес. Примитивное действие правда?

    -Создаём объект доступа для процесса (на самом деле он просто запоминает имя процесса):

    AccessProcess_x86 accessProcess = new AccessProcess_x86("Test");

    - Используем метод записи значения 9999 в адрес 0x0045B5A4 размером 4 байта 

    accessProcess.ProcessWriteMem(0x0045B5A4, 4, 9999)

    - Дальше создаём таймер, условие работы таймера, условие работы чекбоксов...

    1. Создайте AccessProcess_x86.cs и добавьте код:


    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;

    namespace AplTrainer
    {
    /// <summary>
    /// Класс работы с процессом ОС
    /// </summary>
        class AccessProcess_x86
        {
            private string processName;

            public AccessProcess_x86(string processName)
            {
                this.processName = processName;
            }
            /// <summary>
            /// Права доступа
            /// </summary>
            [Flags] //AccessRights
            public enum ProcessAccessRights
            {
                PROCESS_VM_READ = (0x0010),
                PROCESS_VM_WRITE = (0x0020),
                PROCESS_VM_OPERATION = (0x0008),
                PROCESS_ALL_ACCESS = (0x001F0FFF)
            }
            [DllImport("kernel32.dll")] //OpenProcess function
            public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheiritHandle, UInt32 dwProcessId);
            [DllImport("kernel32.dll")] //CloseHandle function
            public static extern Int32 CloseHandle(IntPtr hObject);
            [DllImport("kernel32.dll")] //ReadProcessMemory function
            public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead);
            [DllImport("kernel32.dll")] //WriteProcessMemory function
            public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In] byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead);
            [DllImport("kernel32.dll")] //GetLastError function
            public static extern UInt32 GetLastError();
            [DllImport("kernel32.dll")] //SetLastError function
            public static extern void SetLastError(UInt32 dwErrorCode);

            /// <summary>
            /// Запись значения по адресу
            /// </summary>
            /// <param name="addres">адрес</param>
            /// <param name="SizeData">размер записываемого значения</param>
            /// <param name="value">записываемое значение</param>
            public bool ProcessWriteMem(UInt32 addres, byte SizeData, UInt32 value)
            {
                Process[] MyProcess = MyProcess = Process.GetProcessesByName(processName);
                if (MyProcess.Length == 0)
                   return false;

                IntPtr hprocess = OpenProcess((uint)ProcessAccessRights.PROCESS_ALL_ACCESS, 1, (uint)MyProcess[0].Id);
                if (hprocess.ToInt32() == 0)
                   return false;
              
                byte[] buffer = BitConverter.GetBytes(value);
                uint num = 0;
                Int32 writeresult = WriteProcessMemory(hprocess, (IntPtr)addres, buffer, SizeData, ref num);

                if (writeresult == 0)
                {
                    UInt32 lastError = GetLastError();
                    MessageBox.Show(lastError.ToString());
                    CloseHandle(hprocess);
                    return false;
                }

                CloseHandle(hprocess);
                return true;
            }
        }
    }
    using System;

    2. На форму бросьте "таймер" и "список чекбоксов". Введите в первое поле списка чекбоксов надпись как на скриншоте. Сформируйте автоматически обработчики событий для списка чек-боксов и таймера. Эти события увидите в коде ниже.

    3. В коде основной формы (там же и обработчики) напишите:


    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;


    namespace AplTrainer
    {
        public partial class frmTrainer : Form
        {
            AccessProcess_x86 accessProcess = new AccessProcess_x86("Test");

            public frmTrainer()
            {
                InitializeComponent();
            }


            private void CheatListBox_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                if (!FreezeTimer.Enabled)
                     FreezeTimer.Start();
            }

            private void FreezeTimer_Tick(object sender, EventArgs e)
            {
                bool mayworktimer=true;

                foreach (int indexChecked in CheatListBox.CheckedIndices)
                {
      
                    switch (indexChecked)
                    {
                        case 0:
                            {
                                if (!accessProcess.ProcessWriteMem(0x0045B5A4, 4, 9999))
                                    mayworktimer = false;
                            }
                            break;
                    }

                    if (!mayworktimer)
                         FreezeTimer.Stop();
                }
            }
        }
    }
    using System;

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

    Также этот код можно усовершенствовать добавив поддержку записи/чтения по адресам многоуровневых указателей, что сделать не сложно и многое другое. Жаль, что нет возможности ассемблерных вставок, но ухитриться можно

  22. Выликий Code Filter

    Фантазии Эль Спиро можно позавидовать в создании такой функции как Code Filter. Её можно найти по пути: Tools->Code Filter  из главного окна или через окно дизассемблера (путь надеюсь сами найдёте).

    Принцип следующий (см. на скрин)

    post-3-1280662497,95_thumb.png

    Мы перехватываем функции, которые работают в какое-то время. На рисунке я сделал три папки выполнения кода в во времени:

    1) Работа окна - при этом я нажимал на клетки мин мышкой, но отпускал за пределами окна игры, таким образом не влиял на количество мин.

    2) Уменьшение мин - когда ставим флажок

    3) Увеличение мин - когда снимаем флажок

    Каждая последующая папка(т.е. фильтр) в группе исключает фильтры предыдущие. Можно ставить/снимать галочку на/с пункт/а контекстного меню "Exclude Results" для установления фильтров. Там же View Results покажет результат того или иного фильтра. Ну короче там всё просто.

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

    post-3-1280662497,68_thumb.png

    В общем я описал как это дело работает. Кому нужно за подробностями, то они находятся в справке MHS.

    Что даёт функция  Code Filter

    С помощью неё можно установить причинно следственные связи между работой функций и какими-то входными/возвращаемыми данными :)

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

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

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