如何定义一个自适应的函数指针?开3个帖,每帖给100分

boyzhang 2008-09-13 07:32:08
问题如下:

//自定义入口点
void main()
{
//取DLL句柄
char lpLibFileName[]="User32.dll";
int hModule=LoadLibraryA((int)&lpLibFileName);

//定义函数指针
int (*hProc)(int,char *,char *,int);

//问题:这里应该怎么声明为自动匹配函数呢?
//也就是声明为可以自动为所有函数匹配,以便能
//1.void (*Sleep)(int) 无返回值,有一个参数
//2.int (*GetLastError)() 有返回值,无参数
//3.int (*MessageBoxA)(int,char *,char *,int) 有返回值,有多个参数
//4.以及无返回值,无参数的情况


//取API函数句柄,并转换为本地函数
char lpProcName[]="MessageBoxA";
(FARPROC &)hProc=GetProcAddress(hModule,(int)&lpProcName);

//调用函数
hProc(0,"这是一个对话框!","提示",32);

//释放DLL
FreeLibrary(hModule);
}
...全文
42 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
boyzhang 2008-09-13
  • 打赏
  • 举报
回复
你太牛了,
本来我还打算自己用VB里的方法,注入机器码搞的,没想到被你这么容易就搞定了.

Private Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long
'---以下为Assembly部分--
'作用:将函数的参数压入堆栈

Dim lngIndex As Long, lngCodeStart As Long

'程序起始位址必须是16的倍数
'VarPtr函数是用来取得变量的地址
lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 1

m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) '程序开始的元素的位置

'前面部分以中断点添满
For lngIndex = 0 To m_opIndex - 1
m_OpCode(lngIndex) = &HCC 'int 3
Next lngIndex

'--------以下开始放入所需的程序----------

'将参数push到堆栈
'由于是STDCall CALL 参数由最后一个开始放到堆栈
For lngIndex = UBound(arrParams) To 0 Step -1
AddByteToCode &H68 'push的机器码为H68
AddLongToCode CLng(arrParams(lngIndex)) '参数地址
Next lngIndex

'call hProc
AddByteToCode &HE8 'call的机器码为HE8
AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 '函数地址 用call的定址

'-----------结束所需的程序--------------

'返回呼叫函数
AddByteToCode &HC2 'ret 10h
AddByteToCode &H10
AddByteToCode &H0

GetCodeStart = lngCodeStart
End Function



不说了,结帐.
zhoujianhei 2008-09-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhoujianhei/archive/2008/09/13/2921938.aspx
boyzhang 2008-09-13
  • 打赏
  • 举报
回复
该成这样倒是编译成功了,可是调用的时侯又会出错.
那位大虾指点一下吧!谢谢了.


//自定义入口点
void main()
{
//取DLL句柄
char lpLibFileName[]="User32.dll";
int hModule=LoadLibraryA((int)&lpLibFileName);

//定义函数指针
void* (*hProc)(void*,void*,void*,void*);

//问题:这里应该怎么声明为自动匹配函数呢?
//也就是声明为可以自动为所有函数匹配,以便能
//1.void (*Sleep)(int) 无返回值,有一个参数
//2.int (*GetLastError)() 有返回值,无参数
//3.int (*MessageBoxA)(int,char *,char *,int) 有返回值,有多个参数
//4.以及无返回值,无参数的情况


//取API函数句柄,并转换为本地函数
char lpProcName[]="MessageBoxA";
(FARPROC &)hProc=GetProcAddress(hModule,(int)&lpProcName);

//调用函数
hProc(0,(char*)"这是一个对话框!",(char*)"提示",32);

//释放DLL
FreeLibrary(hModule);
}

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧