-
Постов
279 -
Зарегистрирован
-
Посещение
-
Победитель дней
13
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Vlad2
-
-
Не запускается.
Windows 10 x64
Попробуй с совместимостью Win7 или XP запустить.
-
Сегодня решил тоже сделать свой TrainMe. Не очень сложный, но будет о чем подумать) В имеется одно условие, Когда жизни заканчиваются, TrainMe закрывается.
Задачи:
1. Написать скрипт, который будет устанавливать 100% жизней.
2. Написать скрипт, который при ударе будет добавлять жизни.
Те кто взломает, обязательно должны выложить сюда скрипты и написать, как происходил взлом.
-
5 минут и готово) Не правильно вы делаете защиту)
- 2
-
Привет друзья. В общем перехожу потихоньку с D7 на XE8 и сталкиваюсь постоянно с проблемами, причем с совершенно нелепыми, как сейчас, и уже достаточно продолжительное время не могу ее решить.
Дело в том, что все строчные переменные в ХЕ8 по-умолчанию имеют unicode кодировку. И когда, допустим, я читаю из памяти процесса строку ANSI формата, то я не могу вывести это строчку ни в label ни в edit, потому что разные кодировку. Просто отображаются иероглифы. В D7 было все попроще, все преобразовалось автоматически. Получается я застрял на конвертации из одного типа с другой.
Подскажите, может возможно как-то настроить такое-же автоматическое преобразование, как в D7? И как вообще преобразовать ANSI в Unicode?
-
uses ... tlhelp32, psapi;
-
Бан это не проблема) пусть хоть 10 раз бан) главное разобраться, как в таких ситуациях действовать, как находить подобного рода защиты)
-
the crew. Да это не мега протектор. Этот прием достаточно прост, я сам его реализовать могу. Проблема в нахождении куска кода в процессе, который чистит регистры.
Кто захочет попробовать обойти защиту - пишите в лс, дам логин и пароль от утечки.
-
Что передаешь в ESP_Name? Как работает процедура WriteBytes?
Расскажи подробней, как пытаешься писать в память.
-
Привет, товарищи.
На днях столкнулся с проблемой. Проблема заключается в том, что когда я ставлю брекпоинт на любой адрес игры,
и происходят изменения значения адреса, брекпоинт просто не срабатывает. СЕ просто не видит никаких действий.
Перепробовал все возможные настройки разных отладчиков, не работает отладчик даже в режиме ядра.
Такое чувство, что что-то просто затирает бряк или просто отключает отладчик.
Вот это я находил в исходнике трейнера, который когда то видел на этом форуме:
Как работает этот код, я не знаю, хотел бы поинтересоваться у вас, возможно он чистит отладочные регитры, но он делает тоже самое: При его исполнении не будут срабатывать бряки, которые мы ставим. Причем код должен выполняться постоянно, чтоб исключить срабатывания брекпоинта.
Я предполагаю, что и в игре осуществляется что-то подобное.
Так вот: что делает этот код? что можно предпринять для того, чтоб заставить отладчик работать? как можно подобный код найти в игре?
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
-
Так и не нашел ответа, пришлось скачать ХЕ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
-
push eax
mov eax,["GNZ.exe"+009EFC6C]
mov eax,[eax+69C]
mov eax,[eax+278]
mov eax,[eax+14]
mov eax,[eax+AC]
mov [eax+C8],#100
pop eax
-
че за бред причем тут отладка ?
Ну дак если тебе нужно адаптировать сканер под 64 розрядные приложения ты хотябы удостойся выбрать розрядность своего приложения !!
Я бы удостоился выбрать, если компилировал не на D7, а на XE
-
У регионов и блоков памяти имеются атрибуты защиты. Например, атрибут "на исполнение кода" (тот же PAGE_EXECUTE) и если искать по нему сигнатуру, то поиск будет значительно быстрее.
Дело не в скорости поиска, дело в том, что сигнатура не находится, если она расположена после адреса 0хFFFFFFFF. Допустим, моя сигнатура расположена по адресу 0х20FF30EC04.
Я задам диапазон поиска 0х20FF30EC00 - 0х20FF30EC08. И сканер всеравно уйдет в бесконечный поиск.
-
Как можно так писать код? Где отступы?
Улетучелись куда-то)
-
Здравствуйте, у меня есть модуль для сканирования памяти, но он работает только в диапазоне адресов 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
-
Ну а почему просто не использовать [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
-
-
Еще 8 лет назад читал про тебя в новостях) Наверное сейчас это сильно сказалось, судя по твоим сообщениям на форуме)4. Летал ли ты зайцем на ТУ-154!?
- 1
-
VirtualAllocEx в помощь
-
Всем привет!
После неприятностей у Dison`а хочу поделиться с вами способом защиты трейнера, созданного в СЕ.
Этот способ я изобрел еще очень-очень давно. Сам уже перешел в другую среду разработки, поэтому больше ничего нового не придумал.
Сам СЕ никакой защиты кода не предполагает. Поэтому мы можем взять любой трейнер, сгенерированный СЕ и
вытащить его код самой же СЕ. Для этого нам всего лишь нужно найти строку "CheatTable" в процессе, под которой будет весь исходник трейнера.
Мой способ защиты уже будет вводить "Хакера" в заблуждение, потому что открыв исходник трейнера он уведет лишь всего одну строку.
Сейчас я вам постараюсь доступно объяснить, как защитить свой трейнер.
Сразу хочу сообщить, что нам придется отказаться от автоматической генерации трейнера. Будем делать все вручную.
Первое что нам нужно это создать форму для трейнера:
Открываем СЕ -> Table -> Create Form.
Будет создана форма с дефолтным именем "UDF1".
На форму мы кинем Label и в свойстве Caption напишем "F12 - Включить/Выключить скрипт",
для того, чтоб человеку использующему наш трейнер было понятно, какая клавиша за какую функцию отвечает.
Дальше все создание дизайна остается за вами.
Теперь в инспекторе объектов (Object Inspector) выбираем нашу форму, переходим во вкладку события (Events)
Кликаем по пустому полю, справа от строки "OnClose".
Нас отправят в другое окно, с LUA кодом, в котором будет сгенерирована функция закрытия.
Вскоре мы ее допишем.
Пришло время написать код нашего трейнера.
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, созданую в редакторе.
Сейчас настал момент истины.
Добавляем этот фрагмент кода в начало того, что уже написали.
Создаем текстовый документ, и копируем туда весь наш код из окна "LUA Script".
Сохраняем и переименовываем файл, обязательно сменить расширение на *.lua, у меня получился файл "Vlad2.lua"
Снова переходим в окно с нашим lua скриптом. Удаляем весь код.
И добавляем строку "require("Vlad2")", где "Vlad2" - имя нашего файла со скриптом.
Осталось только сохранить трейнер.
Жмем кнопку "Сохранить", выбираем EXE расширение.
Откроется окно с настройками генерации трейнера.
В панели "Extra files" жмем кнопку "Add File", и выбираем файл с нашим скриптом.
Все дальнейшие настройки остаются на ваше усмотрение.
Генерируем.
ВСЕ! Трейнер сгенерирован, теперь из него уже не получиться так легко вынуть скрипты, только разбитые фрагменты.
Когда мы запускаем трейнер без защиты, созданный в СЕ, во временных файлах
создается распаковщик и архив "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')
-
Тогда никакой защиты не было
На более новых версиях уже есть, так что для практики самое то!
-
Что-то глухо, никто не брался или навыков мало?
-
Спасибо, ключик получил)
-
Было-бы не плохо описать что за аккаунт и какие длс туда входят
Вот что будет входить в аккаунт http://www.testdriveunlimited2.com/store
Данные аккаунта нужны только для регистрации онлайн профиля.
TrainMe by Vlad
in Train Me
Опубликовано · Изменено пользователем Vlad2
Эта версия работает немного некорректно, но так будет даже проще взламывать. Лень сейчас отладкой заниматься, но запускаться должна.