Tesla.Angela 发表于 2010-7-23 20:54:54

[原创]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就是这样实现的。

Tesla.Angela 发表于 2010-7-23 20:59:43

当然,上面代码实现的“动态调用”是有缺陷的:每个参数都必须占四个字节,不能多也不能少。

阿杰 发表于 2010-7-23 22:18:19

对汇编不懂,楼主是否可以指点一二

Tesla.Angela 发表于 2010-7-23 22:24:55

回复 3# 阿杰


1.push 参数(有多少个参数就push多少次)
2.call 函数地址
3.mov 变量,eax(eax又称返回值寄存器)

这只是调用__stdcall约定的函数的方式,对于调用__fastcall约定的函数又有不同。

Tesla.Angela 发表于 2010-7-23 22:25:53

如果想学汇编,可以看看王爽的书(大学教材)。

a2010xxb 发表于 2010-9-18 15:14:00

这样写有啥意义?

woshewuaa 发表于 2011-11-1 01:22:31

mark

testid 发表于 2011-11-1 08:30:25

好东西啊!

zzhgb 发表于 2011-11-1 12:46:16

vb能调用吗
页: [1]
查看完整版本: [原创]VC2008内嵌ASM动态调用API