Trix Опубликовано 20 октября, 2016 Поделиться Опубликовано 20 октября, 2016 (изменено) Ребята, всем привет. Столкнулся с такой проблемой - вчера делал AOB-injection, после инъекции крашится прога. Как мне написали в урок(Позже общался с автором, у него все работает, полностью скопировал скрипт, когда уже ничего не помогало, увы, проблема не в моем написании) Разрядность видны та же, и качал ту версию CE(взламываем туториал, шаг 2ой). Выглядит это так, за какую бы программу я не брался с подобной инъекцией все к черту крашится, логи не выдает просто окошечко "ожидается завершение программы". Вот видео автора, который мне подсказал выполнить данную инъекцию ( Garik66 ) За это ему отдельное спасибо. Функция срабатывает(видно, как меняется значение) но потом сразу крашится прога Кто подскажет, с чем связано и как фиксить? Спасибо!) Изменено 20 октября, 2016 пользователем Trix правка логической ошибки в построение предложения Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 20 октября, 2016 Поделиться Опубликовано 20 октября, 2016 (изменено) Ставь бряк на измененный участок и отлаживай до ошибки. Есть подозрение что CE просто не корректно создаёт поток. Если писать длл с изменением участка кода и созданием потока проблем нет. Проверял на dying light вызов функции выстрела, через ce краш, через длл все работало отлично. Изменено 20 октября, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 20 октября, 2016 Поделиться Опубликовано 20 октября, 2016 (изменено) Ясень пень такой код будет крашить нормальную программу, видимо автор видео не понимает механизм работы call call запихивает в стек значение регистра EIP+<длина инcтрукции call> и выполняет весь код начиная с указанного адреса пока не дойдет до инструкцию ret. Инструкция ret извлекает из стека этот адрес, чтобы выйти из функции и продолжить выполнять последующий код. Так же почти в каждой функции есть код пролога и эпилога, а если функция еще и использует локальные переменные, то нужно выделить память на стеке, а в конце подчищать стек. А тк @Garik66 вызывает функцию где-то с середины, то у него выполняются только последние действия чистка стека и код эпилога... То есть в этом случае 100% был поврежден стек и большинство регистров Изменено 20 октября, 2016 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 20 октября, 2016 Автор Поделиться Опубликовано 20 октября, 2016 2 минуты назад, Dino сказал: Ясень пень такой код будет крашить нормальную программу, видимо автор видео не понимает механизм работы call call запихивает в стек значение регистра EIP+<длина инcтрукции call> и выполняет весь код начиная с указанного адреса пока не дойдет до инструкцию ret. Инструкция ret извлекает из стека этот адрес, чтобы выйти из функции и продолжить выполнять последующий код. Так же почти в каждой функции есть код пролога и эпилога, а если функция еще и использует локальные переменные, то нужно выделить память на стеке, а в конце подчищать стек. А тк @Garik66 вызывает функцию где-то с середины, то у него выполняются только последние действия чистка стека и код эпилога... То есть в этом случае 100% был поврежден стек и большинство регистров ОКей, вы можете помочь мне примеров в данном вопросе? Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 20 октября, 2016 Поделиться Опубликовано 20 октября, 2016 15 минуту назад, Trix сказал: ОКей, вы можете помочь мне примеров в данном вопросе? да конечно рас http://trubetskoy1.narod.ru/arttranslate/FuncCallPart1.html два http://trubetskoy1.narod.ru/arttranslate/FuncCallPart2_1.html три 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 20 октября, 2016 Автор Поделиться Опубликовано 20 октября, 2016 Документация выглядит внушающе доверие, благодарю) по поводу последнего сообщения не понял " Угарнул что DB на этот счет придумал "Select current function"... " Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 октября, 2016 Поделиться Опубликовано 20 октября, 2016 8 часов назад, Dino сказал: видимо автор видео не понимает механизм работы call Механизм понимаю и понимаю, что вызываю не функцию, а конкретную инструкцию, просто попробовал и у меня заработало и кстати снова попробовал - у меня вылетов нет дол сих пор. 8 часов назад, Dino сказал: То есть в этом случае 100% был поврежден стек и большинство регистров Ну если бы Вы внимательно посмотрели видео, то увидели из какой я инструкции (инструкции на чтение того же адреса HP) вызываю код, в ней все регистры уже имеют нужные значения для второй инструкции ( инструкции на запись HP), которую я вызываю, так что не о каких повреждениях стека и регистров говорить не приходиться. В видео я gmz задал вопрос, как правильно использовать создание потока и закрывать его. Вот, если бы он ответил, то я бы доделал вызов именно функции уменьшения HP. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 17 час назад, Garik66 сказал: Механизм понимаю и понимаю, что вызываю не функцию, а конкретную инструкцию, просто попробовал и у меня заработало и кстати снова попробовал - у меня вылетов нет дол сих пор. Если понимаешь, то как по твоему может выполниться только одна инструкция? Или мб он какой-то другой с твоей точки зрения? И да, я первый раз был не столь внимателен, потому что у тебя еще один косяк Все твои действия выполняются из ГЛ потока программы, ты хукаешь инструкцию, которая крутится в бесконечном в цикле, но только вот своим ret ты преждевременно выходишь из функции(которую захукал) не дав программе выполнить последующий код, в результате повреждение стека , регистров и краш. Но эта ошибка не имеет смысла потому что ты уже убил программу раннее.) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 18 минуту назад, Dino сказал: Если понимаешь Dino, специально для Вас видео. Посмотрите пожалуйста и проверьте скрипт у себя, если будет время. Скрипт: Скрытый текст { Game : Tutorial-i386.exe Version: Date : 2016-10-17 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) label(flag) newmem: cmp [flag],1 jne code mov [flag],0 mov eax,#1000 call 00423920 ret code: cmp [ebx+00000480],000003E8 jmp return flag: dd 1 INJECT: jmp newmem nop nop nop nop nop return: registersymbol(INJECT) [DISABLE] INJECT: db 81 BB 80 04 00 00 E8 03 00 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23AC3 "Tutorial-i386.exe"+23AB1: E8 0A 9D FE FF - call Tutorial-i386.exe+D7C0 "Tutorial-i386.exe"+23AB6: 5E - pop esi "Tutorial-i386.exe"+23AB7: 5B - pop ebx "Tutorial-i386.exe"+23AB8: C9 - leave "Tutorial-i386.exe"+23AB9: C3 - ret "Tutorial-i386.exe"+23ABA: 00 00 - add [eax],al "Tutorial-i386.exe"+23ABC: 00 00 - add [eax],al "Tutorial-i386.exe"+23ABE: 00 00 - add [eax],al "Tutorial-i386.exe"+23AC0: 53 - push ebx "Tutorial-i386.exe"+23AC1: 89 C3 - mov ebx,eax // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+23AC3: 81 BB 80 04 00 00 E8 03 00 00 - cmp [ebx+00000480],000003E8 // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+23ACD: 75 2C - jne Tutorial-i386.exe+23AFB "Tutorial-i386.exe"+23ACF: 8B 83 68 04 00 00 - mov eax,[ebx+00000468] "Tutorial-i386.exe"+23AD5: B2 01 - mov dl,01 "Tutorial-i386.exe"+23AD7: 8B 8B 68 04 00 00 - mov ecx,[ebx+00000468] "Tutorial-i386.exe"+23ADD: 8B 09 - mov ecx,[ecx] "Tutorial-i386.exe"+23ADF: FF 91 20 02 00 00 - call dword ptr [ecx+00000220] "Tutorial-i386.exe"+23AE5: 8B 83 78 04 00 00 - mov eax,[ebx+00000478] "Tutorial-i386.exe"+23AEB: B2 00 - mov dl,00 "Tutorial-i386.exe"+23AED: 8B 8B 78 04 00 00 - mov ecx,[ebx+00000478] "Tutorial-i386.exe"+23AF3: 8B 09 - mov ecx,[ecx] } Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 В 20.10.2016в04:17, Garik66 сказал: В видео я gmz задал вопрос, как правильно использовать создание потока и закрывать его. Вот, если бы он ответил, то я бы доделал вызов именно функции уменьшения HP. дк там был код в той теме, он бы сработал на fasm варианте "функции" В 21.10.2016в22:11, Garik66 сказал: Скрипт: хмм можно ведь так: Скрытый текст newmem: cmp [flag],1 jne code mov [flag],0 mov eax,#1000 call 00423920 code: cmp [ebx+00000480],000003E8 ret flag: dd 1 INJECT: call newmem nop nop nop nop nop return: Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 31 минуты назад, gmz сказал: хмм можно ведь так: Да я в курсе - просто я копировал код у MasterGH и ret остался. А когда по скайпу с Trix общались, я убирал этот ret из скрипта, но у Trix всё равно вылет был. Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 21 октября, 2016 Автор Поделиться Опубликовано 21 октября, 2016 (изменено) 4 минуты назад, Garik66 сказал: Да я в курсе - просто я копировал код у MasterGH и ret остался. А когда по скайпу с Trix общались, я убирал этот ret из скрипта, но у Trix всё равно вылет был. Надо попробовать второй код, хотя тут явно в чем-то другом проблема/// Только что потестил, оба скрипта крашатся Изменено 21 октября, 2016 пользователем Trix upd Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 11 минуту назад, Trix сказал: Только что потестил, оба скрипта крашатся Ну, если Dino (или кто-нибудь ещё) потестит у себя мой скрипт и у них не будет вылета, то проблема локальная - у Вас - либо с СЕ, либо ещё с чем-то. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 (изменено) 2 часа назад, Garik66 сказал: Dino, специально для Вас видео. Посмотрите пожалуйста и проверьте скрипт у себя, если будет время. Скрипт: Показать содержимое { Game : Tutorial-i386.exe Version: Date : 2016-10-17 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) label(flag) newmem: cmp [flag],1 jne code mov [flag],0 mov eax,#1000 call 00423920 ret code: cmp [ebx+00000480],000003E8 jmp return flag: dd 1 INJECT: jmp newmem nop nop nop nop nop return: registersymbol(INJECT) [DISABLE] INJECT: db 81 BB 80 04 00 00 E8 03 00 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23AC3 "Tutorial-i386.exe"+23AB1: E8 0A 9D FE FF - call Tutorial-i386.exe+D7C0 "Tutorial-i386.exe"+23AB6: 5E - pop esi "Tutorial-i386.exe"+23AB7: 5B - pop ebx "Tutorial-i386.exe"+23AB8: C9 - leave "Tutorial-i386.exe"+23AB9: C3 - ret "Tutorial-i386.exe"+23ABA: 00 00 - add [eax],al "Tutorial-i386.exe"+23ABC: 00 00 - add [eax],al "Tutorial-i386.exe"+23ABE: 00 00 - add [eax],al "Tutorial-i386.exe"+23AC0: 53 - push ebx "Tutorial-i386.exe"+23AC1: 89 C3 - mov ebx,eax // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+23AC3: 81 BB 80 04 00 00 E8 03 00 00 - cmp [ebx+00000480],000003E8 // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+23ACD: 75 2C - jne Tutorial-i386.exe+23AFB "Tutorial-i386.exe"+23ACF: 8B 83 68 04 00 00 - mov eax,[ebx+00000468] "Tutorial-i386.exe"+23AD5: B2 01 - mov dl,01 "Tutorial-i386.exe"+23AD7: 8B 8B 68 04 00 00 - mov ecx,[ebx+00000468] "Tutorial-i386.exe"+23ADD: 8B 09 - mov ecx,[ecx] "Tutorial-i386.exe"+23ADF: FF 91 20 02 00 00 - call dword ptr [ecx+00000220] "Tutorial-i386.exe"+23AE5: 8B 83 78 04 00 00 - mov eax,[ebx+00000478] "Tutorial-i386.exe"+23AEB: B2 00 - mov dl,00 "Tutorial-i386.exe"+23AED: 8B 8B 78 04 00 00 - mov ecx,[ebx+00000478] "Tutorial-i386.exe"+23AF3: 8B 09 - mov ecx,[ecx] } Я конечно польщен что специально для меня записываются видео, только зачем вырывать фразы из контекста, не видя всю картину целиком? https://youtu.be/qNG4qiEdQTk?t=53 ты не можешь остановить поток, потому что ты его не создавал Почему у тебя не вылетает? По ряду причин, допустим ГЛ поток выбрасывает исключение, быть может @DarkByte предусмотрел такое извращение с кодом, на то он и туториал.. У @MasterGH кстати годная статья для того времени, но там не описаны важные аспекты, на чем новички и спотыкаются пытаясь реализовать подобное В общем делай как знаешь и учи людей по этим ошибкам, раз читаешь между строк. Изменено 21 октября, 2016 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 1 минуту назад, Dino сказал: ты не можешь остановить поток, потому что ты его не создавал Я не так выразился в видео, конечно я не отключаю поток, а отключаю работу инъекции. Вы проверили скрипт у себя? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 3 минуты назад, Dino сказал: В общем делай как знаешь и учи людей по этим ошибкам, раз читаешь между строк. Я ни кого не учил в том видео, посмотрите внимательно его, а просто попробовал сделать так и сработало. 4 минуты назад, Dino сказал: Почему у тебя не вылетает? По ряду причин, допустим ГЛ поток выбрасывает исключение, быть может @DarkByte предусмотрел такое извращение с кодом, на то он и туториал.. А почему тогда у Trix вылетает?. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 40 минуты назад, Garik66 сказал: Я ни кого не учил в том видео, посмотрите внимательно его, а просто попробовал сделать так и сработало. А почему тогда у Trix вылетает?. хз, такие вещи надо под отладчиком исследовать, туториал не лучший подопытный, чтобы начать разбираться Ссылка на комментарий Поделиться на другие сайты Поделиться
saiberpro Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 Только что, Dino сказал: хз, такие вещи надо под отладчиком исследовать, туториал не лучший подопытный, чтобы начать разбираться Специально обновил версию Cheat Engine с 6.4 до 6.5 и проверил работоспособность скрипта в данном посте, работоспособность 100% и без вылетов. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 октября, 2016 Поделиться Опубликовано 21 октября, 2016 Только что, saiberpro сказал: Специально обновил версию Cheat Engine с 6.4 до 6.5 и проверил работоспособность скрипта в данном посте, работоспособность 100% и без вылетов. Сенк за проверку Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 22 октября, 2016 Автор Поделиться Опубликовано 22 октября, 2016 Я так понимаю, что дело вовсе не в скрипте, а в том, как мой пк\софт интерпретирует его? Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения? Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 22 октября, 2016 Поделиться Опубликовано 22 октября, 2016 4 часа назад, Trix сказал: Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения? версия Tutorial-i386.exe должна быть 1в1, там ведь хардкорд Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 22 октября, 2016 Поделиться Опубликовано 22 октября, 2016 6 часов назад, Trix сказал: Я так понимаю, что дело вовсе не в скрипте, а в том, как мой пк\софт интерпретирует его? Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения? Какова твоя задача? Ссылка на комментарий Поделиться на другие сайты Поделиться
Trix Опубликовано 22 октября, 2016 Автор Поделиться Опубликовано 22 октября, 2016 3 часа назад, Dino сказал: Какова твоя задача? Попробовать реализовать задачу вызова любой функции в программе из стороннего приложения Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 23 октября, 2016 Поделиться Опубликовано 23 октября, 2016 В 22.10.2016в23:25, Trix сказал: Попробовать реализовать задачу вызова любой функции в программе из стороннего приложения Если из CE, то это не раз размусоливалось Скрытый текст [ENABLE] alloc(MyThread,4096) //Выделяем память для функции НАШЕГО потока(если выделим чуть больше, то ничего страшного) registersymbol(MyThread)//Создаем символ по которому сможем найти функцию НАШЕГО потока в памяти label(str) // Переменная содержащая строку CREATETHREAD(MyThread);//Создаем поток и передаем ему управление на выделенную память MyThread: /* Передаем аргументы в зависимости от типа функции , как показано ниже */ push 0x30 // arg4 push str // arg3 push str // arg2 push 0 // arg1 call MessageBoxA //вызываем __stdcall Функцию /* Если функция __cdecl , то восстановим целостность стека add ESP,X */ ret // Завершаем поток str: db 'thread success!',0 [DISABLE] //обратные действия unregistersymbol(MyThread) dealloc(MyThread) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 23 октября, 2016 Поделиться Опубликовано 23 октября, 2016 39 минуты назад, Dino сказал: Если из CE, то это не раз размусоливалось Действительно не раз ( ну к примеру я уже давно использовал, твой скрипт здесь смотреть с 12.45), но с одной оговоркой - для новичков не объяснялось какие аргументы передавать и где их взять. Вот твой скрипт с названием окошка: Скрытый текст [ENABLE] alloc(MyThread,4096) //Выделяем память для функции НАШЕГО потока(если выделим чуть больше, то ничего страшного) registersymbol(MyThread)//Создаем символ по которому сможем найти функцию НАШЕГО потока в памяти CREATETHREAD(MyThread)//Создаем поток и передаем ему управление на выделенную память MyThread: push ebp mov ebp,esp push #0 push caption // Название всплывающего окошка. push message // Текст сообщения в окошке. push #0 call MessageBoxA pop ebp ret message: db 'thread success!',0 // Текст сообщения в окошке. caption: db 'Information',0 // Название всплывающего окошка. [DISABLE] //обратные действия unregistersymbol(MyThread) dealloc(MyThread) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения