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

MasterGH

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

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

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

    129

Весь контент MasterGH

  1. Тем, кому всегда казалось сложным писать программы могу посоветовать "Turbo Pascal: учитесь программировать О. Меженный" В этой книжке даже есть основы ООП ближе к концу. Самое главное можно легко понять как работают циклы, как работают функции, что такое типы, переменные и тому подобное. Очень советую хотя бы полистать. Вообще книги по языку программирования это для меня как художественная литература от автора. Лучше всего официальные справочники и спецификации по языку программирования. Там будут описаны все возможности языка и ничего не будет пропущено. Книги - для ознакомления.
  2. Скорее всего, это баг сырой версии "CE 6.4+". В версии CE 6.4 его может не быть.
  3. >> В чем может быть проблема ? Могу посоветовать вбить в поиск "WinXP OpenProcess always returns 0". Можно найти как минимум одну проблему и описание её решения. Предлагают ставить SeDebugPrivilege
  4. Не думаешь попробовать C++ и WinAPI, ну или хотя бы Дельфи или даже C# (или что-то другое). Просто на CE трейнер в 4 МБ или 3 МБ что-то как-то много, даже нет, очень много
  5. 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>
  6. В 21 веке двуногие роботы все еще очень плохо ходят. Видео представленное с соревнования DARPA Robotic Challenge 2015 показывает как тяжела жизнь робота сегодня. Не то что бегать, а даже ходить на двух ногах практически невыполнимая задача и все очень медленно, слишком медленно чтобы хоть как-то тягаться с человеком по аналогичным заданиям.
  7. Считаем 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....
  8. Статических адресов цен может вообще не существовать. Например, цены с id предметами и их ценами могут быть в динамическом списке подгружаемые с данных на жестком диске. Или же могут быть в динамической памяти как текст xml разметкой... Могу посоветовать только реверс. Ставить брейкпионт на запись на адрес денег и искать откуда берется число, которое вычитается из денег. Тогда можно выйти на цены в памяти игры или call функцию, которая получает цену по id предмету. Я думаю, что данные по ценами все-таки распаковываются с данных на жестом диске в память игры до загрузки или же перед перед показом меню, или же перед каждой покупкой. В общем зависит от того как написана игра. Обычно делают чит связанный с количеством имеющихся денег, тогда цены искать не нужно будет. Сделал максимум денег, или сделал кнопку добавляющие деньги, или же сделал их не уменьшающимися, и не паришься.
  9. Я понял так, что некоторые люди очень настаивали чтобы данные писать под newMem newmem:// данныеsomeLabel:dd ....someLabel:dd ....someLabel:dd ....code:// код... Тем, кто не хочет с этим мириться Дарк Байт предлагает вручную исправлять этот шаблон (видимо скрипт поправить ручками) и он не видит в этом проблемы. Хотя для других это может быть неудобно. Как по мне, так мне без разницы что так, что этак...
  10. Юзер спрашивает Ответ ДаркБайта
  11. Судя по видео, вроде как прицел дергается при выстрелах и разброс пуль есть.
  12. 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.
  13. Если скачать DirectX SDK и открыть справочный файл, то там можно найти все функции работающие с матрицей. После чего запустить API Monitor поставить хуки на функции. И по ним наверно можно составить сигнатуру функций в CE.
  14. Если можно сделать на Дельфи, то можно сделать и в CE. В крайнем случае можно менять картинки по таймеру.
  15. >> у меня вопрос ты сканировал Callы по выстрелу или как-то иначе? Ищу call-ы от милишной атаки. В данный момент ничего не ломаю и занимаюсь багами и вылетами. Я законтролил одну инструкцию при крахе игры через Олли, там сразу call адрес2 cmp .... // тут сразу сравнение, а флаг-то из-за inc[...] меняется jge ... // тут прыг Похоже надо делать pushf inc [адрес1] popf jmp адрес2 Флаги надо будет попробовать сохранить и восстановить после inc. Но меня так в сон клонит, что сегодня ничего делать не буду. Сейчас отключусь и спать. Я некоторые call-ы находил интересные, но это все не то. Если у меня будут результаты по Майями, то я отпишусь. Пока результатов нет.
  16. Скрипт я изменил. Вот результаты, просто фантастика. Вот эта штука в игрушке хот маями 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 подвисает. Надо бы придумать отдельным потоком с графической полосой...
  17. Данный скрипт позволит вести счет вызовов call на выделенном участке памяти. В отличии от Ultimap этот способ не должен видимо тормозить игру. Но есть и ограничение Call-ы размером не меньше пяти байт. А большие регионы памяти и большое количество call-ов возможно придется долго ждать. Подробнее посмотрим идею на скришотах. На скриншоте ниже показан результат после выполнения команды
  18. keng, правильно ли я тебя понял, ты пожелал багов? Я прочитал это так
  19. Я думаю, можно найти по сигнатуре функции, которые работают с матрицами внутри процесса игры. Перенаправлять их вызов на свою функцию, получать указатель на матрицу и прыгать обратно на оригинальную функцию. Я не очень уверен, но кажется таким способом не нужно заранее знать указатель на устройство.
  20. 1. Рабочий адрес можно попробовать найти Lua скриптом поставив махом бряки на запись из таблицы. Там где будет запись первой на инструкции записи и это число установится на всех адресах, то это может быть инструкция работающая с рабочим адресом. Так можно выйти на потенциальный рабочий адрес не меняя все адреса, что может привести к вылету. 2. Тип адреса можно узнать установкой брейкпоинта на него. Судя по прервавшейся инструкции можно определить размер данных 1 byte, 2 byte, 4 байта, 8 байт или float, double.
  21. Перед тем как подключить процесс игры к CE попробуй поставить VEH Debugger:
  22. Маями поковыриваю в том числе и этим скриптом. Как будет результат, то напишу в соответствующую тему.
  23. Чтобы хорошо программировать на CE Lua в дизассемблере и в отладке нужно знать Lua. Некоторые ссылки, которые мне пригодились Справочник по Lua - ссылка Регулярные выражения - ссылка, ссылка
  24. Скрипт нужен для поиска 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)
×
×
  • Создать...

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

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