简介
在Windows当中有一个rundll32
的程序可以运行DLL当中的导出函数, 同样根据原理在Linux平台当中,我们也可以实现相同的功能;
代码
首先下面是全部代码runso.c
:
#include<stdio.h>
#include<dlfcn.h>
#include <setjmp.h>
jmp_buf buf;
void error_code(void)
{
longjmp(buf,1);
}
typedef void(*func)();
typedef void(*func1)(void *s);
typedef void(*func2)(void *s, void *c);
typedef void(*func3)(void *s, void *c, void *m);
int main(int argc, char* argv[]){
if(argc < 3){
printf("runso file functionname\n");
return -1;
}
static void *handle = NULL;
char *file_name = argv[1];
char *function = argv[2];
handle = dlopen(file_name, RTLD_LAZY);
if(!handle){
printf("dlopen error!\n");
return 0;
}
func ptr = dlsym(handle, function);
if(!ptr){
printf("Can't find this function!\n");
return 0;
}
printf("%s address: %p\n",function, ptr);
if(setjmp(buf)==0){
ptr("1");
}
else{
if(setjmp(buf)==0){
ptr("2", "3");
}
else{
if(setjmp(buf)==0){
ptr();
}
else{
ptr("4", "5", "6");
}
}
}
return 0;
}
编译:
gcc runso.c -o runso -ldl
运行:
runso so_file_name function_name
例子
通过nm
查看so
文件的导出函数:
nm -D ./hook.so
运行导出函数puts
:
总结
基本框架是这样, 其他具体功能可以根据实际修改…