您的位置:首页 > 职场人生

让EXE导出函数

2011-09-21 15:28 387 查看
偶然发现OllyDBG.exe导出了一堆函数,这些函数都是供其插件调用的。对这种体系结构很感

兴趣,想弄清楚它的实现原理。后来又看到梁肇新的书《编程高手箴言》第278页提到的调用

门,觉得都应该差不多。

三种不同的解决办法(原理可能是一样的,:)):

1)在导出函数声明之前加上__declspec(dllexport)。例:

__declspec(dllexport) int Add(int a, int b);

__declspec(dllexport) int Sub(int a, int b);

__declspec(dllexport) int Mul(int a, int b);

__declspec(dllexport) int Div(int a, int b);

2)在链接器参数中设置。例:

#pragma comment(linker, "/EXPORT:_Add,@1,NONAME")

#pragma comment(linker, "/EXPORT:_Sub,@2,NONAME")

#pragma comment(linker, "/EXPORT:_Mul,@3,NONAME")

#pragma comment(linker, "/EXPORT:_Div,@4,NONAME")

3)添加一个def文件,例:

EXPORTS

Add @1 NONAME

Sub @2 NONAME

Mul @3 NONAME

Div @4 NONAME

另需要在链接器命令行参数中指定def文件名: /DEF:Callee.def

注意:在def文件中不要有 LIBRARY [library][BASE=address] 这样的语句。

相比较而言,后两种方法可以设置更多的参数。

函数举例:

extern "C"

{

/*这应在.h吧

__declspec(dllexport) int Add(int a, int b);

__declspec(dllexport) int Sub(int a, int b);

__declspec(dllexport) int Mul(int a, int b);

__declspec(dllexport) int Div(int a, int b);

*/

int Add(int a, int b)

{

return (a + b);

}

int Sub(int a, int b)

{

return (a - b);

}

int Mul(int a, int b)

{

return (a * b);

}

int Div(int a, int b)

{

if (b == 0)

return 0;

else

return (a / b);

}

}

编译时会自动生成相应的导出库(lib)文件,供调用者使用。

调用方法和普通的动态链接库调用一样。

调用者必须能够找到被调用者的位置,否则报错,被调用者是否运行不影响。

调用代码举例:

extern "C"

{

int Add(int a, int b);

int Sub(int a, int b);

int Mul(int a, int b);

int Div(int a, int b);

}

#pragma comment (lib, "Callee.lib")

void CCallerDlg::OnBnClickedCalculate()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);

switch (((CComboBox *)GetDlgItem(IDC_COMBO_OPERATOR))->GetCurSel())

{

case ADD:

{

m_iResult = Add(m_iNum1, m_iNum2);

break;

}

case SUB:

{

m_iResult = Sub(m_iNum1, m_iNum2);

break;

}

...

...

我在OD中跟了一下,发现这跟调用动态链接库也差不多。

不过那几个函数被映射到下面的地址处:

003810F0 > 8B4424 08 mov eax, dword ptr [esp+8]

003810F4 8B4C24 04 mov ecx, dword ptr [esp+4]

003810F8 03C1 add eax, ecx

003810FA C3 retn

003810FB CC int3

003810FC CC int3

003810FD CC int3

003810FE CC int3

003810FF CC int3

跟常规的动态链接库被映射到高地址处略有不同。

还不知道是什么原因。

结论:

EXE完全可以和DLL一样导出函数,一样被调用。

进一步的工作:

我发现这个例子跟OllyDbg.exe还是有些不同,跟“调用门”的说法也有不同。这里实际上还是

跟DLL差不多的原理。下一步争取实现一个跟OllyDbg.exe差不多的例子。

从前文可知,DLL在程序编制中可作出巨大贡献,它提供了具共性代码的复用能力。但是,正如一门高深的武学,若被掌握在正义之侠的手上,便可助其仗义江湖;但若被掌握在邪恶之徒的手上,则必然在江湖上掀起腥风血雨。DLL正是一种这样的武学。DLL一旦染上了魔性,就不再是正常的DLL程序,而是DLL***,一种恶贯满盈的病毒,令特洛伊一夜之间国破家亡。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 EXE 休闲