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

Vlad2

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

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

  • Посещение

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

    13

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

  1. Эта версия работает немного некорректно, но так будет даже проще взламывать. Лень сейчас отладкой заниматься, но запускаться должна.

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

     

    790ceacccc2838a8275bb353e875fe81.png

     

    Задачи:

    1. Написать скрипт, который будет устанавливать 100% жизней.

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

     

    Те кто взломает, обязательно должны выложить сюда скрипты и написать, как происходил взлом.

    TrainMe by Vlad2.rar

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

    Дело в том, что все строчные переменные в ХЕ8 по-умолчанию имеют unicode кодировку. И когда, допустим, я читаю из памяти процесса строку ANSI формата, то я не могу вывести это строчку ни в label ни в edit, потому что разные кодировку. Просто отображаются иероглифы. В D7 было все попроще, все преобразовалось автоматически. Получается я застрял на конвертации из одного типа с другой.

    Подскажите, может возможно как-то настроить такое-же автоматическое преобразование, как в D7? И как вообще преобразовать ANSI в Unicode? 

  4. the crew. Да это не мега протектор. Этот прием достаточно прост, я сам его реализовать могу. Проблема в нахождении куска кода в процессе, который чистит регистры.


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

  5. Привет, товарищи. 

     

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

    и происходят изменения значения адреса, брекпоинт просто не срабатывает. СЕ просто не видит никаких действий.

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

    Такое чувство, что что-то просто затирает бряк или просто отключает отладчик.

     

    Вот это я находил в исходнике трейнера, который когда то видел на этом форуме:

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

     

    Я предполагаю, что и в игре осуществляется что-то подобное.

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

    procedure AntiDebug_DR_Handler; assembler;asm  mov ecx, [esp+0Ch]  add dword ptr [ecx+0B8h], 2  mov dword ptr [ecx+04h], 0  mov dword ptr [ecx+08h], 0  mov dword ptr [ecx+0Ch], 0  mov dword ptr [ecx+10h], 0  mov dword ptr [ecx+14h], 0  mov dword ptr [ecx+18h], 0  xor eax, eax  retend;procedure AntiDebug;  asm  push offset AntiDebug_DR_Handler  push dword ptr fs:[0]  mov fs:[0],esp  xor eax, eax  div eax  pop fs:[0]  add esp, 4  end;end; 
    • Плюс 1
  6. Так и не нашел ответа, пришлось скачать ХЕ8 и компилировать проект на ней.

    Адаптировал для работы на 64 разрядной версии. Сканируется все как положено. 


    Может кому-то пригодится.

    unit SignScan;interfaceuses  Windows, SysUtils, Forms, TlHelp32;  function DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;  function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;  procedure GetPID;  procedure Write(ProcessID: Cardinal; WriteAdress: int64; WriteValue: array of Byte);  function ScanSignature(base: int64; size: int64; sign: PByte; mask: PAnsiChar): int64;var  m_pID: int64;  m_hProc: THandle;  module: TModuleEntry32;  m_Sign: int64;  PidID, PidHandle: int64;implementationfunction GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;var  snapshot: THandle;  module: TModuleEntry32;begin  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);  module.dwSize := sizeof(TModuleEntry32);  if (Module32First(snapshot, module)) then  begin        if (main_process) then        begin          CloseHandle(snapshot);          result := module;        end;        while (Module32Next(snapshot, module)) do        begin          if (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0) then          begin                CloseHandle(snapshot);                result := module;          end;        end;  end;  result := module;end;procedure GetPID;var  snapshot: THandle;  pInfo: PROCESSENTRY32;begin  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  pInfo.dwSize := sizeof(PROCESSENTRY32);  if (Process32First(snapshot, pInfo)) then  begin    while (Process32Next(snapshot, pInfo)) do    begin      if pInfo.szExeFile = procName then      begin        m_pID := pInfo.th32ProcessID;        CloseHandle(snapshot);        exit;      end;    end;  end;  m_pID := 0;  CloseHandle(snapshot);  exit;end;function DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;begin  while mask^ <> #0 do  begin    if ((mask^ = 'x') and (data^ <> sign^)) then    begin      result := false;      exit;    end;    inc(mask);    inc(data);    inc(sign);  end;  result := true;end;function ScanSignature(base: int64; size: int64; sign: PByte; mask: PAnsiChar): int64;var  mbi: MEMORY_BASIC_INFORMATION;  offset: int64;  buffer: PByte;  BytesRead: Size_T;  i: int64;begin  offset := 0;  while (offset < size) do  begin    VirtualQueryEx(m_hProc, Pointer(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION));    if (mbi.State <> MEM_FREE) then    begin      GetMem(buffer, mbi.RegionSize);      ReadProcessMemory(m_hProc, mbi.BaseAddress, buffer, mbi.RegionSize, BytesRead);      for i := 0 to mbi.RegionSize do      begin        if (DataCompare(buffer + i, sign, mask)) then        begin          FreeMem(buffer);          result := int64(mbi.BaseAddress) + i;          exit;        end;      end;      FreeMem(buffer);    end;    offset := offset + mbi.RegionSize;  end;  result := 0;end;procedure Write(ProcessID: Cardinal; WriteAdress: int64; WriteValue: array of Byte);var  pHandle:LongInt;  Bytes : SIZE_T;  Aob_old_Protect_OFF: dword;  Aob_old_Protect_ON:dword;begin  pHandle:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,ProcessID);  VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),PAGE_EXECUTE_READWRITE,Aob_old_Protect_OFF);  Application.ProcessMessages;  WriteProcessMemory(pHandle,ptr(WriteAdress),(@WriteValue),SizeOf(WriteValue),Bytes);  VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),Aob_old_Protect_OFF,Aob_old_Protect_ON);  CloseHandle(pHandle);end;end.
    • Плюс 2
  7. че за бред причем тут отладка ?

     

     

    Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся  выбрать розрядность своего приложения !!

    10571931.png

    Я бы удостоился выбрать, если компилировал не на D7, а на XE

  8. У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее.

    Дело не в скорости поиска, дело в том, что сигнатура не находится, если она расположена после адреса 0хFFFFFFFF. Допустим, моя сигнатура расположена по адресу 0х20FF30EC04.

    Я задам диапазон поиска 0х20FF30EC00 - 0х20FF30EC08. И сканер всеравно уйдет в бесконечный поиск.

  9. Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 0х00000000 - 0хFFFFFFFF. И получается в 64 разрядных приложениях, он не может достать до некоторых адресов, которые за этим пределом.
    Нужно, чтоб он работал в таком диапазоне 0х00000000000 - 0хFFFFFFFFFFF, но не могу никак его заставить это делать.


    В функцию ScanSignature передается адрес с которого начинать сканировать, адрес до которого сканировать, байты и маска.
    Так как адреса начала и конца сканирования передаются в типе Cardinal, а его диапазон до 0хFFFFFFFF, то я решил поменять этот тип на Int64, его диапазон заканчивается на 0х7FFFFFFFFFFFFFFF, но это не дало результатов. Поиск просто стал длиться бесконечно долго. Помогите адаптировать этот сканер под 64 разрядные приложения. 

    unit SignScan;interfaceusesWindows, SysUtils, Forms, TlHelp32;function DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;procedure GetPID;procedure Write(ProcessID: Cardinal; WriteAdress: Integer; WriteValue: array of Byte);function ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;varm_pID: integer;m_hProc: THandle;module: TModuleEntry32;m_Sign: integer;procName: string;implementationfunction DataCompare(data: PByte; sign: PByte; mask: PAnsiChar): boolean;beginwhile mask^ <> #0 dobeginif ((mask^ = 'x') and (data^ <> sign^)) thenbeginresult := false;exit;end;inc(mask);inc(data);inc(sign);end;result := true;end;function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;varsnapshot: THandle;module: TModuleEntry32;beginsnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);module.dwSize := sizeof(TModuleEntry32);if (Module32First(snapshot, module)) thenbeginif (main_process) thenbeginCloseHandle(snapshot);result := module;end;while (Module32Next(snapshot, module)) dobeginif (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0) thenbeginCloseHandle(snapshot);result := module;end;end;end;result := module;end;procedure GetPID;varsnapshot: THandle;pInfo: PROCESSENTRY32;beginsnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);pInfo.dwSize := sizeof(PROCESSENTRY32);if (Process32First(snapshot, pInfo)) thenbeginwhile (Process32Next(snapshot, pInfo)) dobeginif pInfo.szExeFile = procName thenbeginm_pID := pInfo.th32ProcessID;CloseHandle(snapshot);exit;end;end;end;m_pID := 0;CloseHandle(snapshot);exit;end;procedure Write(ProcessID: Cardinal; WriteAdress: Integer; WriteValue: array of Byte);varpHandle:LongInt;Bytes : Cardinal;Aob_old_Protect_OFF: dword;Aob_old_Protect_ON:dword;beginpHandle:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,ProcessID);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),PAGE_EXECUTE_READWRITE,Aob_old_Protect_OFF);//Ñíÿòèå ïðîòåêöèè ñ ïàìÿòèApplication.ProcessMessages;WriteProcessMemory(pHandle,ptr(WriteAdress),(@WriteValue),SizeOf(WriteValue),Bytes);VirtualProtectEx(pHandle,ptr(WriteAdress),SizeOf(WriteValue),Aob_old_Protect_OFF,Aob_old_Protect_ON);//Âîñòàíîâëåíèå ïðîòåêöèè ñ ïàìÿòèCloseHandle(pHandle);End;function ScanSignature(base: Cardinal; size: Cardinal; sign: PByte; mask: PAnsiChar): integer;varmbi: MEMORY_BASIC_INFORMATION;offset: Cardinal;buffer: PByte;BytesRead: Cardinal;i: integer;beginoffset := 0;while (offset < size) dobeginVirtualQueryEx(m_hProc, Pointer(base + offset), mbi, sizeof(MEMORY_BASIC_INFORMATION));if (mbi.State <> MEM_FREE) thenbeginGetMem(buffer, mbi.RegionSize);ReadProcessMemory(m_hProc, mbi.BaseAddress, buffer, mbi.RegionSize, BytesRead);for i := 0 to mbi.RegionSize dobeginif (DataCompare(PByte(Integer(buffer) + i), sign, mask)) thenbeginFreeMem(buffer);result := integer(mbi.BaseAddress) + i;exit;end;end;FreeMem(buffer);end;offset := offset + mbi.RegionSize;end;result := 0;end;end.
    • Плюс 1
  10. Ну а почему просто не использовать [ecx+4С]?

     

    Или переделай активирующий скрипт, чтоб он в StarID добавлял сразу нужный адрес.

    newmem:add ecx,4c // Добавляем 4с к значению регистра, чтоб получить сразу нужный адресmov [StarID],ecx // Записываем в метку адресsub ecx,4c // Вычитаем 4с от регистра, чтоб дальше по коду не возникало путаниц code:mov ax,[ecx+edx*8+04]jmp return
    Или если СЕ не будет против, можно попробовать так

    newmem:mov [StarID],ecxadd StarID,4c code:mov ax,[ecx+edx*8+04]jmp return
    • Плюс 1
  11. Всем привет!

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

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

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

    вытащить его код самой же СЕ. Для этого нам всего лишь нужно найти строку "CheatTable" в процессе, под которой будет весь исходник трейнера.

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

    Сейчас я вам постараюсь доступно объяснить, как защитить свой трейнер.

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

    Первое что нам нужно это создать форму для трейнера:

    Открываем СЕ -> Table -> Create Form.

    Будет создана форма с дефолтным именем "UDF1".

    4552f05b39f1f28aae0255f81f8c5f58.png

    На форму мы кинем Label и в свойстве Caption напишем "F12 - Включить/Выключить скрипт",

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

    eeb9de38a8f8eddf5a29d13da43f0d9e.png

    Дальше все создание дизайна остается за вами.

    Теперь в инспекторе объектов (Object Inspector) выбираем нашу форму, переходим во вкладку события (Events)

    Кликаем по пустому полю, справа от строки "OnClose".

    Нас отправят в другое окно, с LUA кодом, в котором будет сгенерирована функция закрытия.

    Вскоре мы ее допишем.

    5c1ed5b02410b9a7bdf8afc770528bd9.png

    Пришло время написать код нашего трейнера.

    openProcess('Cheat Engine.exe') --//Открываем процесс

    enabled = false --// Флаг включения/выключения скрипка

    function Cheat()--// Начало функции

    if (enabled == false) then --//Если скрипт выключен, тогда включаем

    autoAssemble([[

    alloc(newmem,2048,00020079)

    label(returnhere)

    newmem:

    add [rcx+00000001],cl

    jmp returnhere

    00020079:

    jmp newmem

    nop

    returnhere:]]) --// Код скрипта из секции "ENABLE"

    enabled = true --// Переводим в флаг в положение true

    else --// Если скрипт был включен, тогда его выключаем

    autoAssemble([[

    00020079:

    add [rcx+00000001],cl

    dealloc(newmem)]]) --// Код из секции DISABLE

    enabled = false --// Переводим в флаг в положение true

    end

    end --// Конец функции

    createHotkey(Cheat, VK_F12) --// Создание горячей клавиши, по которой будет активироваться скрипт

    function FormClose(sender) --// Функция закрытия окна трейнера

    closeCE() -- // Завершаем процесс трейнера, когда было закрыто окно трейнера

    return caFree

    end

    form_show(UDF1) --// Показываем окно формы UDF, созданую в редакторе.

    0757ba0d1b67364cab1aa5875826e785.png

    Сейчас настал момент истины.

    Добавляем этот фрагмент кода в начало того, что уже написали.

    Создаем текстовый документ, и копируем туда весь наш код из окна "LUA Script".

    Сохраняем и переименовываем файл, обязательно сменить расширение на *.lua, у меня получился файл "Vlad2.lua"

    d5497c53f511600ef732e1009ae81cc2.png

    Снова переходим в окно с нашим lua скриптом. Удаляем весь код.

    И добавляем строку "require("Vlad2")", где "Vlad2" - имя нашего файла со скриптом.

    4342e3292dcfe4f48878978ebb4d72cd.png

    Осталось только сохранить трейнер.

    Жмем кнопку "Сохранить", выбираем EXE расширение.

    Откроется окно с настройками генерации трейнера.

    В панели "Extra files" жмем кнопку "Add File", и выбираем файл с нашим скриптом.

    0b0cc798f1af4691fb20565fe308e21b.png

    Все дальнейшие настройки остаются на ваше усмотрение.

    Генерируем.

    ВСЕ! Трейнер сгенерирован, теперь из него уже не получиться так легко вынуть скрипты, только разбитые фрагменты.

    Когда мы запускаем трейнер без защиты, созданный в СЕ, во временных файлах

    создается распаковщик и архив "CET_Archive.dat". В этом файле хранится сам СЕ, его библиотеки,

    и файлы нашего трейнера. После того, как распаковщик разархивирует наш архив,

    появятся все файлы трейнера, в том числе "CET_TRAINER.UDF1", в где находится

    код нашего трейнера.

    Как видим - уязвимостей хватает.

    ​Но в защищенном варианте эти файлы будут отсутствовать. Поэтому их не украдут, как и не вытащат сам код из процесса трейнера.

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

    Вот не большей пример трейнера с защитой - https://yadi.sk/d/XXUMV4jaSwy82

    local TimerShit = createTimer(UDF2, true)function Shit()os.remove('Vlad2.lua') --// Сюда пишем имя файла с LUA скриптом.os.remove('CET_TRAINER.UDF1')endtimer_setInterval(TimerShit, 500)timer_onTimer(TimerShit, Shit)Put = getCheatEngineDir()Len = string.len(Put)Len = Len-10Put = string.sub(Put, 0, Len)os.remove(Put..'CET_Archive.dat')
×
×
  • Создать...

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

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