在C中快速修改函数调用的方法

时间:2017-02-16 20:12:07

标签: c assembly stack

我有一个用C编写的现有代码库。我想要实现的是在运行时更改函数调用顺序。例如,假设func_A调用func_B。我想要的是,基于某些条件,每当调用func_B时,我们应该执行func_C而不是执行func_中的代码。

%_Host@User> ./hash.pl
$VAR1 = {
          'KeyLL1' => {
                        'KeyLLL2' => [
                                       2,
                                       3
                                     ],
                        'KeyLLL1' => [
                                       1,
                                       2
                                     ]
                      },
          'KeyLL2' => {
                        'KeyLLL2' => [
                                       2,
                                       3
                                     ],
                        'KeyLLL1' => [
                                       1,
                                       2
                                     ]
                      },
          'KeyLL3' => {
                        'KeyLLL2' => [
                                       2,
                                       3
                                     ],
                        'KeyLLL1' => [
                                       1,
                                       2
                                     ]
                      }
        };
$VAR1 = {
          'KeyLLL2' => [
                         2,
                         3
                       ],
          'KeyLLL1' => [
                         1,
                         2
                       ]
        };
$VAR1 = [
          1,
          2
        ];
%_Host@User>

有没有办法通过执行一些程序执行/堆栈操作来实现C语言?我也不介意编写汇编代码。目标是我不应该改变func_A,func_B和func_C

2 个答案:

答案 0 :(得分:0)

A"快速"方法是使用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);
    }
}

答案 1 :(得分: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

这很快捷。实时编辑操作码可能不会(我也希望通过实时操作码编辑来完成)。