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

Постоянный краш программ, в чем проблема?


Trix

Рекомендуемые сообщения

Ребята, всем привет. Столкнулся с такой проблемой  -  вчера делал AOB-injection, после инъекции крашится прога.

Как мне написали в урок(Позже общался с автором, у него все работает, полностью скопировал скрипт, когда уже ничего не помогало, увы, проблема не в моем написании) Разрядность видны та же, и качал ту версию CE(взламываем туториал, шаг 2ой).


Выглядит это так, за какую бы программу я не брался с подобной инъекцией все к черту крашится, логи не выдает просто окошечко "ожидается завершение программы".


Вот видео автора, который мне подсказал выполнить данную инъекцию ( Garik66 )

За это ему отдельное спасибо. Функция срабатывает(видно, как меняется значение) но потом сразу крашится прога

Кто подскажет, с чем связано и как фиксить? Спасибо!)

Изменено пользователем Trix
правка логической ошибки в построение предложения
Ссылка на комментарий
Поделиться на другие сайты

Ставь бряк на измененный участок и отлаживай до ошибки. Есть подозрение что CE просто не корректно создаёт поток. Если писать длл с изменением участка кода и созданием потока проблем нет. Проверял на dying light вызов функции выстрела, через ce краш, через длл все работало отлично.

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Ясень пень такой код будет крашить нормальную программу, видимо автор видео не понимает механизм работы call

call запихивает в стек значение регистра EIP+<длина инcтрукции call>   и выполняет весь код начиная с указанного адреса пока не дойдет до инструкцию ret. Инструкция ret извлекает из стека этот адрес, чтобы выйти из функции и продолжить выполнять последующий код. Так же почти в каждой функции есть код пролога и эпилога, а если функция еще и использует локальные переменные, то нужно выделить память на стеке, а в конце подчищать стек. А тк  @Garik66 вызывает функцию где-то с середины, то у него выполняются только последние действия чистка стека и код эпилога...

 

То есть в этом случае 100% был поврежден стек и большинство регистров

 

 

Изменено пользователем Dino
Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Dino сказал:

Ясень пень такой код будет крашить нормальную программу, видимо автор видео не понимает механизм работы call

call запихивает в стек значение регистра EIP+<длина инcтрукции call>   и выполняет весь код начиная с указанного адреса пока не дойдет до инструкцию ret. Инструкция ret извлекает из стека этот адрес, чтобы выйти из функции и продолжить выполнять последующий код. Так же почти в каждой функции есть код пролога и эпилога, а если функция еще и использует локальные переменные, то нужно выделить память на стеке, а в конце подчищать стек. А тк  @Garik66 вызывает функцию где-то с середины, то у него выполняются только последние действия чистка стека и код эпилога...

 

То есть в этом случае 100% был поврежден стек и большинство регистров

 

 

ОКей, вы можете помочь мне примеров в данном вопросе?

Ссылка на комментарий
Поделиться на другие сайты

15 минуту назад, Trix сказал:

ОКей, вы можете помочь мне примеров в данном вопросе?

да конечно

 

рас http://trubetskoy1.narod.ru/arttranslate/FuncCallPart1.html

два http://trubetskoy1.narod.ru/arttranslate/FuncCallPart2_1.html

 

три

 

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Документация выглядит внушающе доверие, благодарю)

по поводу последнего сообщения не понял " Угарнул что DB на этот счет придумал  "Select current function"... "

 

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Dino сказал:

 видимо автор видео не понимает механизм работы call

Механизм понимаю и понимаю, что вызываю не функцию, а конкретную инструкцию, просто попробовал  и у меня заработало и кстати снова попробовал - у меня вылетов нет дол сих пор.

8 часов назад, Dino сказал:

То есть в этом случае 100% был поврежден стек и большинство регистров

Ну если бы Вы внимательно посмотрели видео, то увидели из какой я инструкции (инструкции на чтение того же адреса HP) вызываю код, в ней все регистры уже имеют нужные значения для второй инструкции ( инструкции на запись HP), которую я вызываю, так что не о каких повреждениях стека и регистров говорить не приходиться.

 

В видео я gmz задал вопрос, как правильно использовать создание потока и закрывать его. Вот, если бы он ответил, то я бы доделал вызов именно функции уменьшения HP. 

Ссылка на комментарий
Поделиться на другие сайты

17 час назад, Garik66 сказал:

Механизм понимаю и понимаю, что вызываю не функцию, а конкретную инструкцию, просто попробовал  и у меня заработало и кстати снова попробовал - у меня вылетов нет дол сих пор.

Если  понимаешь, то как по твоему может выполниться только одна инструкция? Или мб он какой-то другой с твоей точки зрения?

 

И да,  я первый раз был не столь внимателен, потому что у тебя еще один косяк :D 

Все твои действия выполняются из ГЛ потока программы, ты хукаешь инструкцию, которая крутится в бесконечном в цикле, но только вот своим ret ты преждевременно выходишь из функции(которую захукал) не дав программе выполнить последующий код, в результате повреждение стека , регистров и краш. Но эта ошибка не имеет смысла потому что ты уже убил программу раннее.)

 

 

Ссылка на комментарий
Поделиться на другие сайты

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]
}

 

 

Ссылка на комментарий
Поделиться на другие сайты

В 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:

 

 

Ссылка на комментарий
Поделиться на другие сайты

31 минуты назад, gmz сказал:

хмм можно ведь так:

Да я в курсе - просто я копировал код у MasterGH и ret остался. А когда по скайпу с Trix общались, я убирал этот ret из скрипта, но у Trix всё равно вылет был.

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Garik66 сказал:

Да я в курсе - просто я копировал код у MasterGH и ret остался. А когда по скайпу с Trix общались, я убирал этот ret из скрипта, но у Trix всё равно вылет был.

Надо попробовать второй код, хотя тут явно в чем-то другом проблема///

Только что потестил, оба скрипта крашатся

Изменено пользователем Trix
upd
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, Trix сказал:

Только что потестил, оба скрипта крашатся

Ну, если  Dino (или кто-нибудь ещё) потестит у себя мой скрипт и у них не будет вылета, то проблема локальная - у Вас - либо с СЕ, либо ещё с чем-то.

Ссылка на комментарий
Поделиться на другие сайты

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 кстати годная статья для того времени, но там  не описаны важные аспекты, 
на чем новички и спотыкаются пытаясь реализовать подобное


В общем делай как знаешь и учи людей по этим ошибкам, раз читаешь между строк. 

Изменено пользователем Dino
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Dino сказал:

ты не можешь остановить поток, потому что ты его не создавал

Я не так выразился в видео, конечно я не отключаю поток, а отключаю работу инъекции.

Вы проверили скрипт у себя?

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, Dino сказал:

В общем делай как знаешь и учи людей по этим ошибкам, раз читаешь между строк. 

Я ни кого не учил в том видео, посмотрите внимательно его, а просто попробовал сделать так и сработало. 

 

4 минуты назад, Dino сказал:

Почему у тебя не вылетает? По ряду причин, допустим ГЛ поток выбрасывает исключение,
быть может @DarkByte предусмотрел такое извращение с кодом, на то он и туториал.. 

А почему тогда у Trix вылетает?.

Ссылка на комментарий
Поделиться на другие сайты

40 минуты назад, Garik66 сказал:

Я ни кого не учил в том видео, посмотрите внимательно его, а просто попробовал сделать так и сработало. 

 

А почему тогда у Trix вылетает?.

хз, такие вещи надо под отладчиком исследовать, туториал не лучший подопытный, чтобы начать разбираться

Ссылка на комментарий
Поделиться на другие сайты

Только что, Dino сказал:

хз, такие вещи надо под отладчиком исследовать, туториал не лучший подопытный, чтобы начать разбираться

Специально обновил версию Cheat Engine с 6.4 до 6.5 и проверил работоспособность скрипта в данном посте, работоспособность 100% и без вылетов.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Только что, saiberpro сказал:

Специально обновил версию Cheat Engine с 6.4 до 6.5 и проверил работоспособность скрипта в данном посте, работоспособность 100% и без вылетов.

Сенк за проверку

Ссылка на комментарий
Поделиться на другие сайты

Я так понимаю, что дело вовсе не в скрипте, а в том, как мой пк\софт интерпретирует его?
Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения?

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Trix сказал:

Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения?

версия Tutorial-i386.exe должна быть 1в1, там ведь хардкорд

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Trix сказал:

 

 

Я так понимаю, что дело вовсе не в скрипте, а в том, как мой пк\софт интерпретирует его?
Пришёл ли кто-то к финальному решению, чем баг, как его фиксить или аналогичные решения?

Какова твоя задача?

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Dino сказал:

Какова твоя задача?

Попробовать реализовать задачу вызова любой функции в программе из стороннего приложения

Ссылка на комментарий
Поделиться на другие сайты

В 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)

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

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)

 

11885176.jpg

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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