2017-02-16 1 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'はありませんが、なぜ単に関数ポインタを使わないのですか? 'func_B_ptr'(arg1、arg2)= func_B;'、 'func_B'を' func_B_ptr'に置き換え、 'func_B'を' func_B_ptr'に代入します。 – myaut

+0

名前が少し修正されました。私はfunc_Bとfunc_Cをそれに応じて変更する必要があるため、関数ポインタを使用することはできません。目的はfunc_Aとfunc_Bを変更せずにこれを達成することです –

+3

Cソースコードをお持ちの場合は、Cソースコードを変更してください。なぜあなたはCから楽にそれをやることができるのですか? – PSkocik

答えて

0

を変更するべきではないということである「クイック」の方法は、いくつかの条件に基づいてさまざまな機能を呼び出すためにif-elseswitchステートメントを使用することです。 :)

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それを呼び出さずに関数を実行することはできません!関数を呼び出すにはさまざまな方法があります。例えばそのために適切なレジスタをロードすることによって、関数ポインタまたはasmを介して、C関数呼び出しを呼び出します。しかし、関数を呼び出す*必要があります!そしてそれを行うには、既存の関数定義を変更するコードを書く必要があります – 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

を。オペコードを編集することはおそらくそうではありません(ライブオペコードの編集でこれを確認したいと思います)。

関連する問題