Trix

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

27 сообщений в этой теме

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

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


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


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

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

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

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

Поделиться сообщением


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

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

Изменено пользователем partoftheworlD
0

Поделиться сообщением


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

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

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

 

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

 

 

Изменено пользователем Dino
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, Dino сказал:

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

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

 

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

 

 

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минуту назад, Trix сказал:

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

да конечно

 

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

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

 

три

 

2

Поделиться сообщением


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

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

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

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, Dino сказал:

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

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

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

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

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

 

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 час назад, Garik66 сказал:

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

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

 

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

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

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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]
}

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 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:

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
31 минуты назад, gmz сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, Garik66 сказал:

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

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

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

Изменено пользователем Trix
upd
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 минуту назад, Trix сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Dino сказал:

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

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, Dino сказал:

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

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

 

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

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
40 минуты назад, Garik66 сказал:

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

 

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, Dino сказал:

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

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, saiberpro сказал:

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

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

0

Поделиться сообщением


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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Trix сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, Trix сказал:

 

 

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Dino сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 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)

 

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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

 

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас