元始天尊 发表于 2014-8-5 22:48:39

理论科普:如何让exe输出函数之输出函数自导自演

熟悉编程的人员都会知道导出函数在dll中较为常见,然而有没有考虑过exe可以导出函数呢?
这里解决如下几个问题:
①exe如何导出函数?
②导出符号包括导出函数、导出变量和导出类,导出函数和导出变量的区别是什么?
③如果导出符号在导出时定义为const,能否在得到导入函数后修改其值?
④如何让exe使用自己导出的函数,实现自导自演?
⑤这种形式的应用场合?

解决①:
其实导出使用的语法都一样,使用预编译指令_declspec(dllexport)即可,注意导出函数要与声明时格式相同,否则无法导出!如果导出成功,可以用dumpbin或dependency等工具看到。

解决②:
导出函数其实是将函数指针位置提供给编译器,将其位置添加到导出表中,导出变量也是将变量指针位置添加到导出表,都是指针,区别仅在于函数用来调用,变量则用来读写,不过其实都是可读可写可执行的(如果没有const之类的限制)

解决③:
修改const修饰的符号值以后,程序崩溃,然而在exe中,const类型也是可以修改的,

解决④:
组合使用api函数:GetModuleHandle()和GetProcAddress()

解决⑤:
这玩意一般场合还真用不到,做法十分怪癖,我也仅在控制台应用和魔兽争霸主程序中见过这种用法。
一般来说,这种做法考虑到exe自身导出函数同时被别的dll和exe自身使用,而不是加载和使用其他dll函数,才会这么用。

代码:
#include <stdio.h>
#include <windows.h>

extern "C" _declspec(dllexport) void func();//导出函数
extern "C" _declspec(dllexport) const int val=1234;



void func()
{
        printf("Hello World!\n");
}


int main(int argc, char* argv[])
{
        HINSTANCE hcurrent=GetModuleHandle(NULL);
        FARPROC FUNC=GetProcAddress(hcurrent,"func");
        ((void(*)())FUNC)();//调用当前exe导出函数

        FARPROC VAL=GetProcAddress(hcurrent,"val");
        *FUNC=*VAL;
//        *((int*)VAL)=1;//此处如果修改,下面会崩溃

        printf("val=%d\n",*(int*)VAL);//存储的是指针
        printf("val=%d\n",*(int*)FUNC);//存储的是指针

        getchar();
        return 0;
}

0xAA55 发表于 2014-8-6 04:32:43

这种EXE性质上和DLL差不多。
页: [1]
查看完整版本: 理论科普:如何让exe输出函数之输出函数自导自演