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

F.E.A.R., обход расположения кода в модулях


Рекомендуемые сообщения

  • 3 месяца спустя...
  • 1 год спустя...

Статья хорошая правда рекомендуется более опытным. Много чего узнали.

Ниже скрипт сделал Без перезарядки все оружие, работает на любое оружие которое подбирает гГерой. После перезагрузки игры или компьютера скрипт работает, выполняет команду.Чит -код будет работать постоянно? Кто ломал игру? (Без перезарядки).


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem:
mov ecx,[eax+edx*4]
nop
originalcode:
mov [eax+edx*4],ecx
mov edx,[GetBuildNumber+71974]

exit:
jmp returnhere

"Gam7290.tmp"+BCF89:
jmp newmem
nop
nop
nop
nop
returnhere:

[DISABLE]
"Gam7290.tmp"+BCF89:
mov [eax+edx*4],ecx
mov edx,[GetBuildNumber+71974]
dealloc(newmem)
//Alt: db 89 0C 90 8B 15 C4 CA 1A 10


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem:
mov [esi+00000098],064

originalcode:
dec [esi+00000098]

exit:
jmp returnhere

"Gam7290.tmp"+2A073:
jmp newmem
nop
returnhere:


[DISABLE]
"Gam7290.tmp"+2A073:
dec [esi+00000098]
dealloc(newmem)
//Alt: db FF 8E 98 00 00 00

Правда надо включить два скрипта чтобы получить Без перезарядки в CE.

Ссылка на комментарий
Поделиться на другие сайты

Точно прокомментировать не могу, т.к. статью уже плохо помню. Помниться мне, что "Gam7290.tmp" может быть с другими цифрами, то же самое что с другим именем. Поэтому скрипт у кого-то работать не будет :)

-- Обновлено

Точно, цифры там могут меняться... Xipho перебирал все модули занятые процессом игры через Module32First и Module32Next, и по смещению RealNameOffset сравнивал имена модулей. Если модуль оказывался с нужным именем, то берётся базовый адрес модуля и от него уже пляшем.


var
readbuf:array[0..13] of byte;
modEntry:MODULEENTRY32;
modSnap:THandle;
gHandle:THandle;
insAddress:Cardinal;
numRead:Cardinal;
i:integer;
str:string;
begin
Result:=0;
modSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,ProcessID);
modEntry.dwSize:=SizeOf(modEntry);
If Module32First(modSnap,modEntry) then
begin
While Module32Next(modSnap,modEntry) do
begin
gHandle:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_OPERATION,false,ProcessID);
insAddress:=Cardinal(modEntry.modBaseAddr)+RealNameOffset;
ReadProcessMemory(gHandle,ptr(insAddress),@readbuf,14,NumRead);
CloseHandle(gHandle);
str:='';
For i:=0 to SizeOf(readbuf)-1 do
begin
str:=str+Chr(readbuf[i]);
end;
If str=ModuleName then
begin
Result:=Cardinal(modEntry.modBaseAddr);
end;
end;
end;
CloseHandle(modSnap);
end;
function TForm1.GetBaseAddress(ProcessID: Cardinal; ModuleName: string; RealNameOffset:integer): Cardinal;

Кстати не сказал бы, что весь код очень сложный =) Главное идея, а сам код уже можно написать просто полазив по Интернету и различным справочникам ) Кстати на CE можно было бы искать уникальную сигнатуру кода и уже от неё плясать. Я думаю это даже практичнее.

Ссылка на комментарий
Поделиться на другие сайты

В планах у меня переписать эту статью. MasterGH, как-то я тебе скидывал исходник с использованием структур PE для определения реального имени модуля игры. Думаю, в обновленной версии статьи использую этот прием. В этом случае и поиск уникальных сигнатур не понадобится. Впрочем, учитывая наличие aobscan в CE, актуальность поиска реального имени модуля становится под вопросом.

ЗЫ. Где ж найти время, чтобы реализовать все ближайшие планы?..

Ссылка на комментарий
Поделиться на другие сайты

Лучше сделать по такому шаблону




processName = "iw3sp.exe"

function ByteScan(signature)
local results = AOBScan(signature, "+X-C-W")
if (results == nil) then
messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
closeCE()
return
end

local address = stringlist_getString(results, 0)
return address
end

function Initialize()
--1 Убрать отдачу на руку
local workAddres = ByteScan("e8xxxxxxxx8bxxxxxx83xxxx33xx80xxxxxx75xx8bxxxxxxf7")
local workTemplateAsmText = [[
->>address:

db 90 90 90 90 90]]
workTemplateAsmText = string.gsub(workTemplateAsmText, "->>address", workAddres)
autoAssemble(workTemplateAsmText)

--2 Устойчивый прицел при стрельбе
--3 Устойчивый прицел при беге

--Устойчивый прицел при беге
local workAddres1 = ByteScan("d9xxd9xxxxd9xxxxd9xxxxxxxxxxdexxdfxxf6xxxx75xxd9xxxxxxxxxxd9")
workAddres1 = string.format("%x", ("0x"..workAddres1) + 8)

-- Устойчивый прицел при стрельбе
local workAddres2 = ByteScan("d9xxxxxxxxxx75xxd9xxxxxxxxxxd8xxxxxxd8xxdfxxf6xxxx7axxd9")

workTemplateAsmText = [[
alloc(newmem1,2048)
label(newmem2)
label(returnhere1)
label(originalcode1)
label(returnhere2)
label(originalcode2)

newmem1:
fstp st
fldz
originalcode1:
fstp dword ptr [ebx+00000624]
jmp returnhere1

newmem2:
fstp st
fldz
originalcode2:
fst dword ptr [ecx+00000624]
jmp returnhere2

->>address1:
jmp newmem1
nop
returnhere1:

->>address2:
jmp newmem2
nop
returnhere2:
]]
workTemplateAsmText = string.gsub(workTemplateAsmText, "->>address2", workAddres1)
workTemplateAsmText = string.gsub(workTemplateAsmText, "->>address1", workAddres2)
autoAssemble(workTemplateAsmText)

--4 Бесконечные боеприпасы без перезарядки
-- в будущем
--5 Бесконечное здоровье
-- в будущем

-- Звуковой сигнал об успешности внедрения читов
beep()
end


aalist = getAutoAttachList()
stringlist_add(aalist,processName);

function onOpenProcess(processid)
if (attach) then
return
end
attach = true
openProcess(processid)
Initialize()
form_show(UDF1)
end

function FormClose(sender)
closeCE()
return caHide
end
hideAllCEWindows()

Почему я пишу об этом варианте. Потому что этот вариант кода на LUA Engine CE 6.1 RC2 быстрый и должен подходить в случае даже F.E.A.R. И данный скрипт это только протокол действий или сценарий для исполняемой части. Для геймхакера удобно работать со сценариями изменяя их в будущем. Исполнительная часть сценариев должна быть отдельно (как программа Cheat Engine). Писать такой самописный трейнер с разделением на исполнительную и сценарийную части заёмет много времени взависимости от поддерживаемых функций (LUA, ассемблера, дизассемблера...) ...В противном случае придёться писать трейнеры ТОЧНО для каждой версии игры для каждого нового патча.

Ссылка на комментарий
Поделиться на другие сайты

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

mov eax, [ecx + 14]

mov eax, [edx + 18]

Сигнатура будет валидная по байту инструкции MOV и рядом стоящим инструкциям. А вот регистры другие и смещения в структуре другие. Придётся тебе в свой трейнер ещё вставлять в будущем всё что я написал и тратить на это время. Можно сейчас уже реализовывать "интеллектуальное" внедрение на LUA, а уже потом в будущем делать свой трейнер с описанными функциями.

Бывают редкие случаи, когда код игры так модернизируют, что сигнатура никак не может быть валидной - игра с Червяками (SER[G]ANT писал об этом). В этом случае нужно написать сканер валидных сигнатур по действиям в отладчике с двумя запущенными играми разных версий... но до этого ещё далеко, т.к. мне сейчас не до этого.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за ответ.

Знаешь, просто не понятно, что тебе мешало написать программу на ассемблере по Дельфи коду. Ведь это проблема осталась и никуда не делась... Зато ты для себя выяснил главное, что можно на MASM написать программу написанную на Дельфи. И задать этот вопрос поисковику кстати тоже можно было ;)

Ссылка на комментарий
Поделиться на другие сайты

Мда дела посложнее. Monolith Productions молодцы. А с F.E.A.R. 2: PROJECT ORIGIN тоже такие проблемы основной файл игры подгружает в свое адресное пространство dll-ку с движком игры?

Ссылка на комментарий
Поделиться на другие сайты

  • 3 года спустя...

Здесь обсуждаем статью с сайта "F.E.A.R., обход расположения кода в модулях"

Что-то не проходит по ссылке, на сколько я помню, там был выложен исходник?

Как и где его можно скачать?

Спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Здесь обсуждаем статью с сайта "F.E.A.R., обход расположения кода в модулях"

 

Кому не трудно, дайте пожалуйста ссылку, чтобы можно было скачать исходник...

Ссылка на комментарий
Поделиться на другие сайты

Исходника нет. Да и неактуален уже описанный в данной статье метод. На смену ему пришёл метод поиска инструкции по сигнатуре (aobscan).

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Данная тема ушла в небытие...

Прикладываю архивчик любителям. Там же сорцы и билд.

F.E.A.R. (Стрелок).rar

Обратите внимание заготовка на Дельфи7 в виде формы и кнопки( как шаблон пример). Главное код, а не визуальное отображение.

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

... неактуален уже описанный в данной статье метод. На смену ему пришёл метод поиска инструкции по сигнатуре (aobscan).

Жалко было такую статью оставлять в архивах.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Данная тема ушла в небытие...

Прикладываю архивчик любителям. Там же сорцы и билд.

attachicon.gifF.E.A.R. (Стрелок).rar

Обратите внимание заготовка на Дельфи7 в виде формы и кнопки( как шаблон пример). Главное код, а не визуальное отображение.

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

Жалко было такую статью оставлять в архивах.

И как им пользоваться?

Ссылка на комментарий
Поделиться на другие сайты

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

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

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