HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 02.02.2024, 10:56
_chapman_
Новичок
Регистрация: 02.02.2024
Сообщений: 4
С нами: 1202063

Репутация: 1
По умолчанию

Всех приветствую.

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

Но, какую бы я функцию не пробовал хукать, итог один - краш. Сидеть рандомно искать ошибку я не хотел, поэтому написал простенький краш хандлер:

C++:





Код:
void
crash_handler
(
int
signum
,
siginfo_t
*
info
,
void
*
contextPtr
)
{
ucontext
*
context
=
(
ucontext_t
*
)
contextPtr
;
if
(
info
->
si_signo
==
SIGSEGV
)
{
uintptr_t pc
,
lr
;
#if defined(__arm__)
pc
=
context
->
uc_mcontext
.
arm_pc
;
lr
=
context
->
uc_mcontext
.
arm_lr
;
#endif
__android_log_print
(
ANDROID_LOG_ERROR
,
"CrashHandler"
,
"Segmentation fault at address 0x%x, return address: 0x%x"
,
pc
,
lr
)
;
exit
(
EXIT_FAILURE
)
;
}
}
__attribute__
(
(
constructor
)
)
void
lib_main
(
)
{
struct
sigaction
act
;
act
.
sa_sigaction
=
crash_handler
;
sigemptyset
(
&
act
.
sa_mask
)
;
act
.
sa_flags
=
SA_SIGINFO
;
sigaction
(
SIGSEGV
,
&
act
,
0
)
;
}


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

Тогда в голову пришла идея - что, если хандлер резервируется процессом игры и из-за этого мой хандлер не получает информации?

Чтобы проверить догадку, понадобилось секунд 10, и вот оно:

C++:





Код:
unsigned
int
__fastcall
INT123_catchsignal
(
int
a1
,
int
a2
)
{
int
v3
;
// r1
unsigned
int
result
;
// r0
unsigned
int
v5
;
// [sp+4h] [bp-2Ch] BYREF
int
v6
;
// [sp+14h] [bp-1Ch] BYREF
_DWORD v7
[
3
]
;
// [sp+18h] [bp-18h] BYREF
v6
=
a2
;
sigemptyset
(
(
sigset_t
*
)
v7
)
;
v7
[
1
]
=
0
;
v3
=
sigaction
(
a1
,
(
const
struct
sigaction
*
)
&
v6
,
(
struct
sigaction
*
)
&
v5
)
;
result
=
v5
;
if
(
v3
==
-
0x1
)
return
-
0x1
;
return
result
;
}


Тогда я подумал, что если при старте попробовать загрузить туда свою структуру? В принципе, может сработать, так что почему бы и нет?

C++:





Код:
void
install_crash_handler
(
)
;
void
SetupHooks
(
)
{
do
{
sleep
(
1
)
;
}
while
(
!
findLibrary
(
targetLibName
)
)
;
LOG
(
ANDROID_LOG_INFO
,
format_char
(
"Target lib address is 0x%X"
,
findLibrary
(
targetLibName
)
)
.
get
(
)
)
;
install_crash_handler
(
)
;
}
void
install_crash_handler
(
)
{
struct
sigaction
sa
;
sigemptyset
(
&
sa
.
sa_mask
)
;
sa
.
sa_flags
=
SA_SIGINFO
;
sa
.
sa_sigaction
=
crash_handler
;
int
result
=
(
(
int
(
*
)
(
int
code
,
int
func
)
)
getAbsoluteAddress
(
targetLibName
,
0x391604
)
)
(
14
,
(
int
)
&
sa
)
;
__android_log_print
(
ANDROID_LOG_INFO
,
"CrashHandler"
,
"Install crash handler func returned %d."
,
result
)
;
}


Однако, чуда не произошло, на этот раз я получил краш при попытке вызова функции INT123_catchsignal.

Подскажите, пожалуйста, в чем моя ошибка?
 
Ответить с цитированием

  #2  
Старый 02.02.2024, 12:02
mhertz
Участник форума
Регистрация: 21.02.2020
Сообщений: 148
С нами: 3278520

Репутация: 168
По умолчанию

Цитата:
Сообщение от _chapman_  

Всех приветствую.
На днях пришла идея пореверсить один известный CRMP-мобайл проект, чем я собственно и занялся.
Но, какую бы я функцию не пробовал хукать, итог один - краш. Сидеть рандомно искать ошибку я не хотел, поэтому написал простенький краш хандлер:

C++:





Код:
void
crash_handler
(
int
signum
,
siginfo_t
*
info
,
void
*
contextPtr
)
{
ucontext
*
context
=
(
ucontext_t
*
)
contextPtr
;
if
(
info
->
si_signo
==
SIGSEGV
)
{
uintptr_t pc
,
lr
;
#if defined(__arm__)
pc
=
context
->
uc_mcontext
.
arm_pc
;
lr
=
context
->
uc_mcontext
.
arm_lr
;
#endif
__android_log_print
(
ANDROID_LOG_ERROR
,
"CrashHandler"
,
"Segmentation fault at address 0x%x, return address: 0x%x"
,
pc
,
lr
)
;
exit
(
EXIT_FAILURE
)
;
}
}
__attribute__
(
(
constructor
)
)
void
lib_main
(
)
{
struct
sigaction
act
;
act
.
sa_sigaction
=
crash_handler
;
sigemptyset
(
&
act
.
sa_mask
)
;
act
.
sa_flags
=
SA_SIGINFO
;
sigaction
(
SIGSEGV
,
&
act
,
0
)
;
}


Однако, к большому сожалению, код не завелся, хотя на предыдущих приложениях, что я реверсил, все было четко.
Тогда в голову пришла идея - что, если хандлер резервируется процессом игры и из-за этого мой хандлер не получает информации?
Чтобы проверить догадку, понадобилось секунд 10, и вот оно:

C++:





Код:
unsigned
int
__fastcall
INT123_catchsignal
(
int
a1
,
int
a2
)
{
int
v3
;
// r1
unsigned
int
result
;
// r0
unsigned
int
v5
;
// [sp+4h] [bp-2Ch] BYREF
int
v6
;
// [sp+14h] [bp-1Ch] BYREF
_DWORD v7
[
3
]
;
// [sp+18h] [bp-18h] BYREF
v6
=
a2
;
sigemptyset
(
(
sigset_t
*
)
v7
)
;
v7
[
1
]
=
0
;
v3
=
sigaction
(
a1
,
(
const
struct
sigaction
*
)
&
v6
,
(
struct
sigaction
*
)
&
v5
)
;
result
=
v5
;
if
(
v3
==
-
0x1
)
return
-
0x1
;
return
result
;
}


Тогда я подумал, что если при старте попробовать загрузить туда свою структуру? В принципе, может сработать, так что почему бы и нет?

C++:





Код:
void
install_crash_handler
(
)
;
void
SetupHooks
(
)
{
do
{
sleep
(
1
)
;
}
while
(
!
findLibrary
(
targetLibName
)
)
;
LOG
(
ANDROID_LOG_INFO
,
format_char
(
"Target lib address is 0x%X"
,
findLibrary
(
targetLibName
)
)
.
get
(
)
)
;
install_crash_handler
(
)
;
}
void
install_crash_handler
(
)
{
struct
sigaction
sa
;
sigemptyset
(
&
sa
.
sa_mask
)
;
sa
.
sa_flags
=
SA_SIGINFO
;
sa
.
sa_sigaction
=
crash_handler
;
int
result
=
(
(
int
(
*
)
(
int
code
,
int
func
)
)
getAbsoluteAddress
(
targetLibName
,
0x391604
)
)
(
14
,
(
int
)
&
sa
)
;
__android_log_print
(
ANDROID_LOG_INFO
,
"CrashHandler"
,
"Install crash handler func returned %d."
,
result
)
;
}


Однако, чуда не произошло, на этот раз я получил краш при попытке вызова функции INT123_catchsignal.
Подскажите, пожалуйста, в чем моя ошибка?
для начала узнай о разнице между thumb и arm (из-за чего тут скорее всего и происходит краш), а потом и пиши свои шедеврочиты
 
Ответить с цитированием

  #3  
Старый 02.02.2024, 12:07
_chapman_
Новичок
Регистрация: 02.02.2024
Сообщений: 4
С нами: 1202063

Репутация: 1
По умолчанию

Цитата:
Сообщение от mhertz  

для начала узнай о разнице между thumb и arm (из-за чего тут скорее всего и происходит краш), а потом и пиши свои шедеврочиты
thumb - 16-и битный набор инструкций, может выполняться на некоторых процессорах arm

arm - 32-ух битный набор инструкций, предоставляет полный набор возможностей ARM. Однако, я не совсем понимаю, чем оно мне поможет. Не просвятишь?)

Дополнение:

Решил поэксперементировать и хукнуть функцию INT123_catchsignal.

C++:





Код:
int
handler
(
int
signal
,
int
*
structure
)
{
__android_log_print
(
ANDROID_LOG_INFO
,
"[SIGNAL]"
,
"Installing handler...."
)
;
// return o_handler(signal, structure);
sigemptyset
(
0
)
;
__android_log_print
(
ANDROID_LOG_INFO
,
"[SIGNAL]"
,
"Calling sigaction...."
)
;
int
v3
=
sigaction
(
signal
,
(
const
struct
sigaction
*
)
&
structure
,
0
)
;
int
result
=
0
;
if
(
v3
==
-
0x1
)
return
-
0x1
;
return
result
;
}


Результат меня удивил: все заработало. Просвятите, пожалуйста, почему) По сути, код в хуке и изначальный код идентичны, но первый работает, а второй - нет. А еще, краш хандлер так и не заработал может, есть альтернативные варианты по его установке?
 
Ответить с цитированием

  #4  
Старый 02.02.2024, 21:21
mhertz
Участник форума
Регистрация: 21.02.2020
Сообщений: 148
С нами: 3278520

Репутация: 168
По умолчанию

Цитата:
Сообщение от _chapman_  

thumb - 16-и битный набор инструкций, может выполняться на некоторых процессорах arm
arm - 32-ух битный набор инструкций, предоставляет полный набор возможностей ARM. Однако, я не совсем понимаю, чем оно мне поможет. Не просвятишь?)

Дополнение:
Решил поэксперементировать и хукнуть функцию INT123_catchsignal.

C++:





Код:
int
handler
(
int
signal
,
int
*
structure
)
{
__android_log_print
(
ANDROID_LOG_INFO
,
"[SIGNAL]"
,
"Installing handler...."
)
;
// return o_handler(signal, structure);
sigemptyset
(
0
)
;
__android_log_print
(
ANDROID_LOG_INFO
,
"[SIGNAL]"
,
"Calling sigaction...."
)
;
int
v3
=
sigaction
(
signal
,
(
const
struct
sigaction
*
)
&
structure
,
0
)
;
int
result
=
0
;
if
(
v3
==
-
0x1
)
return
-
0x1
;
return
result
;
}


Результат меня удивил: все заработало. Просвятите, пожалуйста, почему) По сути, код в хуке и изначальный код идентичны, но первый работает, а второй - нет. А еще, краш хандлер так и не заработал может, есть альтернативные варианты по его установке?
все проблемы у тебя из-за того, что ты вызываешь функции в режиме arm (что видно по тому, что твои адреса чётные), их нужно вызывать в режиме thumb, если он используется ( т.е. делать их нечётными добавлением единицы (+ 1), или ты думал, зачем все самп клиенты это делают?) )

а на счёт твоего крашхандлера - он обрабатывает только SIGSEGV, хотя в данном случае скорее всего будет SIGILL (т.е. недействительня инструкция), и поэтому ты ничего не видишь

ну и ещё можешь не скрывать, что это блек кака, это и так очевидно
 
Ответить с цитированием

  #5  
Старый 02.02.2024, 22:34
_chapman_
Новичок
Регистрация: 02.02.2024
Сообщений: 4
С нами: 1202063

Репутация: 1
По умолчанию

Цитата:
Сообщение от mhertz  

все проблемы у тебя из-за того, что ты вызываешь функции в режиме arm (что видно по тому, что твои адреса чётные), их нужно вызывать в режиме thumb, если он используется ( т.е. делать их нечётными добавлением единицы (+ 1), или ты думал, зачем все самп клиенты это делают?) )

а на счёт твоего крашхандлера - он обрабатывает только SIGSEGV, хотя в данном случае скорее всего будет SIGILL (т.е. недействительня инструкция), и поэтому ты ничего не видишь

ну и ещё можешь не скрывать, что это блек кака, это и так очевидно
спасибо большое за информацию =)

а на счет "не скрывать" - я не скрываю) просто не видел смысла упоминать

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

  #6  
Старый 02.02.2024, 23:43
mhertz
Участник форума
Регистрация: 21.02.2020
Сообщений: 148
С нами: 3278520

Репутация: 168
По умолчанию

Цитата:
Сообщение от _chapman_  

спасибо большое за информацию =)
а на счет "не скрывать" - я не скрываю) просто не видел смысла упоминать
можешь, пожалуйста, сказать, как определить, как определить, где thumb, а где - нет? ну, или литературу на эту тему скинуть, было бы интересно почитать
в иде сразу видно по инструкциям - все 4-х байтные - arm, есть двухбайтные - тамб
 
Ответить с цитированием

  #7  
Старый 02.02.2024, 23:57
_chapman_
Новичок
Регистрация: 02.02.2024
Сообщений: 4
С нами: 1202063

Репутация: 1
По умолчанию

Цитата:
Сообщение от mhertz  

в иде сразу видно по инструкциям - все 4-х байтные - arm, есть двухбайтные - тамб
спасибо =)
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.