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

MasterGH

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

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

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

    129

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

  1. Garik66, менять значения регистров eip и rip нельзя менять АА скриптами. Это можно сделать только в режиме отладки. Представь себе, что ты на инструкции отладочного кода денег, здоровья или еще чего нажал на F5. Инструкция прервалась, процесс игры остановлен. Ты вручную меняешь регистры через отладку, адреса через отладку... И отпускаешь игру. А поменяв RIP вручную, можешь перескочить на твой код. А вот Lua позволяет это автоматизировать. Например, поменять RIP регистр на прерывании на инструкции в автоматическом режиме. Т.е. без изменения оригинального кода так можно прыгнуть на новый код по RIP. Здесь надо экспериментировать с Lua по работе в отладке. Но, тут привязка к VEH дебаггеру. Тут привязка к Cheat Engine движку и трейнерам созданных на CE. Любая игра под отладкой будет работать медленнее. В общем это обход защиты от изменения кода, но не отключение защиты. Но как вариант на худой конец может подойти.
  2. Указатель на деньги не удалось достроить через трассировку --print(readInteger('7FFFB114540+28'))--print(readInteger('[80E95FC0]+28'))--print(readInteger('[[929F0F20+08]]+28'))--print(readInteger('[[929F0F08+18+08]]+28'))--print(readInteger('[[929F0F00+08+18+08]]+28'))--print(readInteger('[[[7FFFBEDCD88]+08+18+08]]+28'))--print(readInteger('[[[7FFFBEDCD80+8]+08+18+08]]+28'))--print(readInteger('[[[[74B347C0+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[74B33370+b8]+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[[[75183850+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))--print(readInteger('[[[[[[[[7D037860+a8]+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))print(readInteger('[[[[[[[[[7FFFB111C20+18]+a8]+78]+24*8]+b8]+A8]+8]+08+18+08]]+28'))7FFFB111C2014119777B - CC - int 3 14119777C - CC - int 3 14119777D - CC - int 3 14119777E - CC - int 3 14119777F - CC - int 3 141197780 - 48 89 5C 24 08 - mov [rsp+08],rbx // откуда идет сюда прыжок не удалось узнать141197785 - 48 89 6C 24 10 - mov [rsp+10],rbp 14119778A - 48 89 74 24 18 - mov [rsp+18],rsi14119778F - 57 - push rdi141197790 - 48 83 EC 30 - sub rsp,30141197794 - 48 8B 69 18 - mov rbp,[rcx+18] //[rcx+18] = 7FFFB111C20141197798 - 48 8B DA - mov rbx,rdx14119779B - 48 8B 8D A8000000 - mov rcx,[rbp+000000A8]1411977A2 - E8 99C8B5FF - call 140CF40401411977A7 - 48 8D 4B 30 - lea rcx,[rbx+30]1411977AB - 48 8B F0 - mov rsi,rax1411977AE - E8 FD9BB300 - call 141CD13B01411977B3 - 48 8B F8 - mov rdi,rax1411977B6 - 48 85 C0 - test rax,rax1411977B9 - 74 71 - je 14119782C1411977BB - 48 8B C8 - mov rcx,rax1411977BE - E8 7DC8B5FF - call 140CF40401411977C3 - 48 8B D0 - mov rdx,rax1411977C6 - 48 85 C0 - test rax,rax1411977C9 - 74 56 - je 1411978211411977CB - 8B 4B 10 - mov ecx,[rbx+10]...
  3. Итак еще способы попробую 1. Использовать указатели и цепочки указателей 2. Использовать вызов функций (например когда берем деньги, то появляется уведомление) Способ прикольный, тем что код не меняется, а значит защита может спокойно себя чувствовать. Но функции вызывать может быть сложным. 3. Постоянно держать игру под отладкой. Например, когда прерываемся на адресе инструкции, то на Луа по данным регистров что-то делать...
  4. Не, не разобрался. А ты не пробовал искать цепочки указателей на адрес денег, здоровья и прочего? Чем не выход? Не хочешь попробовать? Только что-то на здоровье у меня не получилось рабочий адрес найти. Garik66, чтобы игра меньше тормозила попробуй поставить все поминимум в настройках и минимальное возможное разрешение и 16 битный режим на монитор. Например, можешь поставить разрешение 1024 на 768 на дисплей и разрешение игры 640 на 480. Может даже сможешь поиграть и пройти пролог, ну и читы потестить свои.
  5. Я подчистил, потому что чужой скрипт из чужого трейнера. Чужие трейнеры используйте по прямому назначению. Да и тема перенесена в открытый раздел.
  6. У проверяющей инструкции есть адрес. Добавить его в таблицу и поставить на него брейкпоинт. В окне тут же вылезут инструкции. Так как игра у меня часто вылетает, то я даже не захожу в игру и вообще в неё не играю. После запуска exe, как только пошли ролики сразу alt+tab и открываешь CE и ковыряешь. Даже до меню не доходишь.
  7. Они там хранятся, потому что они там нужны, а не в другом месте. Нужна временная память разного размера под временные данные. Поэтому вне модуля.
  8. Здорово, сам нашел причину и никто даже не догадывался в теме.
  9. Тогда тебе не повезло, потому что получается замкнутый круг. Возможно тебе будет проще использовать цепочки указателей и заморозку значений.
  10. Итак есть окно с данными трассеровки, бряков, id потоков и прочего И мы хотим это сохранить для анализа, а никак. Надо писать скрипт. Копипистим скрипт ниже в Луа консоль и нажимаем выполнить. Выбираем директорию, называем файл и сохраняем. function FindForm(formName) local formCount = getFormCount() for i=0, formCount-1 do if(getForm(i).Name == formName) then return getForm(i) end endendfrmSaveDialog = nilfunction SaveToAdressesList(path) local frmDebugEvents = FindFrom('frmDebugEvents') local items1 = frmDebugEvents.lbDebugEvents.Items items1.saveToFile(path)endfunction OnCloseSaveDialog(argFrmSaveDialog) local path = argFrmSaveDialog.FileName SaveToAdressesList(path)endif(frmSaveDialog == nil) then frmSaveDialog = createSaveDialog(nil)endfrmSaveDialog.DefaultExt = '.txt'frmSaveDialog.FileName = fileNamefrmSaveDialog.Filter = '*.txt'frmSaveDialog.FilterIndex = -1frmSaveDialog.OnClose = OnCloseSaveDialogfrmSaveDialog.Execute()
  11. Спасибо. Я короче написал программулину, а там вот так int count = 1000; string nameA = "1000"; void OnGUI() { if(GUILayout.Button(nameA)) { count++; nameA = count.ToString(); ulong a = 0x1455d741f; if(a == 0x2455d741f) { print("CatchCatch"); } } } 037EAFE8 - 48 B8 1F745D4501000000 - mov rax,00000001455D741F037EAFF2 - 48 B9 1F745D4502000000 - mov rcx,00000002455D741F037EAFFC - 48 3B C1 - cmp rax,rcx037EAFFF - 75 1A - jne 037EB01B037EB001 - B9 50274E05 - mov ecx,054E2750 : [00408A28]037EB006 - 48 83 EC 20 - sub rsp,20037EB00A - 49 BB 3FB07E0300000000 - mov r11,00000000037EB03F : [B94FBCE8]037EB014 - 41 FF D3 - call r11d037EB017 - 48 83 C4 20 - add rsp,20037EB01B - 48 8B 75 F8 - mov rsi,[rbp-08]037EB01F - C9 - leave 037EB020 - C3 - ret Т.е. в регистр можно записать большое число и потом сравнивать. Мне нужен самый короткий вариант. Попробую все варианты. Слишком емко, но вариант рабочий. Не ругается, но та же фигня. Режет... В общем надо переделать мне этот скрипт. Вы можете это не делать, я просто показываю мои самые тупые ошибки за этот год. [ENABLE]alloc(checkCRC, 2048)label(checkCRCCode)registersymbol(checkCRCCode)label(x1)label(x2)label(x3)label(x4)label(x5)label(x6)label(x7)label(x8)label(x9)label(x10)label(x11)label(x12)label(x13)label(x14)label(x15)label(x16)label(x17)label(x18)label(x19)label(x20)label(x21)label(x22)label(x23)label(x24)checkCRC:db 32 02 F9 E9 9C 06 00 00db 32 02 F6 C3 9Bdb 32 02 F5 A8 3Fdb 8B 53 28 03 43 38checkCRCCode://cmp rdx, QWORD PTR 1455d741fcmp rdx,ACU.exe+55D741Fcmp rdx, 1455d741fje x1cmp rdx,1455d7420je x2cmp rdx,1455d7421je x3cmp rdx,1455d7422je x4cmp rdx,1455d7423je x5cmp rdx,1455d7424je x6cmp rdx,1455d7425je x7cmp rdx,1455d7426je x8cmp rdx,1455d658fje x9cmp rdx,1455d6590je x10cmp rdx,1455d6591je x11cmp rdx,1455d6592je x12cmp rdx,1455d6593je x13cmp rdx,140007f48je x14cmp rdx,140007f49je x15cmp rdx,140007f4aje x16cmp rdx,140007f4bje x17cmp rdx,140007f4cje x18cmp rdx,140fab5beje x19cmp rdx,140fab5bfje x20cmp rdx,140fab5c0je x21cmp rdx,140fab5c1je x22cmp rdx,140fab5c2je x23cmp rdx,140fab5c3je x24retx1:xor al,[checkCRC+0]retx2:xor al,[checkCRC+1]retx3:xor al,[checkCRC+2]retx4:xor al,[checkCRC+3]retx5:xor al,[checkCRC+4]retx6:xor al,[checkCRC+5]retx7:xor al,[checkCRC+6]retx8:xor al,[checkCRC+7]retx9:xor al,[checkCRC+8]retx10:xor al,[checkCRC+9]retx11:xor al,[checkCRC+10]retx12:xor al,[checkCRC+11]retx13:xor al,[checkCRC+12]retx14:xor al,[checkCRC+13]retx15:xor al,[checkCRC+14]retx16:xor al,[checkCRC+15]retx17:xor al,[checkCRC+16]retx18:xor al,[checkCRC+17]retx19:xor al,[checkCRC+18]retx20:xor al,[checkCRC+19]retx21:xor al,[checkCRC+20]retx22:xor al,[checkCRC+21]retx23:xor al,[checkCRC+22]retx24:xor al,[checkCRC+23]ret[DISABLE]dealloc(checkCRC)
  12. Всем привет! Самый идиотский вопрос от меня и да, я на него не знаю ответ Если я в CE пишу cmp rdx, 1455d741f То на деле получаю обрезанное число 03C70018 - 48 81 FA 1F745D45 - cmp rdx,455D741FТ.е. улетела единица не понятно куда и сравнивается совсем другое число. Помогите нубу, если не в лом. От этого зависит обход защиты игры ACU. ---------- Если писать cmp rdx, QWORD 1455d741fТо CE не понимает чего я хочу и выдает ошибку
  13. Типы страниц памяти и регионов можно посмотреть в этом окне CE. Вызывается из окна дизассемблера. View->Memory Regions
  14. Garik66, возможно я отвечу на твои вопросы в теме обхода защиты игры ACU. Остается ждать.
  15. Вопрос не понятен. Если нужна версия CE в архиве, без установщика (инсталлятора), то у нас на форме поищи. Русская версия CE без установщика. Я так понимаю не "игру", а "CE". Тогда что мешает самому узнать? Тебе просто надо это проверить и все. p.s. Задаешь на форуме вопросы не несущие смысловой нагрузки.
  16. Скорее всего, никто, т.к. надо писать код, а никто не хочет. Самое простое делать через таймер . Проверяешь был ли нанесен урон по таймеру. Т.е. если прошлое здоровье больше текущего, то начинаешь искать сигнатуру. Еще вариант, заставлять появляться сигнатуру до нанесения первого урона. Но я даже примерно не знаю как это можно сделать. Еще вариант, внедрять dll, которая работает с Unity3d функциями и без всяких сигнатур ищет GameObject по типу или имени, ищет поле (закрытое или открытое) и правит его. Еще можешь поковырять mono примочки в Cheat Engine, если будешь CE использовать. С ними можно искать объекты и менять их значения. Т.е. никаких dll своих делать не придется.
  17. К посту 24. Сначала приведу описания //http://www.pinvoke.net/default.aspx/kernel32/VirtualQueryEx.html//MEMORY_BASIC_INFORMATION [StructLayout(LayoutKind.Sequential)] public struct MEMORY_BASIC_INFORMATION { public IntPtr BaseAddress; public IntPtr AllocationBase; public uint AllocationProtect; public IntPtr RegionSize; public uint State; public uint Protect; public uint Type; }//Flags public enum AllocationProtect : uint { PAGE_EXECUTE = 0x00000010, PAGE_EXECUTE_READ = 0x00000020, PAGE_EXECUTE_READWRITE = 0x00000040, PAGE_EXECUTE_WRITECOPY = 0x00000080, PAGE_NOACCESS = 0x00000001, PAGE_READONLY = 0x00000002, PAGE_READWRITE = 0x00000004, PAGE_WRITECOPY = 0x00000008, PAGE_GUARD = 0x00000100, PAGE_NOCACHE = 0x00000200, PAGE_WRITECOMBINE = 0x00000400 }
  18. Представляю замечательный скрипт по поиску инструкций, которые прыгают на известный адрес. 1. Описание проблемы на примере игры "Assassin Creed Unity"
  19. Попробуй сделать по аналогии. Тут запись текста в файло. Пара пирмеров using System;using System.IO;using System.Text;class Test { public static void Main() { string path = @"c:\temp\MyTest.txt"; // Open the stream and write to it. using (FileStream fs = File.OpenWrite(path)) { Byte[] info = new UTF8Encoding(true).GetBytes("This is to test the OpenWrite method."); // Add some information to the file. fs.Write(info, 0, info.Length); } // Open the stream and read it back. using (FileStream fs = File.OpenRead(path)) { byte[] b = new byte[1024]; UTF8Encoding temp = new UTF8Encoding(true); while (fs.Read(b,0,b.Length) > 0) { Console.WriteLine(temp.GetString(); } } }}using System;using System.Windows.Forms;using System.IO;using System.Text;namespace WindowsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FileStream writeStream ; try { writeStream = new FileStream("c:\\csharp.net-informations.dat", FileMode.Create); BinaryWriter writeBinay = new BinaryWriter(writeStream); writeBinay.Write("CSharp.net-informations.com binary writer test"); writeBinay.Close(); } catch (Exception ex) { MessageBox.Show (ex.ToString()); } } }}
  20. Нужно искать сигнатуру только после того, как функция появляется. Именно тогда, когда сигнатура существует, то именно тогда её можно найти. Это 100%.
  21. Как найти сигнатуру, которой не существует до первого определенного действия в игре? Ответ. Никак. Это же очевидно
  22. Я не понял, что ты хочешь сделать. Ты решил бы вопрос с установкой игры. Окно игры замораживается когда теряет фокус, а проверка кода не останавливается. Хотя бы просто попробовал бы запустить игру в главном меню или даже до попадания в это меню во время показа видео заставок. Не забудь поставить Вех Дебаггер в CE.
  23. Мне не удалось обойти защиту, но ковырять не бросил. Время от времени ковыряю. Внимание собственно привлекло вот, что "ACU.exe"+55D741A: E9 50 AA FF FF - jmp ACU.exe+55D1E6F// ---------- INJECTING HERE ----------"ACU.exe"+55D741F: 32 02 - xor al,[rdx]"ACU.exe"+55D7421: F9 - stc "ACU.exe"+55D7422: E9 9C 06 00 00 - jmp ACU.exe+55D7AC3// ---------- DONE INJECTING ----------"ACU.exe"+55D7427: E9 26 59 FF FF - jmp ACU.exe+55CCD52 Я не проверял(кстати надо бы проверить) слишком уж часто попадаются на глаза короткие инструкции и безусловные прыжки следующие за ними через несколько байт и или же прыжки до коротких инструкций. Если какой-то код прыгает на "ACU.exe"+55D7422, а там уже была инъекция кода, то это вызовет исключение и возможно вылет. Три байта 32 02 F9 слишком мало чтобы в "ACU.exe"+55D741F делать инъекцию кода. Тут надо бы поэкспериментировать чего и как делать.
×
×
  • Создать...

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

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