2017-02-16 5 views
-4

У меня есть существующая кодовая база, которая написана на C. То, что я хочу достичь, - это изменить порядок вызова функции во время выполнения. Например, предположим, что func_A вызывает func_B. Я хочу, чтобы на основе некоторых условий всякий раз, когда вызывается func_B, вместо того, чтобы выполнять код внутри func_B, мы должны вместо этого выполнить func_C.Быстрый способ взлома вызовов функций в C

func_C (arg1,arg2) 
{ 
    return 1; 
} 
func_B (arg1,arg2) 
{ 
    return 0; 
} 
func_A() 
{ 
    /*The code is writen to always call func_B*/ 
    return func_B(arg1,arg2) 
} 



main() 
{ 
    int result; 
    result = func_A(); 
    //here result = 0 as expected. 
    /*Do some magic*/ 
    result = func_A() 
    //result should be 1 
} 

Есть ли способ достичь этого на языке C, выполняя некоторые действия по исполнению/стеку? Я не против писать код Ассамблеи. Цель состоит в том, что я не должен изменять func_A, func_B и func_C

+1

В вашем примере нет 'func_C', но почему бы просто не использовать указатели на функции? 'static int (* func_B_ptr) (arg1, arg2) = func_B;', замените вызовы func_B '' func_B_ptr', а затем присвойте 'func_C'' func_B_ptr'. – myaut

+0

ИСПРАВЛЕНО Имена. Я не могу использовать указатели на функции, потому что тогда мне нужно соответственно изменить func_B и func_C. Цель состоит в том, чтобы добиться этого БЕЗ изменения func_A и func_B –

+3

Если у вас есть исходный код C, измените исходный код C. Зачем вам захотеть встраиваться в сборку, если вы можете сделать это удобно с C? – PSkocik

ответ

0

«Быстрый» способ заключается в использовании if-else или switch операторов для вызова различных функций на основе некоторых условий. :)

func_A() 
{ 
    if(condition) 
    {  
     /*The code is writen to always call func_B*/ 
     return func_B(arg1,arg2); 
    } 
    else 
    { 
     /*The code is writen to always call func_C*/ 
     return func_C(arg1,arg2); 
    } 
} 
+0

Спасибо, но, как я уже говорил, цель в том, что я не должен менять func_A, func_B и func_C –

+0

@UtkarshKumar Вы не можете выполнить функцию, не вызвав ее! Существуют различные способы вызова функции. например C, через указатель функции или asm, загружая соответствующие регистры в этом отношении. Но вы должны * вызвать * функцию! И для этого вам нужно написать код, который изменит существующие определения функций – rootkea

+0

Давайте поговорим о регистрах далее ... Вы знаете какой-либо способ манипулировать регистрами, чтобы порядок звонков изменился? Есть ли способ сделать это внутри функции A? Я могу использовать __cig_profile_enter(), чтобы взломать его. –

0

Вы могли бы маршрутизировать вызовы через записываемой, глобальные функции указатели:

#include <stdio.h> 

int (*func_A)(void); 
int (*func_B)(void); 
int (*func_C)(void); 

int 
func_C_() 
{ 
    return 1; 
} 
int 
func_B_() 
{ 
    return 0; 
} 
int 
func_A_() 
{ 
    /*The code is writen to always call func_B*/ 
    return func_B(); 
} 
int (*func_A)(void) = func_A_; 
int (*func_B)(void) = func_B_; 
int (*func_C)(void) = func_C_; 


int main() 
{ 
    int result; 
    result = func_A(); 
    printf("%d\n", result); 
    //here result = 0 as expected. 
    /*Do some magic*/ 
    func_B = func_C; 

    result = func_A(); 
    printf("%d\n", result); 
    //result should be 1 
} 

https://ideone.com/Oz2JyQ

Это довольно быстро и легко. Редактирование опкодов в прямом эфире, вероятно, не будет (я тоже хотел бы, чтобы это было сделано посредством редактирования живого кода).

Смежные вопросы