[原创]VC2008内嵌ASM动态调用API
本帖最后由 Tesla.Angela 于 2010-7-23 21:01 编辑现在发现,VC真是太强大了。。。
VB用了近200代码才实现的功能,用VC仅仅18代码行就实现了。。。
#include "stdafx.h"
long invoke(char *LibName, char *ApiName, long ParamCount, long Params[])
{
long i,myrt,tmp;
HMODULE hLIB=LoadLibraryA(LibName);
PVOID pAPI=GetProcAddress(hLIB,ApiName);
for(i=ParamCount-1;i>=0;i--)
{
tmp=Params;
__asm push tmp
}
__asm
{
call pAPI
mov myrt,eax
}
FreeLibrary(hLIB);
return myrt;
}
void showmsgbox()
{
long msgbox;//参数数组
char ttt[]="title",ccc[]="caption";
RtlZeroMemory(msgbox,sizeof(msgbox));//实际上是把MessageBoxA的参数1和参数4设置为0
msgbox=(long)ccc;
msgbox=(long)ttt;
invoke("user32.dll","MessageBoxA",4,msgbox);
}
void killprocess()
{
long pid,hp;
long op,tp;
printf("input pid:");
scanf("%ld",&pid);
op=1;
op=0;
op=pid;
hp=invoke("kernel32.dll","OpenProcess",3,op);
tp=hp;
tp=0;
invoke("kernel32.dll","TerminateProcess",2,tp);
}
void zwkillprocess()
{
long pid,hp;
long oa,cid;
long zwop,zwtp;
printf("input pid:");
scanf("%ld",&pid);
RtlZeroMemory(oa,sizeof(oa));
RtlZeroMemory(cid,sizeof(cid));
oa=24;
cid=pid;
zwop=(long)(&hp);
zwop=1;
zwop=(long)oa;
zwop=(long)cid;
invoke("ntdll.dll","ZwOpenProcess",4,zwop);
zwtp=hp;
zwtp=0;
invoke("ntdll.dll","ZwTerminateProcess",2,zwtp);
}
int main()
{
showmsgbox();
//killprocess();
zwkillprocess();
return 0;
}
也许msvbvm60.dll的导出函数DllFunctionCall就是这样实现的。 当然,上面代码实现的“动态调用”是有缺陷的:每个参数都必须占四个字节,不能多也不能少。 对汇编不懂,楼主是否可以指点一二 回复 3# 阿杰
1.push 参数(有多少个参数就push多少次)
2.call 函数地址
3.mov 变量,eax(eax又称返回值寄存器)
这只是调用__stdcall约定的函数的方式,对于调用__fastcall约定的函数又有不同。 如果想学汇编,可以看看王爽的书(大学教材)。 这样写有啥意义? mark 好东西啊! vb能调用吗
页:
[1]