-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент MasterGH
-
Тем, кому всегда казалось сложным писать программы могу посоветовать "Turbo Pascal: учитесь программировать О. Меженный" В этой книжке даже есть основы ООП ближе к концу. Самое главное можно легко понять как работают циклы, как работают функции, что такое типы, переменные и тому подобное. Очень советую хотя бы полистать. Вообще книги по языку программирования это для меня как художественная литература от автора. Лучше всего официальные справочники и спецификации по языку программирования. Там будут описаны все возможности языка и ничего не будет пропущено. Книги - для ознакомления.
-
Скорее всего, это баг сырой версии "CE 6.4+". В версии CE 6.4 его может не быть.
-
>> В чем может быть проблема ? Могу посоветовать вбить в поиск "WinXP OpenProcess always returns 0". Можно найти как минимум одну проблему и описание её решения. Предлагают ставить SeDebugPrivilege
- 3 ответа
-
- 2
-
-
Не думаешь попробовать C++ и WinAPI, ну или хотя бы Дельфи или даже C# (или что-то другое). Просто на CE трейнер в 4 МБ или 3 МБ что-то как-то много, даже нет, очень много
-
TestTr2.CT <?xml version="1.0" encoding="utf-8"?><CheatTable CheatEngineTableVersion="18"> <Forms> <UDF1 Class="TCEForm" Encoding="Ascii85">lVW6G2nldAU:MM2b.}cxWeIh0Gi32eO*FuxWMuP5%{mcIVgA6t9Fkwa6v7(wnNpI$=7,zGoLEqjnV-i7R=g#]lbM:V0$0op.lmY(Wfo@9/*m@la04xI(PYwpcFM2dhBA{#D/JkU#X[xP5)L^O2eFMQ3}m^,7LJg[B;$q6*FLJZ23,PEVKvthpSeZ_bAbWF000</UDF1> </Forms> <CheatEntries> <CheatEntry> <ID>0</ID> <Description>"Cheat1 Test Script"</Description> <LastState Activated="0"/> <Color>80000008</Color> <VariableType>Auto Assembler Script</VariableType> <AssemblerScript>[ENABLE]luacall(print("Cheat1 On")) [DISABLE]luacall(print("Cheat1 Off"))</AssemblerScript> </CheatEntry> <CheatEntry> <ID>1</ID> <Description>"Cheat2 Test Script"</Description> <LastState Activated="0"/> <Color>80000008</Color> <VariableType>Auto Assembler Script</VariableType> <AssemblerScript>[ENABLE]luacall(print("Cheat2 On")) [DISABLE]luacall(print("Cheat2 Off"))</AssemblerScript> </CheatEntry> <CheatEntry> <ID>3</ID> <Description>"Auto Assemble script"</Description> <LastState Activated="0"/> <Color>80000008</Color> <VariableType>Auto Assembler Script</VariableType> <AssemblerScript>[ENABLE]luacall(print("Cheat5 On"))[DISABLE]luacall(print("Cheat5 On"))</AssemblerScript> </CheatEntry> </CheatEntries> <UserdefinedSymbols/> <LuaScript>-- Этап1. Связывание кликов чекбоксов с активацией или деактиваций -- Клик по чекбоксу1 активирует или деактивирует скрипт1 function OnClickCheckBox1() tableAddress = getAddressList() if(tableAddress[0].Active) then tableAddress[0].Active = false else tableAddress[0].Active = true end end -- Клик по чекбоксу2 активирует или деактивирует скрипт2 function OnClickCheckBox2() tableAddress = getAddressList() if(tableAddress[1].Active) then tableAddress[1].Active = false else tableAddress[1].Active = true end end -- Связывание кликов с функциями UDF1.CECheckbox1.OnClick = OnClickCheckBox1 UDF1.CECheckbox2.OnClick = OnClickCheckBox2-- Этап2. Чтение состояний активации и деактивации и связывание их с чекбоксами -- Смена состояни и цвета текста чекбоксов function StateCheckBox(checkBox, state) if(state) then checkBox.Font.Color = 0x000000ff else checkBox.Font.Color = 0x00000000 end checkBox.Checked = state end -- Функция обновления состояний function OnTimerUpdateGUI() if(isActive0 ~= tableAddress[0].Active) then isActive0 = tableAddress[0].Active StateCheckBox(UDF1.CECheckbox1,isActive0) end if(isActive1 ~= tableAddress[1].Active) then isActive1 = tableAddress[1].Active StateCheckBox(UDF1.CECheckbox2,isActive1) end end -- Переменные прошлых состояний, которые будут сравниваться с новыми в OnTimerUpdateGUI tableAddress = getAddressList() isActive0 = tableAddress[0].Active isActive1 = tableAddress[1].Active -- Таймер проверки timerGUI = createTimer(UDF1, false) timerGUI.Interval = 300 timerGUI.OnTimer = OnTimerUpdateGUI timerGUI.Enabled = true-- Этап3. Показываем, закрываем пользовательскую форму с заранее расположенными на ней чекбоками (с именами по умолчанию) function onCloseClick(sender) closeCE() return caFree end UDF1.OnClose = onCloseClick UDF1.Show()</LuaScript></CheatTable>
-
В 21 веке двуногие роботы все еще очень плохо ходят. Видео представленное с соревнования DARPA Robotic Challenge 2015 показывает как тяжела жизнь робота сегодня. Не то что бегать, а даже ходить на двух ногах практически невыполнимая задача и все очень медленно, слишком медленно чтобы хоть как-то тягаться с человеком по аналогичным заданиям.
-
Считаем call-ы из файла построенного IDA 1. Ищем в сети IDA и смотрим, что это такое 2. Кидаем файл игры на IDA 3. После завершения дизассемблирования ищем все call-ы через главное меню 4. После завершения поиска call-ов в окне результатов через контекстное меню копируем результаты в буфер обмена. Надо подождать завершения, т.к. это может быть долгим процессом (на секунд 10) 5. Открываем стандартный блокнотик и вставлем текст и тоже ждем 6. В списке адреса должны быть из секции ".text", а внизу обычно другие секции. Их удаляем. 7. Ощищаем ".text" через поиск замена, чтобы новая строка начиналась с адреса вызова call и получаем список типа этого 004010A3 call ??3@YAXPAX@Z ; operator delete(void *) 0040127B call sub_973781 004012E3 call sub_403730 00401333 call sub_403730 00401383 call sub_403730 004013E0 call sub_973781 00401558 call edi ; sscanf 004015C8 call edi ; sscanf 00401618 call sub_403730 00401620 call sub_403710 004017B7 call sub_403730 004017E0 call sub_973781....
-
Статических адресов цен может вообще не существовать. Например, цены с id предметами и их ценами могут быть в динамическом списке подгружаемые с данных на жестком диске. Или же могут быть в динамической памяти как текст xml разметкой... Могу посоветовать только реверс. Ставить брейкпионт на запись на адрес денег и искать откуда берется число, которое вычитается из денег. Тогда можно выйти на цены в памяти игры или call функцию, которая получает цену по id предмету. Я думаю, что данные по ценами все-таки распаковываются с данных на жестом диске в память игры до загрузки или же перед перед показом меню, или же перед каждой покупкой. В общем зависит от того как написана игра. Обычно делают чит связанный с количеством имеющихся денег, тогда цены искать не нужно будет. Сделал максимум денег, или сделал кнопку добавляющие деньги, или же сделал их не уменьшающимися, и не паришься.
-
Я понял так, что некоторые люди очень настаивали чтобы данные писать под newMem newmem:// данныеsomeLabel:dd ....someLabel:dd ....someLabel:dd ....code:// код... Тем, кто не хочет с этим мириться Дарк Байт предлагает вручную исправлять этот шаблон (видимо скрипт поправить ручками) и он не видит в этом проблемы. Хотя для других это может быть неудобно. Как по мне, так мне без разницы что так, что этак...
-
Юзер спрашивает Ответ ДаркБайта
-
Судя по видео, вроде как прицел дергается при выстрелах и разброс пуль есть.
-
1. Исправлен скрипт, чуть-чуть быстрее 2. В скрипте добавлена новая функция LogCallsWithIgnoreCalls(startAddress, endAddress, maxCalls, maxIgnoreCalls) startAddress - начало поиска call-ов endAddress - конец поиска maxCalls - масимальное количество call-ов maxIgnoreCalls - пропуск кол-ва первых call-ов 2. Ошибок не будет, если указывать регион кода до секции .text LogCalls(0x00401000, 0x00645714, 400000) Я когда не знал, то переправил какие-то таблицы указателей на функций и естественно игра вылетала. Раньше я писал по размеру региона LogCalls(0x00401000, 0x00401000 + 0x00646000, 400000)Так как ассемблировались таблицы указателей и прочие данные, а не код, то игра маями вылетала. А сейчас все в шоколаде. ------------ Еще некоторые ограничения на работу со скриптом 1. Функции, которые меняют call-ы разовые на один промежуток памяти. Т.е. на один запуск игры и на один запуск CE. Если что-то пошло не так, то придется перезапустить игру и CE 2. Неудобно брать отдельные промежутки памяти для *.exe и *.dll, т.е. не удобно использовать LogCalls с разными промежутками, т.к. придется сканировать промежутки отдельно через сканер памяти, а это точно фигня. Поэтому надо бы подумать над универсальным способом, через одну кнопку. Собрать скопом все промежутки кода в таблицу и отправить в функцию на подмену call-ов c логированием их счетчика. 3. CE как я уже писал немного подвисает, надо бы придумать статус-окно с визуализацией. Такие дела... Твой способ автоматизировать сложно, т.к. игра вылетает, когда функция не выполняется. Надо юзать обработку исключения через Lua скрипты, чтобы игра не вылетала и восстанавливать код, который привел к вылету. Я пока не умею делать инъекции кода с обработкой исключительных ситуаций. Далее, твои функции явно не все, а только некоторые. Так что не факт, что ты найдешь. Еще один момент, call-ы даже если все переправишь и перепроверишь, то можешь не добиться никакого результата. Дело в том, что call может просчитывать внутри условия нанесения урона главному герою. Если этот call не выполнять, то например будет вылет из игры. Т.е. ты не можешь его не выполнять и просто его пропускать. Его возможно потребуется исследовать. Как выходить на оригинальные инструкции, когда нашли подходящий счетчик call в сканере памяти? Нам надо в первую очередь значительно уменьшить кол-во call-ов, которые срабатывают когда здоровье героя закончилось. Это можно сделать логирую счетчики call-ов, использовать сканер памяти. Затем ставим брейкпоинт на адрес счетчика и выходим на инструкцию, которая записала счетчик. Сморим стек по ESP там адрес call, с которого прыгнули. Если на него перейти, то выйдем на инструкцию, которая прыгала на запись счетчика call. Таким образом выходим на оригинальный call.
-
Если скачать DirectX SDK и открыть справочный файл, то там можно найти все функции работающие с матрицей. После чего запустить API Monitor поставить хуки на функции. И по ним наверно можно составить сигнатуру функций в CE.
-
Если можно сделать на Дельфи, то можно сделать и в CE. В крайнем случае можно менять картинки по таймеру.
-
>> у меня вопрос ты сканировал Callы по выстрелу или как-то иначе? Ищу call-ы от милишной атаки. В данный момент ничего не ломаю и занимаюсь багами и вылетами. Я законтролил одну инструкцию при крахе игры через Олли, там сразу call адрес2 cmp .... // тут сразу сравнение, а флаг-то из-за inc[...] меняется jge ... // тут прыг Похоже надо делать pushf inc [адрес1] popf jmp адрес2 Флаги надо будет попробовать сохранить и восстановить после inc. Но меня так в сон клонит, что сегодня ничего делать не буду. Сейчас отключусь и спать. Я некоторые call-ы находил интересные, но это все не то. Если у меня будут результаты по Майями, то я отпишусь. Пока результатов нет.
-
Скрипт я изменил. Вот результаты, просто фантастика. Вот эта штука в игрушке хот маями LogCalls(0x008CFA64, 0x00401000+0x646000, 400000)Выполнилась за 17 секунд. А это 1537436 адресов было продизассемблированно. В итоге я сейчас наблюдаю огромный кусок памяти с счетчиками функций. Ставлю игру на паузу ищу неизвестное. Отпускаю. Ищу изменилось. И вижу адреса и вижу красные бегающие цифры. Здорово ) И самое классное игра нифига не тормозит, как с этим ультимапом + сканирую по правилам обычного сканера. Вообще супер Вот еще логи Last log call at 00A46FFE - 00 00 - add [eax],al Start region : 0x00401000, End region : 0x00A46FFF Call injections : 270435 End address from region: 0x00A47000 Scan addresses 6578175 Finish time 107.68 sec Mem count region : 0x09560000, End region : 0x096E6A00 Injections complete!! Продизассемблировано 6578175 инструкций, сделано инъекций в call-ы 270435 начиная с адреса 0x00401000 до адреса 0x00A46FFF за 107.68 секунд. Счетчики расположились в памяти от адреса 0x09560000 до 0x096E6A00. Только вот во время сканирования CE подвисает. Надо бы придумать отдельным потоком с графической полосой...
-
Узнаем кол-во срабатываний call-ов на участке кода (CE Lua)
MasterGH опубликовал тема в Cheat Engine
Данный скрипт позволит вести счет вызовов call на выделенном участке памяти. В отличии от Ultimap этот способ не должен видимо тормозить игру. Но есть и ограничение Call-ы размером не меньше пяти байт. А большие регионы памяти и большое количество call-ов возможно придется долго ждать. Подробнее посмотрим идею на скришотах. На скриншоте ниже показан результат после выполнения команды -
keng, правильно ли я тебя понял, ты пожелал багов? Я прочитал это так
-
Я думаю, можно найти по сигнатуре функции, которые работают с матрицами внутри процесса игры. Перенаправлять их вызов на свою функцию, получать указатель на матрицу и прыгать обратно на оригинальную функцию. Я не очень уверен, но кажется таким способом не нужно заранее знать указатель на устройство.
-
1. Рабочий адрес можно попробовать найти Lua скриптом поставив махом бряки на запись из таблицы. Там где будет запись первой на инструкции записи и это число установится на всех адресах, то это может быть инструкция работающая с рабочим адресом. Так можно выйти на потенциальный рабочий адрес не меняя все адреса, что может привести к вылету. 2. Тип адреса можно узнать установкой брейкпоинта на него. Судя по прервавшейся инструкции можно определить размер данных 1 byte, 2 byte, 4 байта, 8 байт или float, double.
-
Перед тем как подключить процесс игры к CE попробуй поставить VEH Debugger:
-
Маями поковыриваю в том числе и этим скриптом. Как будет результат, то напишу в соответствующую тему.
-
Чтобы хорошо программировать на CE Lua в дизассемблере и в отладке нужно знать Lua. Некоторые ссылки, которые мне пригодились Справочник по Lua - ссылка Регулярные выражения - ссылка, ссылка
-
Скрипт нужен для поиска call-ов, которые срабатывают или не срабатывают при действиях в игре. Call-ы, которые не срабатывают остаются в окне брейкпоинтов, которое можно найти из меню окна дизассемблера. Call-ы, которые сработали остаются в логах с меткой времени. Т.е. можно увидеть какие были удалены сопоставляя с тем, что делаем в игре. -- boolean isPluginMode - работает плагин-- boolean isModeRemoveHitBreakPoints - устанавливает режим, при котором срабатавыающие брейкпоинты тут же снимаютсяisPluginMode = trueisModeRemoveHitBreakPoints = true-- Функция устанавливает брейкпоинты на call-ы -- num beginAddress начальный адрес-- num endAddress конечный адресfunction SetBreakPointsToCalls(beginAddress, endAddress) currentAddress = beginAddress disassembler = getDefaultDisassembler() while currentAddress < endAddress do line = disassembler.disassemble(currentAddress) local data = disassembler.getLastDisassembleData() if(data["isCall"]) then print('Set break point '..line) debug_setBreakpoint(data["address"], 1, bptExecute) end currentAddress = currentAddress + getInstructionSize(address) endendfunction debugger_onBreakpoint() if(isPluginMode) then if(isModeRemoveHitBreakPoints) then if(targetIs64Bit()) then debug_removeBreakpoint(RIP) print(string.format("Remove Break Point %s at %.2f sec", disassemble(RIP), os.clock())) else debug_removeBreakpoint(EIP) print(string.format("Remove Break Point %s at %.2f sec", disassemble(EIP), os.clock())) end end return 1 -- не показывать дизассемблер end return 0end-- Пример--SetBreakPointsToCalls(0x0041CE30, 0x0041D73A)0041CEA8 - 8B 1A - mov ebx,[edx]0041CEAA - 8A 4E 9F - mov cl,[esi-61]0041CEAD - 88 46 9F - mov [esi-61],al0041CEB0 - C6 06 00 - mov byte ptr [esi],000041CEB3 - 84 C0 - test al,al0041CEB5 - 0F84 C1000000 - je 0041CF7C0041CEBB - 84 C9 - test cl,cl0041CEBD - 75 21 - jne 0041CEE0 // Перепрыгивает инструкцию 0041CED20041CEBF - 8B 0D B452F700 - mov ecx,[00F752B4] : [03758390]0041CEC5 - 8B 01 - mov eax,[ecx]0041CEC7 - 8B 90 A8000000 - mov edx,[eax+000000A8]0041CECD - 53 - push ebx0041CECE - C6 45 A3 01 - mov byte ptr [ebp-5D],010041CED2 - FF D2 - call edx0041CED4 - 8B 4D B4 - mov ecx,[ebp-4C]0041CED7 - 53 - push ebx0041CED8 - C6 06 01 - mov byte ptr [esi],010041CEDB - E8 90F9FFFF - call 0041C8700041CEE0 - A1 7864B200 - mov eax,[00B26478] : [00B26570]0041CEE5 - 8B 88 A8030000 - mov ecx,[eax+000003A8]0041CEEB - 89 4D 88 - mov [ebp-78],ecx-- Пример--SetBreakPointsToCalls(0x0041CE30, 0x0041D73A)
- 2 ответа
-
- 2
-