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

MasterGH

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

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

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

    129

Весь контент MasterGH

  1. Судя по скрипту Sergant-а ниже, искать нужно тип 4 байта с точкой. Примени этот скрипт, возможно тебе искать даже не придётся. [ENABLE] //Your health don't decreases only from the shots. In other cases you can die. aobscan(_faddress,0fxxxxxxxxxxxx0fxxxxxxxxxx8bxxe8xxxxxxxx84xx0fxxxxxxxxxxf3xxxxxx) alloc(_newmem,2048) label(_returnhere) label(_originalcode) _newmem: mov dword ptr [esi+000001d0],433E0000 _originalcode: comiss xmm0,[esi+000001d0] jmp _returnhere _faddress: // 005BE7B7 = JustCause2_Game.exe+1BE7B7 jmp _newmem nop nop _returnhere: [DISABLE] aobscan(_faddress,90900fxxxxxxxxxx8bxxe8xxxxxxxx84xx0fxxxxxxxxxxf3xxxxxx) _faddress-5: comiss xmm0,[esi+000001d0] dealloc(_newmem)
  2. Мне понадобилась статья по созданию компонента календаря с привязкой к dataset -базе данных. Поскольку этот компонент по работе, то я его приводить не буду, но статью обязательно приведу пока она не исчезла с рунета. Создание собственного компонента в связке с базой данной позволит удобно встраивать управление базой данных в различных программах. На пример моего компонента его можно будет встроить в любую новую разрабатываемую программу на Дельфи. Возьмём тот же cheatEngine. На форме достаточно будет разместить компонент календаря и на нём фиксировать события, которые будут выделяться определённым цветом. Например мы не доламали игрушку в различные дни, а зафиксировать заметки как-то нужно. Для этого создадим пользователя под именем "Игра "Название игры" " и на сегодняшней дате поставим логи регистров с бряками. База данных может иметь различный формат экспортироваться и импортироваться.... Я долго время знал Дельфи и не любил возиться с базами данных тем более с визуальными компонентами, теперь я иного мнения Ну лучше конечно писать базы данных на C#3.0 с технологией LINQ - более гибкая штука. Итак сама статья про создание компонента БД.
  3. Внимание. Решение первой задачи. Создание 10000 объектов после нажатия на активацию скрипта и нажатия на кнопку создания объекта. Хотя можно было помучить и сделать обновления текста, но посчитал это тратой времени. Создавая этот скрипт я обратил внимание, что нужно восполнить данные в стеке и вовремя их отсекать. pushad и pushf оставил специально для подстраховки и вы так делайте (действительно ли они там нужны). Ну и в конце после проверок и вырезания ненужных инстуркций получил: alloc(_newmem,1024) registersymbol(_newmem) label(_loop) label(_a1) label(_a2) createthread(_newmem) _newmem: push 4010C0 push 4 _loop: push 04 call 0040187c add esp,04 test eax,eax je short _a1 mov [eax],000003e7 jmp short _a2 _a1: xor eax,eax _a2: push edi lea edi,[esp+08] mov [esp+08],eax call 00401280 add esp,04 inc ebx cmp ebx,#10000 jne short _loop add esp,08 ret [DISABLE] dealloc(_newmem) unregistersymbol(_newmem) [ENABLE] Решение второй задачи будет и пока остаётся за вами. У вас уже есть пример решения первой задачи. Вот теперь попробуйте решить вторую. Затем будет трейнми2 который я сделаю по предполагаемому коду из реальной игры.
  4. Что-то никто не решил задачу, даю ещё подсказки
  5. Копать надо там, а лучше выбрать участок кода, который нужно циклически выполнить. Приведите скрипт на CE который решает задание Кто сделает и опишет весь путь взлома, тот получит +3 балла в репутацию.
  6. Там ничего не поксорено, нет никакого шифрования. И всё очень довольно просто решается. Необходимо мыслить логически (эта хоть и сложная, но самая простая задача по объектам). Вам нужно 10000 объектов. Объект создаётся, когда кликаем на кнопку складывания. По кнопке конечно же кликать 10000 раз не следует, но можно циклически выполнить кусок кода конструктора и добавление этого объекта в массив. Этот кусок кода сидит на видном месте и выполняется когда кликаем на кнопку складывания. В скритах CE можно создать поток который с нужными регистрами циклически выполнит этот кусок кода. Также можно это попробовать сделать на Сишном скрипте CE. Я написал этот трейнми на VC++2008 с шаблоном vector, который применяется в реальных играх. В этом я точно уверен. Дальше будет ещё сложнее трейнми в котором будет динамическое привидение объекта класса предка к одному из нескольких родительских.... на подобии в игре Снайпер Гхост Варриор. И тогда вы сможете попробовать взломать гранаты уже в реальной игре, потренировавшись на трейнми. Подожду до воскресения перед тем как дам решение, может быть кто-то взломает трейнми
  7. TrainMe(hard_1_0).rar Задание. Сделать количество объектов равное 10000. При нажатии кнопки на плюс должно стать 10001. Если нажали на минус, то должно быть 10000-1=9999. Это не единственное задание. После того как все задания будут сформулированы и решены, то в этом посте будет описание как заданий так и их решений. Подсказка и ограничение. Вам нужно найти конструктор объектов и создать 10000 объектов. Они будут подсчитываться при нажатиях на кнопки. Помните, что цель именно такая, а не хак отображения текста. По описаниям ваших действий можно будет судить правильно ли вы сделали. Сам этот трейнми я обманул, так что это реально. Подобный приём используется всё чаще и чаще в играх. Это количество: ножей, стрел, патронов в Сталкере, гранаты и т.п. которые имеют объектный тип. Также объектный тип 100% имеют управляемые единицы в стратегиях (ваши юниты, ваши игроки которыми вы управляете). В каждом из приведённых случаев обман может быть гораздо сложнее чем в этом трейнми, но это основа основ взлома объектных типов. В создании, тестировании трейнми принимали участие: MasterGH и Xipho. СЛЕДУЮЩИЕ ЗАДАНИЯ ВЫПОЛНЕНЫ. Для этого трейнми было 3 задания. Их можно было делать на любом инструменте. Предпочитаемый CheatEngine. 1.Сделать чит-код добавляющий объекты в количестве до 10000. При следующем нажатии на кнопу вычитания объектов должно быть 9999 или при нажатии на плюс 10001. 2.Восполнить разрушенный объект при помощи скриптов CE. Т.е. когда мы нажимаем на кнопку вычитания объектов, то разрушенный объект восполняется одним. 3.Сделать так чтобы при вычитание объектов или при их создании, их количество держалось на отметке не меньше 1000 объектов. Поскольку последнее задание объединяет первые два, то напишу только последнее. Скрипт1 - Главный
  8. MasterGH

    Реализ CE 5.6.1

    Не помню была ли у нас эта новость. Вчера на офсайте обновился Cheat Engine до 5.6.1
  9. Сегодня наткнулся на полезное описание функции __RTDynamicCast похожее на _RTDynamicCast. И её и другие функции я размещу ниже. В игре Sniper: Ghost Warrior из информации сохранения конструктор создаёт в объекте игрока массив (указателей 30 подобъектов и 30-ти типов) из них не более 8-ми могут быть гранаты. Массив типа {{DWORD,VOID *}, ...} Первый например 0x14 (это ID типа гранат) Второй например 16A324D8 (это указатель на объект гранаты) В конструкторе есть функция _RTDynamicCast привидения любого из 30 классов сохранённых объектов к игровым объектам. _RTDynamicCast(v21, 0, &off_10A14088, &off_10A19214, 0); где первый парметр указатель на объект, который приводим к базовому классу второй параметр обычно ставят ноль, не помню что это [off_10A14088] = "AVISaveGame"; [off_10A19214] = "AVInvObject"; Последний ноль - генерировать ли исключение при ошибочном привиденияя Описание на англ. * PARAMS * cppobj [] Any C++ object to cast * unknown [] Reserved, set to 0 * src [] type_info object describing cppobj * dst [] type_info object describing the base class to cast to * do_throw [] TRUE = throw an exception if the cast fails, FALSE = don't Рассмотрим часть кода: v15 = *(_DWORD *)v4; v28 = v9; v17 = *(void (__thiscall **)(_DWORD))(v15 + 56); v27 = -1; v17(v4); sub_10046CD0(&v27); v16 = 0; // v3 - указатель на объект игрока if ( *((_DWORD *)v3 + 318) ) // если у игрока существует массив подобъектов { do { v19 = *(_DWORD *)v4; v27 = *((_DWORD *)v3 + 317) + 8 * v16; // вычислили позицию типа объекта v20 = (*(int (__thiscall **)(int))(v19 + 56))(v4); v21 = (dword_10AD14DC & 1) == 0; v18 = v27; *(_DWORD *)v27 = v20; // важная штука - ID типа подобъектов if ( v21 ) { dword_10AD14DC |= 1u; sub_103DCD90(v18); atexit(sub_1069A880); } v22 = sub_103DEA70(&dword_10AD0C68); ++v16; //позиция типа v27 объекта+4 *(_DWORD *)(v27 + 4) = _RTDynamicCast(v22, 0, &off_10A14088, &off_10A19214, 0); } while ( v16 < *((_DWORD *)v3 + 318) );// повторать пока не более 30-ти подобъектов } Полный код можно посмотреть здесь
  10. Вариант 1. Переименовать exe файл, тоже самое должны сделать юзеры. Вариант 2. Искать причину ошибки в исходниках. Я помочь не могу, на это времени нет
  11. Это принуждение. Не очень хороший способ. Я бывал на таких форумах, впечатление они оставляют не лучшее: "мы вам покажем то-то, если вы зарегистрируетесь". А если я не решил ещё регистрироваться, зачем скрывать то, что обычно доступно
  12. Кошмар... Этот тутор скаченный вместе с CE с главного сайта? У меня такого не было.
  13. Возможно иногда я буду писать о приёмах или кто-то решит написать здесь свой или рассмотреть чужие. Концепция которую я рассмотрю первой касается реализация динамического списка объектов на Дельфи. Реализация динамического списка объектов. Делать мы будем такую штуку, а затем я напишу где ещё можно применить динамические списки. На рисунке форма программы. Если мы нажимаем на кнопку мышки, то создаётся объект точки и добавляется в список. Действия ниже абсолютно не сложные. TMyPixel = class(TObject) FX: Integer; FY: Integer; FText: Integer; constructor Create(X, Y, Num: Integer); procedure SetPixel; end; procedure TMyPixel.SetPixel; begin MainForm.Canvas.PolyLine([Point(FX, FY), Point(FX, FY)]); MainForm.Canvas.TextOut(FX + 1, FY + 1, IntToStr(FText)); end; procedure TMainForm.SortBtnClick(Sender: TObject); var i: Integer; begin PixList.Sort(PixCompare); // PixList : TList; with PixList do for i := 0 to Count - 1 do TMyPixel(Items[i]).FText := i + 1; end; Заметка. Мы можем написать свой динамический список. Принцип крутится вокруг setlength(имя массива элементов, размер массива) и массив[индекс]:= значение Это принцип необходимо обернуть в класс и добавить методы: добавление/удаление/вставка/поменять местами и т.п. Каждый раз проверять длину массива length(массив) или sizeof(массив) и если необходимо расширять массив или фрагментировать пустоты в нём при удалении элемента внутри массива. Существует стандартный класс TObject и класс TList. TList может содержать список объектов. В объект можно обвернуть очень многое. Если вам нужно то ознакомьтесь с описанием этих классов. Описание TObject
  14. Давно у нас не было статей и вот пришло время поучаствовать с автором во обмане игры. Статью я откопал случайно, она 2002 года, она покажет как искать цепочку указателей. Есть некоторые моменты касательно реверсинга. Например, как и когда и какие бряки нужно ставить применительно к СофтАйс. Тоже самое можно сделать и в OllyDbg. Главное понять технику. Указатель будет вот такого вида: @(@(@(@(@(@(@(@(862360)+4)+4)+10074))+0C2*4)+4)+A8) надеюсь без труда вы сможете это представить скобками как мы делаем: [[[[[[[[862360]+4]+4]+10074]]+0C2*4]+4]+A8] = здоровью (8 пар скобок!) Статья на мой взгляд написана "кусками", но кое-что понять можно. Для тех кто с СофтАйсом не работал, то выражение к примеру mov eax,[eax][esi]*4 эквивалентно для OllyDbg: mov eax,[eax+esi*4] Итак статья. Автор: FreeExec Выбирать особо было не из чего, т.к. на машине стояла только одна игра Newer Winter Nigths. И решено было писать тренер к ней. Продолжение статьи...
  15. По поводу первого, я хоть и вхожу в группу администраторов, но в форумских движках не копался да некогда разбираться, к сожалению. По поводу второго это не удобно. Удерживай Shift и переходи по ссылкам. Ещё вариант - средняя кнопка мышки.
  16. Не разобравшись в проблеме переустанавливать Дельфи, а также операционку не стоит. Возможно, проще начать разобираться с кодировками в настройках Дельфи, а затем разбираться с кодировкой в ОС-ме в связке с кодировкой в Дельфи. Подходят ли кодировки, почему не подходят?! Кому сильно докучает эта проблема, могу попробовать поискать решение проблемы. Переустанавливать Дельфи и тем более ОС не стоит. Попробую ещё раз без лени решить эту проблему, если решу, то отпишусь.... Посмотрел я. У меня этой проблемы нет почему-то. Сама как-то отпала )
  17. Я эту задачу решил и позже дам ответ. А вторую задачу ещё можно обсудить =) PS Советую любителя javascript зайти на сайт и узнать инфу по работе с событиямисайт =)
  18. Спасибо SER[G]ANT. Кстати чтобы тебя цитировать приходиться убирать скобки SER[G]ANT
  19. Лучше бы привёл решение. Мне интересно было бы глянуть. Да и пользы будет больше: нашёл тему и нашёл ответ, а не узнал что кто-то нашёл ответ.
  20. Вводим в поле слово и похожие слова динамически подгружаются с IIS сервера по запросу который я составил <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/test.mdb" SelectCommand="SELECT [fsText] FROM [tblRecords] WHERE ([fsText] LIKE ? + '%')" onselecting="AccessDataSource1_Selecting"> <SelectParameters> <asp:Parameter Name="fsText" Type="String" /> </SelectParameters> </asp:AccessDataSource> 1. Впорос. По нажатию мышки на элементе полученного с сервера его данные, т.е. целая строка должна передаться в поле ввода. Перечитал туторы не очень понимаю, как это сделать. <input id="Text1" type="text" onkeyup="Send()"/></div> <table class="Table"> <tr><td onclick="ClickTD(this)"><span class='FontSearch'>Животное1</span> на крыше</td></tr> <tr><td onclick="ClickTD(this)"><span class='FontSearch'>Животное2</span> на крыше</td></tr> </table> Вызываем функцию ClickTD(this) function ClickTD(e) { v = e.toString(); document.getElementById("Text1").value=v; } В общем идёт не значение поля которое вызывало функцию, а что-то другое. Есть у гугла такая штука тоже, но я не разобрался. 2. Впорос. Сетевой трафик. Умные люди пишут, что всячески нужно стараться снимать нагрузку с машины сервера и уменьшать трафик обмена. Если посмотреть на рисунок сверху, то видно что получение данных может быть двумя способами. 1) Вот эта разметка полностью строиться на сервере и динамически (без перезагрузки всей страницы) передаётся клиенту <input id="Text1" type="text" onkeyup="Send()"/></div> <table class="Table"> <tr><td onclick="ClickTD(this)"><span class='FontSearch'>Животное1</span> на крыше</td></tr> <tr><td onclick="ClickTD(this)"><span class='FontSearch'>Животное2</span> на крыше</td></tr> </table> где каждое животное берём из базы. 2) Способ не формировать эту разметку на сервере, а скинуть не форматированные данные... Животное1@ Животное2@ ...клиенту в функцию, которая построит всю разметку и динамически встроит её в тег div-а (pop-up) панели. Первый способ очень простой на C# и удобен и гораздо лучше соблюдается интеграция в другие проекты с приминением ООП C#. Также код формирования разметки закрыт от сторонних глаз. В этом случае те кто захотят такое же формирование разметки им придётся самим писать код или обращаться на мой сервер чтобы получить разметку снова. Итак плюсы первого способа: интеграция ООП, закрытый код. Минусы: увеличение нагрузки на сервер и увеличение трафика, клиенту дольше ждать ответа с сервера вместо того чтобы самому обработать скрипт. Про второй способ, когда разметка формируется на клиенте. Плюсы для меня: меньшая нагрузка на сервер, меньше трафика. Минусы: код javascript менее удобен как в написании так и в интеграции с будущеми поектами на ООП C#. С этим разумный вопрос не ужели нужно учитывать все плюсы и минусы двух способов или нужно придерживаться жёстко второго способа. Короче что выбрать и как?
  21. Можно взять такой вариант. unit _Paint; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; limitX: integer; limitY: integer; _Canvas: TCanvas; _Color: TColor; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin limitX:=10; limitY:=10; _Canvas:=Form2.Canvas; _Color:=0; end; procedure TForm2.FormPaint(Sender: TObject); var aWidth: integer; aHeigth: integer; i,j:integer; begin aWidth:=Form2.ClientWidth div limitX; aHeigth:=Form2.ClientHeight div limitY; for i:=0 to aWidth do for j:=0 to aHeigth do _Canvas.Pixels[i*limitX,j*limitY]:=_color; end; end. Правда есть и более производительный вариант с так называемой "подложкой" - картинокой. Подложка должна рисоваться внутри TForm2.FormPaint на самой Form2а изменяться внутри TForm2.OnResize.
  22. У нас появился закрытый раздел "Наши разработки". Делается это для того чтобы нашими исходными кодами не пользовались без спросу или хотя бы ограничить это пользование. В этот раздел можно входить под паролем или без пароля для группы пользователей "Разработчики". Этот статус очень почётный. В этой теме будут различные новости и информация о ходе совместных работ по разработке программ связанных с гейм хакингом. В частности это ТрейнерМакс(Delphi), Движок-Автоматических Иньекций(Delphi), Исследовательский движок дизассемблированного текста для встраивания в наш форум (Javascript). Последний нам позволит обмениваться опытом или подсказывать друг другу выходы из различных ситуаций и совместно анализировать тот или иной код. Участники могут помогать в изменении кода проектов, исправлении ошибок, создание своего кода с заданной задачей или предложить ту или иную свою идею. Те кто принял участие в модернизации CE автоматически войдут в группу Разработчиков. Остальные желающие получить доступ в скрытый раздел могут написать администрации личное сообщение. Тем кто учится программировать, тоже рекомендуется вступить в группу и влиться в общую деятельность по мере того как вам будет позволять время и желание.
  23. У меня бывала такая ситуация, когда с английской раскладкой копируешь в буфер обмена исходный код в котором русские комментарии. В этом случае нужно изменить раскладку перед копированием. С другими случаями не сталкивался. В других случаях глянь настройку шрифтов Дельфи.
  24. Наброски что-то типа этого, но должны быть варианты и по эффективнее: newmem: push eax mov eax,[pPlayer] mov eax,[eax+14] mov eax,[eax+30] //для игрока eax=x, eax+4=y, eax+8=z push ebx push ecx mov ebx,[LocateCoord] mov ecx,[IndexLoc] lea ebx,[ebx+ecx]//[LocateCoord]+[IndexLoc]=X mov ecx,[ebx] mov [eax],ecx mov ecx,[ebx+4] mov [eax+4],ecx mov ecx,[ebx+8] mov [eax+8],ecx pop ecx pop ebx pop eax dd pPlayer dd pPlayerCoord dd LocateCoord dd IndexLoc
  25. Ну так требуется one hit kill Делается в инструкции типа: B, C(B ). Без фильтра никак. Хотя есть вариант при one hit kill, чтобы не писать фильтр (как я мог не предвидеть раньше). Надо найти инструкцию типа A для здоровья врагов, обращение к которой происходит при стрельбе в них. Тогда фильтра действительного писать не нужно.
×
×
  • Создать...

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

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