我不知道你是否能libcurl中直接控制这一点。但即使你不能,也不会失去所有的希望。你的代码可以劫持curl_easy_escape来获得你想要的行为。这是一个黑客攻击,但我想你可以用它作为最后的手段。
这里有一个简单的例子,它可以从数学库中盗取double sin(double)
函数。首先,它使用的主要文件sin
:
sin_test.c:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
double x = atof(argv[1]);
printf("sin(%f) = %f\n", x, sin(x));
return 0;
}
编译该文件:gcc -o sin_test sin_test.c -lm
,并确认其工作
./sin_test 1
sin(1.000000) = 0.841471
给出现在,我们将采取这一点,尝试覆盖其行为而不更改其源代码。为此,我们定义一个共享库sin_override.so
,如下所示。与内容创建文件sin_override.c
:
#include <math.h>
#include <stdlib.h>
#define __USE_GNU
#include <dlfcn.h>
double sin(double x)
{
double (*real_sin)(double) = NULL;
if(!real_sin) real_sin = dlsym(RTLD_NEXT,"sin");
return real_sin(x)/10;
}
并与海湾合作委员会`-fPIC -shared -o sin_override.so sin_override.c -ldl编译。现在,告诉系统程序本身之前加载此共享库:
LD_PRELOAD=/full/path/to/sin_override.so ./sin_test 1
sin(1.000000) = 0.084147
答案是现在比以前小了10倍,确认我们已经覆盖了默认的罪。
在你的情况,你会被重写curl_easy_escape代替,先调用真正的curl_easy_escape,然后通过生成的字符串运行,用#替换%23,然后返回修改后的字符串。我还没有测试过libcurl,但是这样的东西应该可以工作,尽管它有点麻烦。