• Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти
    1. Главная
    2. MasterGH
    3. Темы
    Не в сети
    • Профиль
    • Подписки 1
    • Подписчики 1
    • Темы 110
    • Сообщения 225
    • Группы 4

    Темы

    • MasterGHM

      Создать структуру программно

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce structure ce lua
      2
      2
      0 Голоса
      2 Сообщения
      146 Просмотры
      MasterGHM
      Решил попробовать написать CE Lua скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет. Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096). Я не успел сделать определение типа, но смещения внутри структуры получить я успел. Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер Осталось сделать определение типа, а это не так уж долго сделать и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно Пример кода, который я использовал addressStructure1 = 0x412E0200 --> адрес начала структуры в любой игре sizeStructure = 100 --> гипототический размер структуры 100 для быстрых поисков, по умолчанию 4096 indexStructure = 0 --> индекс внутри структуры, который будет перемещаться вместе с breakPointAddress breakPointAddress = 0 --> адрес, на который сейчас постален брейкпоинт waitTimeTillBreak = 300 --> частота активности смещеиня resultText = '' --> конкатенация частей текста в этой переменной \-- Функция пытается поставить брейкпоинт на следующий байт в структуре function TryNextSetBreakPointToAddress() debug_removeBreakpoint(breakPointAddress) indexStructure = indexStructure + 1 if indexStructure > sizeStructure then debugTimer.Interval = 1000 debugTimer.Enabled = false debugTimer.destroy() debug_continueFromBreakpoint(co_run) print(resultText) --> вывод результата с завершением отладки return end breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister) debug_continueFromBreakpoint(co_run) end \-- Любимая функция снятия отладочных данных function debugger_onBreakpoint() -- проверить обращение к структуре prevAddress = getPreviousOpcode(RIP) resultText = resultText..string.format('Offset: + %X : %s', indexStructure, disassemble(prevAddress)) .. '\r\n' TryNextSetBreakPointToAddress() return 1 end \-- Простой таймер debugTimer = createTimer(nil, false) debugTimer.OnTimer = function(timer) TryNextSetBreakPointToAddress() end debugTimer.Interval = waitTimeTillBreak debugTimer.Enabled = true breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister)
    • MasterGHM

      Как контролировать включение и выключение скриптов в таблице

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce lua условие управление
      1
      0 Голоса
      1 Сообщения
      118 Просмотры
      MasterGHM
      Как контролировать включение и выключение скриптов в таблице AA или "Autoassembler code" код похожий на язык программирования ассемблера. Кратко, он позволяет менять игровой код. Подробнее Cheat Engine:Auto Assembler (http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler) Обычный АА-скрипт состоит из двух директив и добавляется в таблицу CE как запись // Код срабатывающий как при активации, так и при деактивации [ENABLE] // Код активации [DISABLE] // Код деактивации Чтобы код активировался, нужно включить галку напротив записи в таблице и наоборот выключить. Есть такие директивы как {$lua} и {$asm}. Под {$lua} пишут Lua скрипт, под {$asm} пишут АА-скрипт. Мы можем проверить Lua скриптом любое условие и разрешить включать галку или выключать галку. Например, через "syntaxcheck" — проверку синтаксиса или другое условие . Если проверка не прошла, то не получится галку включить и не получится выключить, если что-то пойдет не так. В Lua строка из двух минусов "--", обозначает комментарий. {$lua} \-- Расскоментируйте или закоментируйте пару строк ниже \-- if syntaxcheck then return end \-- error[666] = 666 \------------------------------ ENABLE ------------------------------ [ENABLE] \-- Расскоментируйте или закоментируйте пару строк ниже \-- if syntaxcheck then return end \-- error[666] = 666 \------------------------------ DISABLE ------------------------------ [DISABLE] \-- Расскоментируйте или закоментируйте пару строк ниже \-- if syntaxcheck then return end \-- error[666] = 666 Попробовав разные варианты вы увидите, что нельзя включать или выключать галку в разных ситуациях. Например в этой получится включить галку, а выключить нет из-за ошибки. {$lua} \-- if syntaxcheck then return end \-- некоторый lua код правильный или не правильный \-- error[666] = 666 \------------------------------ ENABLE ------------------------------ [ENABLE] \--if syntaxcheck then return end \-- некоторый lua код \-- некоторый lua код правильный или не правильный \-- error[666] = 666 \------------------------------ DISABLE ------------------------------ [DISABLE] if syntaxcheck then return end \-- некоторый lua код \-- некоторый lua код правильный или не правильный error[666] = 666 Следующий вариант проверяет открыт ли процесс. Если нет, то покажет сообщение. Как узнать, что процесс был закрыт после открытия process - зарезервированное переменная, показывает что процесс открыт (http://wiki.cheatengine.org/index.php?title=Lua:process) В комментариях можно увидеть при каких условиях блокируются включение галки {$lua} -- code before either enable/disable section runs for both just like with AA code if syntaxcheck then return end [ENABLE] if process == nil then showMessage('Процесс не подключен. Галка не будет включена') return end if process ~= nil and readInteger(process) == nil then showMessage('Процесс был закрыт. Галка не будет включена') return end [DISABLE] -- Галку можно выключить, но код выключения выполнять если процесс подключен if process ~= nil and readInteger(process) ~= nil then print('Attached to ' .. process) else showMessage('The process closed') end
    • MasterGHM

      Часть1. Lua простые регулярные выражения

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео ce lua regular
      1
      1
      0 Голоса
      1 Сообщения
      220 Просмотры
      MasterGHM
      Есть такой плагин "AA Maker" и там довольно интересные регулярные выражения на Lua. Разберем некоторые выражения Выражение ''%[(.*)%]' - захват всего, что в квадратных скобках Пример local s = 'mov eax, [ecx + 4]' print(string.match(s, '%[(.*)%]')) \--> ecx + 4 Символ "%" нужно всегда ставить перед специальными символами такими как ^$()%.[]*+-? Символ "%[" и "%]" означают квадратные скобки в строке Разбирая комбинацию (.*). Точка означает любой символ, а символ умножить означает повторение любого символа Круглые скобки означают "подшаблон" Подшаблоны В шаблон можно включить подшаблоны, выделив их круглыми скобками. Если найденная строка соответствует шаблону, то ее подстроки, соответствующие подшаблонам, будут доступны для будущего использования. Подшаблоны пронумерованы согласно их левым круглым скобкам. Например, в шаблоне "(a*(.)%w(%s*))", часть строки, соответствующая "a*(.)%w(%s*)" будет зафиксирована как первый подшаблон (и поэтому имеет номер 1); любые символы попавшие под соответствие "." будут зафиксированы как подшаблон номер 2, и часть строки, соответствующая "%s*" получит номер 3. Специальный вариант использования подшаблонов - получение текущей позиции в строке. Для этого используются пустые подшаблоны (). Например, если мы применим шаблон "()aa()" к строке "flaaap", то получим два результата: 3 и 5. Шаблон не может содержать вложенные ноли. Используйте %z вместо этого. Т.е. можем извлечь содержимое инструкции. Примеры "(.*)" - захват всей строки "/(.*)/" - захват всего, что находится между КРАЙНИМИ символами / "/(.-)/" - захват всего, что находится между ПЕРВЫМИ ДВУМЯ символами / Пример из ААMaker плагина local _,_,x = string.find(opcode, '%[(.*)%]') из функции ниже Функция string.find("СТРОКА", "ШАБЛОН") возвращает номер позиции начала начала и конца шаблона Пример print(string.find('some string', 'me')) \--> 3 4 Вся функция с комментариями из AAMaker \-- Таблица паттернов для нескольких инструкций inc, mov, fld, fstp (ключи таблицы) \-- Они нужны для создания автоматического АА кода, через замену строк другими строками \- {$Type} — очевидно для типа byte, word, dword \- [x] — очевидно обращение к адресу \- {$Value} — это значение \- \r\n — переход на следующую строку \-- Что будем делать с этой таблицой будет видно по коду или смотрите плагин PATTERN = { ['inc'] = 'mov{$Type}[x],{$Value}', ['mov'] = 'mov{$Type}[x],{$Value}\r\n{$OriginalCode}', ['fld'] = 'mov{$Type}[x],{$Value}\r\n{$OriginalCode}', ['fstp'] = '{$OriginalCode}\r\n'..'mov{$Type}[x],{$Value}' } \-- Не очень понятно зачем квадратные скобки у ключей. Можно написать не ['inc'], а 'inc' \-- Функция проверки паттерна function checkPattern() -- Получение имени адреса из адреса dv_address1 (выделенный адрес в дизассемблере) local address = getNameFromAddress(dv_address1) -- Получение инструкции по имени адреса local _,opcode = splitDisassembledString(disassemble(address)) -- ComboBox.Text свойство равно "Injection" или "AOBScanModule" local choose = getProperty(cmbCheatType,"Text") if choose == 'Injection' or choose == 'AOBScanModule' then -- Перебор по ключу и значению таблицы PATTERN for key,value in pairs(PATTERN) do -- Если в опкоде нашли ключ из таблицы паттернов -- Где key это inc, mov, fld, fstp (см. выше таблицу PATTERN) -- Где opcode это например инструкция 'inc [edx + 4]' if string.find(opcode,key) ~= nil then local _,_,x = string.find(opcode, '%[(.*)%]') if x ~= nil then -- В value будет значение 'mov{$Type}[x],{$Value}' patternInjectAsmCode = value -- Нашли паттерн и вернули его return true end end end end -- Паттерн не нашли в таблице, вернули false patternInjectAsmCode = '{$OriginalCode}' return false end \-- patternInjectAsmCode Чтобы посмотреть результат, сделал скрин отладки Lua кода Функции по работе со строками. Link Используемые источники: link, link, link, link aamaker.lua
    • MasterGHM

      Часть2. Lua простые регулярные выражения

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео lua regular ce lua
      1
      0 Голоса
      1 Сообщения
      134 Просмотры
      MasterGHM
      Если нужно найти начало и конец подстроки. Пример Попробуем найти слово lab в троке gamehacklab.ru print(string.find('gamehacklab.ru', 'lab')) >9 11 Если не найдена подстрока, то вернет nil. С помощью string.match можем выводить не индексы, а строку print(string.match('gamehacklab.ru', 'lab')) >lab С помощью string.gmatch можем выводить последовательно строки Где 'a.' означает символ 'a' и еще один следующий любой local result = string.gmatch('gamehacklab.ru', 'a.') print(result()) print(result()) print(result()) вывод >am >ac >ab Здесь комбинация символов "%a+" означает искать слово пока оно не закончится s = "hello world from Lua" for w in string.gmatch(s, "%a+") do print(w) end Вывод > hello > world > from > Lua А здесь заполняем таблицу ключ — значение из строки, которую можно было бы взять из файла t = {} s = "X=0, Y=0, Z=0" for k, v in string.gmatch(s, "(%w+)=(%w+)") do t[k] = v end for i, v in pairs(t) do print(i..' = '..v) end Вывод >Z = 0 >X = 0 >Y = 0 Пока на этом все... Более сложные примеры в предыдущей части записи
    • MasterGHM

      Notepad++ и CE Lua. Автозавершение строк

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Вопросы, обсуждения и предложения
      1
      3
      0 Голоса
      1 Сообщения
      68 Просмотры
      MasterGHM
      Можно в редакторе сделать автозавершение инструкци для CE Lua и даже для CE Autoassembler. Накидал пример, может быть, кому интересно будет для других языков. Установка. Поместить файл в директорию на скриншоте lua.xml
    • MasterGHM

      Задачка по IDA и Python (старое)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Вопросы, обсуждения и предложения
      2
      3
      0 Голоса
      2 Сообщения
      158 Просмотры
      MasterGHM
      Пост принадлежит автору partoftheworlD, GamehackLab[RU]. (ref) Подключение к питону происходит с помощью: import idc import idautils import idaapi У меня есть наработки некоторые, возможно что-то пригодится. import idc import idaapi class Func(object): def __init__(self): self.reg_value = re.compile(r'') self.stack_view = [] self.level = 1 def range_reverse(self, start, stop): for i in FuncItems(stop): if start > i >= stop: yield i def run(self): if self.stack_view: for j in self.stack_view: current_function = idaapi.get_func(j) level = "-" * self.level print("{} Jump into -> 0x{}".format(level, hex(current_function.startEA)[2:].replace("L", "").upper())) for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: print("{} 0x{} -- {}".format(level, hex(j)[2:].replace("L", "").upper(), idc.GetDisasm(j))) self.level += 1 else: print "Please input addresses to stack view buffer" pass if __name__ == '__main__': f = Func() f.stack_view = [0x214FE, 0x20F30, 0x214E0, 0x13F00] f.run() В выводе получим \- Jump into -> 0x214E0 \- 0x214E0 -- push ebp \- 0x214E1 -- mov ebp, esp \- 0x214E3 -- lea esp, [esp-10h] \- 0x214E7 -- mov [ebp+var_C], eax \- 0x214EA -- mov [ebp+var_4], edx \- 0x214ED -- mov [ebp+var_8], ecx \- 0x214F0 -- mov eax, [ebp+arg_0] \- 0x214F3 -- test eax, eax \- 0x214F5 -- jnz locret_21589 \- 0x214FB -- mov eax, [ebp+var_8] \- 0x214FE -- cmp word ptr [eax], 1Bh \- 0x21503 -- jnz locret_21589 \- 0x21509 -- push 0 \- 0x2150B -- mov eax, [ebp+var_8] \- 0x2150E -- movzx ecx, word ptr [eax] \- 0x21511 -- mov eax, [ebp+var_4] \- 0x21514 -- mov edx, 0B01Eh \- 0x21519 -- call sub_8E870 \- 0x2151E -- test eax, eax \- 0x21520 -- jnz short locret_21589 \- 0x21522 -- push 0 \- 0x21524 -- mov eax, [ebp+var_4] \- 0x21527 -- mov ecx, 0 \- 0x2152C -- mov edx, 87h ; '‡' \- 0x21531 -- call sub_8E870 \- 0x21536 -- and eax, 4 \- 0x21539 -- jnz short locret_21589 \- 0x2153B -- mov eax, [ebp+var_C] \- 0x2153E -- test dword ptr [eax+160h], 4 \- 0x21548 -- jz short locret_21589 \- 0x2154A -- mov eax, [ebp+var_4] \- 0x2154D -- mov dl, 1 \- 0x2154F -- call sub_13F00 \- 0x21554 -- mov [ebp+var_10], eax \- 0x21557 -- test eax, eax \- 0x21559 -- jz short locret_21589 \- 0x2155B -- mov eax, [ebp+var_10] \- 0x2155E -- cmp dword ptr [eax+378h], 0 \- 0x21565 -- jz short locret_21589 \- 0x21567 -- mov eax, [ebp+var_10] \- 0x2156A -- mov eax, [eax+378h] \- 0x21570 -- mov edx, [ebp+var_10] \- 0x21573 -- mov edx, [edx+378h] \- 0x21579 -- mov edx, [edx] \- 0x2157B -- call dword ptr [edx+2E8h] \- 0x21581 -- mov eax, [ebp+var_8] \- 0x21584 -- mov word ptr [eax], 0 \- 0x21589 -- leave \- 0x2158A -- retn 4 \-- Jump into -> 0x20F30 \-- 0x20F30 -- push ebp \-- 0x20F31 -- mov ebp, esp \-- 0x20F33 -- lea esp, [esp-10h] \-- 0x20F37 -- mov [ebp+var_C], eax \-- 0x20F3A -- mov [ebp+var_4], edx \-- 0x20F3D -- mov [ebp+var_8], ecx \-- 0x20F40 -- mov eax, [ebp+var_8] \-- 0x20F43 -- cmp word ptr [eax], 0 \-- 0x20F48 -- jz locret_20FCF \-- 0x20F4E -- mov edx, [ebp+var_4] \-- 0x20F51 -- mov eax, 5C29B4h \-- 0x20F56 -- call sub_C910 \-- 0x20F5B -- test al, al \-- 0x20F5D -- jz short loc_20FC3 \-- 0x20F5F -- mov eax, [ebp+var_4] \-- 0x20F62 -- mov [ebp+var_10], eax \-- 0x20F65 -- mov eax, [ebp+var_C] \-- 0x20F68 -- cmp word ptr [eax+150h], 0 \-- 0x20F71 -- jz short locret_20FCF \-- 0x20F73 -- mov eax, [ebp+var_C] \-- 0x20F76 -- mov edx, [ebp+var_8] \-- 0x20F79 -- mov ax, [eax+150h] \-- 0x20F80 -- cmp ax, [edx] \-- 0x20F83 -- jnz short locret_20FCF \-- 0x20F85 -- mov eax, [ebp+var_C] \-- 0x20F88 -- mov eax, [eax+154h] \-- 0x20F8E -- cmp eax, [ebp+arg_0] \-- 0x20F91 -- jnz short locret_20FCF \-- 0x20F93 -- mov eax, [ebp+var_C] \-- 0x20F96 -- mov eax, [eax+14Ch] \-- 0x20F9C -- cmp eax, [ebp+var_10] \-- 0x20F9F -- jnz short locret_20FCF \-- 0x20FA1 -- push [ebp+arg_0] \-- 0x20FA4 -- mov ecx, [ebp+var_8] \-- 0x20FA7 -- mov edx, [ebp+var_10] \-- 0x20FAA -- mov eax, [ebp+var_C] \-- 0x20FAD -- call sub_21590 \-- 0x20FB2 -- push [ebp+arg_0] \-- 0x20FB5 -- mov ecx, [ebp+var_8] \-- 0x20FB8 -- mov edx, [ebp+var_10] \-- 0x20FBB -- mov eax, [ebp+var_C] \-- 0x20FBE -- call sub_214E0 \-- 0x20FC3 -- mov eax, [ebp+var_C] \-- 0x20FC6 -- mov word ptr [eax+150h], 0 \-- 0x20FCF -- leave \-- 0x20FD0 -- retn 4 \--- Jump into -> 0x214E0 \--- 0x214E0 -- push ebp \--- 0x214E1 -- mov ebp, esp \--- 0x214E3 -- lea esp, [esp-10h] \--- 0x214E7 -- mov [ebp+var_C], eax \--- 0x214EA -- mov [ebp+var_4], edx \--- 0x214ED -- mov [ebp+var_8], ecx \--- 0x214F0 -- mov eax, [ebp+arg_0] \--- 0x214F3 -- test eax, eax \--- 0x214F5 -- jnz locret_21589 \--- 0x214FB -- mov eax, [ebp+var_8] \--- 0x214FE -- cmp word ptr [eax], 1Bh \--- 0x21503 -- jnz locret_21589 \--- 0x21509 -- push 0 \--- 0x2150B -- mov eax, [ebp+var_8] \--- 0x2150E -- movzx ecx, word ptr [eax] \--- 0x21511 -- mov eax, [ebp+var_4] \--- 0x21514 -- mov edx, 0B01Eh \--- 0x21519 -- call sub_8E870 \--- 0x2151E -- test eax, eax \--- 0x21520 -- jnz short locret_21589 \--- 0x21522 -- push 0 \--- 0x21524 -- mov eax, [ebp+var_4] \--- 0x21527 -- mov ecx, 0 \--- 0x2152C -- mov edx, 87h ; '‡' \--- 0x21531 -- call sub_8E870 \--- 0x21536 -- and eax, 4 \--- 0x21539 -- jnz short locret_21589 \--- 0x2153B -- mov eax, [ebp+var_C] \--- 0x2153E -- test dword ptr [eax+160h], 4 \--- 0x21548 -- jz short locret_21589 \--- 0x2154A -- mov eax, [ebp+var_4] \--- 0x2154D -- mov dl, 1 \--- 0x2154F -- call sub_13F00 \--- 0x21554 -- mov [ebp+var_10], eax \--- 0x21557 -- test eax, eax \--- 0x21559 -- jz short locret_21589 \--- 0x2155B -- mov eax, [ebp+var_10] \--- 0x2155E -- cmp dword ptr [eax+378h], 0 \--- 0x21565 -- jz short locret_21589 \--- 0x21567 -- mov eax, [ebp+var_10] \--- 0x2156A -- mov eax, [eax+378h] \--- 0x21570 -- mov edx, [ebp+var_10] \--- 0x21573 -- mov edx, [edx+378h] \--- 0x21579 -- mov edx, [edx] \--- 0x2157B -- call dword ptr [edx+2E8h] \--- 0x21581 -- mov eax, [ebp+var_8] \--- 0x21584 -- mov word ptr [eax], 0 \--- 0x21589 -- leave \--- 0x2158A -- retn 4 \---- Jump into -> 0x13F00 \---- 0x13F00 -- push ebp \---- 0x13F01 -- mov ebp, esp \---- 0x13F03 -- lea esp, [esp-0Ch] \---- 0x13F07 -- mov [ebp+var_4], eax \---- 0x13F0A -- mov [ebp+var_8], dl \---- 0x13F0D -- jmp short loc_13F33 \---- 0x13F10 -- cmp [ebp+var_8], 0 \---- 0x13F14 -- jnz short loc_13F27 \---- 0x13F16 -- mov edx, [ebp+var_4] \---- 0x13F19 -- mov eax, 59ECF0h \---- 0x13F1E -- call sub_C910 \---- 0x13F23 -- test al, al \---- 0x13F25 -- jnz short loc_13F45 \---- 0x13F27 -- mov eax, [ebp+var_4] \---- 0x13F2A -- mov eax, [eax+1F8h] \---- 0x13F30 -- mov [ebp+var_4], eax \---- 0x13F33 -- cmp [ebp+var_4], 0 \---- 0x13F37 -- jz short loc_13F45 \---- 0x13F39 -- mov eax, [ebp+var_4] \---- 0x13F3C -- cmp dword ptr [eax+1F8h], 0 \---- 0x13F43 -- jnz short loc_13F10 \---- 0x13F45 -- mov edx, [ebp+var_4] \---- 0x13F48 -- mov eax, 59ECF0h \---- 0x13F4D -- call sub_C910 \---- 0x13F52 -- test al, al \---- 0x13F54 -- jz short loc_13F5E \---- 0x13F56 -- mov eax, [ebp+var_4] \---- 0x13F59 -- mov [ebp+var_C], eax \---- 0x13F5C -- jmp short loc_13F65 \---- 0x13F5E -- mov [ebp+var_C], 0 \---- 0x13F65 -- mov eax, [ebp+var_C] \---- 0x13F68 -- leave \---- 0x13F69 -- retn Надо будет поправить пару строк, чтобы выводилась не функция целиком, а как при трассировке: for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: https://raw.githubusercontent.com/EiNSTeiN-/idapython/master/examples/ex_graph.py
    • MasterGHM

      Unity API (игровой движок)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      119 Просмотры
      MasterGHM
      API
    • MasterGHM

      Panda3D API (игровой движок)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      78 Просмотры
      MasterGHM
      API API Reference — Panda3D Manual
    • MasterGHM

      Frostbite API (игровой движок)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      83 Просмотры
      MasterGHM
      API Frostbite API Блоги [Week 7] A Real Game Engine - Isetta Engine
    • MasterGHM

      CryEngine API (игрвой движок)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      87 Просмотры
      MasterGHM
      Изучив API, можно управлять иерархией сущностей, сценами, физикой и т.п. в играх созданных на этом движке. Игровой бинарный код будет состоять из функций игрового движка и функций разработчиков игры. Можно управлять сущностями на основе API движка или же функциями разработчиков.
    • MasterGHM

      UnrealEngine API (игровой движок)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      112 Просмотры
      MasterGHM
      UnrealEngine - популярный игровой движок с открытым API. Открытое API должно позволить управлять иерархией сущностей (акторы). Т.е. создать сущности, удалять, менять положение в иерархии. Управлять сценами с этими сущностями, физикой, Meshes, эффектами, звуками... Единственное нужно разобраться в этом API, собрать dll модуль на языке программирования и загрузить его в игру... ну, и возможно, управлять этим модулем извне.
    • MasterGHM

      Windows API

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      736 Просмотры
      MasterGHM
      API Windows - это пользовательские функции для работы с процессами и памятью. Все программы, приложения, сервисы, в том числе и программа CE используют эти функции и даже игры. Функции что-то делают, что-то вызывают, какие-то результаты возвращают. Смотрим справки Win32.chm - справочник Другие ресурсы: Справочник по Windows API Вызов функций Windows API Основы программирования для Win32 API Софт для работы с API: API Monitor: Spy on API Calls and COM Interfaces (Freeware 32-bit and 64-bit Versions!) | rohitab.com https://sematext.com/blog/api-monitoring-tools/[Win32.chm](/assets/uploads/files/1683990989161-win32.chm) Книги: Книга "[RU] Джефри Рихтер Windows для профессионалов. 4 издание.pdf"
    • MasterGHM

      ASM API

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      728 Просмотры
      MasterGHM
      Опкоды из Intel-ловской документации Instruction_Set_Reference.pdf 64-ia-32-architectures-software-developer-vol-2a-manual.pdf 64-ia-32-architectures-software-developer-vol-2b-manual.pdf
    • MasterGHM

      CE Auto Assembler API

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      143 Просмотры
      MasterGHM
      Auto Assembler Auto Assembler - Commands - Cheat Engine (описание команд Autoassebler c примерами). Там же вставки C-языка {$CCODE playerbase=RCX newhealth=RBX} int isplayer=*(*int)(playerbase+0xb8); if (isplayer) ​newhealth=100000; else ​newhealth=0; {$ASM} Руководство по C языку (https://www.geeksforgeeks.org/c-programming-language/) Там же вставки Lua языка {$LUACODE playerbase=RCX newhealth=RBX} if readInteger(playerbase+0xb8)==1 then newhealth=100000 else ​newhealth=0 end {$ASM} Руководство по Lua (https://www.lua.org/manual/5.4/) Lua классы в CE (https://wiki.cheatengine.org/index.php?title=Cheat_Engine:Lua)
    • MasterGHM

      CE Lua API

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Справочники
      1
      0 Голоса
      1 Сообщения
      97 Просмотры
      MasterGHM
      CE 7.5.0.7431 (в репозитории файл с кратким описанием API celua.txt, который можно найти рядом с CE) Wiki: Lua - Cheat Engine (содержит более полное описание классов с примерами)
    • MasterGHM

      Рубрика "Lua код сегодня" №6 (проверка по md5)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео md5 ce lua speak важно обучалка фишки
      1
      0 Голоса
      1 Сообщения
      276 Просмотры
      MasterGHM
      Получить md5 открытого процесса и записать его в MD5_CHEKING вручную \-- Функция для ручного вывода md5 ранее подключенного процесcа. Для установки MD5_CHEKING PrintMd5CurrentProcess() Пример проверки md5 function onOpenProcess(processid) reinitializeSymbolhandler() local md5Process = GetMd5Process(processid) PrintMd5Process(process, md5Process) local isSupportedVersion = CheckingMd5CurrentProcess(md5Process) local lineResult = isSupportedVersion and 'Is supported version.' or 'Is not supported version.' if not isSupportedVersion then speakEnglish(lineResult, false) messageDialog('Error', lineResult, mtError, mbClose) end end ce_md5.lua md5 - это алгоритм некоторой суммы байтов exe-шника. Позволит точно идентифицировать exe-шник, для которого будет сделана .CT таблица с указателями или сигнатурами. В случае несоответствия будет показан диалог сообщения и звуковое оповещение проговаривания текста ошибки. Будет необходимо проверять md5, чтобы смещения у структур точно не поменялись.
    • MasterGHM

      Заметка. Логи брейкпоинта на структуру размером 0x1000

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Вопросы, обсуждения и предложения
      1
      2
      0 Голоса
      1 Сообщения
      98 Просмотры
      MasterGHM
      Примечание. Эти логи мне могут понадобиться для группировки инструкций по типу. Например, булевые типы, по чтению. по записи, по смещениям, локальные структуры по смениям и т.п. В структуре по смещению 0x2C0 находится здоровье персонажа. На начало этой структуры и был поставлен брейкпоинт . Ниже будет большой кусок опкодов, который работает со структурой. Log breakpoint on structure 0x1000.txt Можно посмотреть в каком порядке опкоды исполняются и с какими смещениями, насколько далеко они друг от друга. Некоторые смещения рядом с известными смещениями могут заинтересовать. Одинаковые опкоды в определенном порядке, но по разным RIP тоже могут заинтересовать. Switch-case могут заинтересоваь в виде cmp [x]. число. Инструкции чтения из структуры больше интересуют, т.к. они могут более вероятно, на что-то влиять - из них читается и для чего-то это нужно. Причем последовательность инструкций идет в порядке вызова, но RIP всегда уникальный (RIP не дублируются). Здесь RIP, т.к. CE 64 разрядный Если последовательность к данным структуры примерно сохраняется, то можно обратить внимание на обращение к адресам в структуре рядом со здоровьем по смещению 2с0: до обращения к адресу здоровья, во время и после. Я выделил их стрелками. Эти смещения могут быть связаны со здоровьем Интересные моменты могут быть с так называемыми switch-case операциями. Можно пытаться их подменить
    • MasterGHM

      Крафт в StarsOne

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео unity dnspy блог
      1
      8
      0 Голоса
      1 Сообщения
      120 Просмотры
      MasterGHM
      В оригинале, если нет всех компонентов рецепта, то нельзя скрафтить вещь. Цель: скрафтить без компонетов по нажатию кнопки Игра на Unity и можно пробовать использовать в dnSpy модифицировать файл Assembly-CSharp.dll Открываем файлик и смотрим на классы связанные с крафтом Так находим кнопку, которая создаст указанное количество вещей крафта в CreateItem Задача скрафтить по имеющемуся рецепту любую вещь. Для этого я добавляю проверку количества вещей и удаляю лишний код. Под сполерами оригинальный и модифицированный код Модифицированный код using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; public partial class Crafting : MonoBehaviour { public void CreateItem(int curCraft, int craftCount) { if (this.timeBreak >= 0.3f) { // Добавили одну вещь крафта if (craftCount == 0) { craftCount = 1; } if (craftCount != 0) { this.succes = true; CraftRecipe component = this.craftObjects[curCraft].GetComponent<CraftRecipe>(); // Здесь удалили код, который должен расходовать вещи из инвентаря // ... if (this.succes) { this.iks = this.craftObjects[curCraft].GetComponent<CraftRecipe>().countCreate * craftCount; for (int m = 0; m < this.craftObjects[curCraft].GetComponent<CraftRecipe>().countCreate * craftCount; m++) { this.emptyCell = Inventory.inv.FindItemForStack(this.craftObjects[curCraft].name); if (this.emptyCell >= 0) { if (Inventory.inv.items[this.emptyCell].stack + this.iks <= Inventory.inv.items[this.emptyCell].maxStack) { Inventory.inv.items[this.emptyCell].stack += this.iks; break; } this.iks -= Inventory.inv.items[this.emptyCell].maxStack - Inventory.inv.items[this.emptyCell].stack; Inventory.inv.items[this.emptyCell].stack = Inventory.inv.items[this.emptyCell].maxStack; } else { this.emptyCell = Inventory.inv.FindEmptyCell(); if (this.emptyCell >= 0) { this.cloneItem = Inventory.inv.CreateItem(this.craftObjects[curCraft]); if (this.cloneItem.maxStack >= this.iks) { this.cloneItem.stack = this.iks; Inventory.inv.items[this.emptyCell] = this.cloneItem; break; } this.cloneItem.stack = this.cloneItem.maxStack; this.iks -= this.cloneItem.maxStack; Inventory.inv.items[this.emptyCell] = this.cloneItem; } else { if (this.craftObjects[curCraft].GetComponent<Item>().maxStack >= this.iks) { PlayerNetwork.inst.CallCmdCreateItem(this.craftObjects[curCraft].name, Inventory.inv.transform.position - Vector3.forward * 2f + FloatingOrigin.offset, Quaternion.identity, this.iks, this.craftObjects[curCraft].GetComponent<Item>().health); break; } PlayerNetwork.inst.CallCmdCreateItem(this.craftObjects[curCraft].name, Inventory.inv.transform.position - Vector3.forward * 2f + FloatingOrigin.offset, Quaternion.identity, this.craftObjects[curCraft].GetComponent<Item>().maxStack, this.craftObjects[curCraft].GetComponent<Item>().health); this.iks -= this.craftObjects[curCraft].GetComponent<Item>().maxStack; } new WaitForEndOfFrame(); } } } } this.timeBreak = 0f; } } } Оригинальный public void CreateItem(int curCraft, int craftCount) { if (this.timeBreak >= 0.3f) { if (craftCount != 0) { this.succes = true; CraftRecipe component = this.craftObjects[curCraft].GetComponent<CraftRecipe>(); int[] array = new int[7]; int[] array2 = new int[7]; for (int i = 0; i < 7; i++) { if (this.succes && component.ingredients[i] != null) { array2[i] = component.countIngredients[i]; if (array2[i] <= 0) { array2[i] = 1; } array2[i] *= craftCount; for (int j = 0; j < Inventory.inv.items.Length; j++) { if (Inventory.inv.items[j] != null && component.ingredients[i].name == Inventory.inv.items[j].prefName) { array[i] += Inventory.inv.items[j].stack; } } if (array[i] < array2[i]) { this.succes = false; } } } if (this.succes) { for (int k = 0; k < 7; k++) { if (component.ingredients[k] != null) { for (int l = 0; l < Inventory.inv.items.Length; l++) { if (Inventory.inv.items[l] != null && array2[k] > 0 && component.ingredients[k].name == Inventory.inv.items[l].prefName) { this.iks = Inventory.inv.items[l].stack; Inventory.inv.items[l].stack -= array2[k]; array2[k] -= this.iks; if (array2[k] <= 0) { break; } } } } } this.iks = this.craftObjects[curCraft].GetComponent<CraftRecipe>().countCreate * craftCount; for (int m = 0; m < this.craftObjects[curCraft].GetComponent<CraftRecipe>().countCreate * craftCount; m++) { this.emptyCell = Inventory.inv.FindItemForStack(this.craftObjects[curCraft].name); if (this.emptyCell >= 0) { if (Inventory.inv.items[this.emptyCell].stack + this.iks <= Inventory.inv.items[this.emptyCell].maxStack) { Inventory.inv.items[this.emptyCell].stack += this.iks; break; } this.iks -= Inventory.inv.items[this.emptyCell].maxStack - Inventory.inv.items[this.emptyCell].stack; Inventory.inv.items[this.emptyCell].stack = Inventory.inv.items[this.emptyCell].maxStack; } else { this.emptyCell = Inventory.inv.FindEmptyCell(); if (this.emptyCell >= 0) { this.cloneItem = Inventory.inv.CreateItem(this.craftObjects[curCraft]); if (this.cloneItem.maxStack >= this.iks) { this.cloneItem.stack = this.iks; Inventory.inv.items[this.emptyCell] = this.cloneItem; break; } this.cloneItem.stack = this.cloneItem.maxStack; this.iks -= this.cloneItem.maxStack; Inventory.inv.items[this.emptyCell] = this.cloneItem; } else { if (this.craftObjects[curCraft].GetComponent<Item>().maxStack >= this.iks) { PlayerNetwork.inst.CallCmdCreateItem(this.craftObjects[curCraft].name, Inventory.inv.transform.position - Vector3.forward * 2f + FloatingOrigin.offset, Quaternion.identity, this.iks, this.craftObjects[curCraft].GetComponent<Item>().health); break; } PlayerNetwork.inst.CallCmdCreateItem(this.craftObjects[curCraft].name, Inventory.inv.transform.position - Vector3.forward * 2f + FloatingOrigin.offset, Quaternion.identity, this.craftObjects[curCraft].GetComponent<Item>().maxStack, this.craftObjects[curCraft].GetComponent<Item>().health); this.iks -= this.craftObjects[curCraft].GetComponent<Item>().maxStack; } new WaitForEndOfFrame(); } } } } this.timeBreak = 0f; } } Изменяем весь класс или метов в этом окне Если выводит ошибки при компяляции, то скачиваем IlSpy и его код вставляем в код в dnSpy. Или качаем DnSpy 3.2.0 или ранее Изменения сохраняем в модуль, запускаем игру и крафтим. Получить все рецепты (не проверял правда, попробуйте если хотите) Вещи не ломаются. Убрать отнятие "здоровья" у вещи
    • MasterGHM

      Поиск в региона памяти модуля

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Статьи и видео фишки ce plugin обучалка
      5
      1
      0 Голоса
      5 Сообщения
      264 Просмотры
      PitronicP
      вот доказательство что старым версиям твой плагин нужен будет.
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 3 / 6