找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9489|回复: 8

[开源] [原创]VC2008内嵌ASM动态调用API

 火.. [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-23 20:54:54 | 显示全部楼层 |阅读模式
本帖最后由 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[4];//参数数组
    char ttt[]="title",ccc[]="caption";
    RtlZeroMemory(msgbox,sizeof(msgbox));//实际上是把MessageBoxA的参数1和参数4设置为0
    msgbox[1]=(long)ccc;
    msgbox[2]=(long)ttt;
    invoke("user32.dll","MessageBoxA",4,msgbox);
}

void killprocess()
{
    long pid,hp;
    long op[3],tp[2];
    printf("input pid:");
    scanf("%ld",&pid);
    op[0]=1;
    op[1]=0;
    op[2]=pid;
    hp=invoke("kernel32.dll","OpenProcess",3,op);
    tp[0]=hp;
    tp[1]=0;
    invoke("kernel32.dll","TerminateProcess",2,tp);
}

void zwkillprocess()
{
    long pid,hp;
    long oa[6],cid[2];
    long zwop[4],zwtp[2];
    printf("input pid:");
    scanf("%ld",&pid);
    RtlZeroMemory(oa,sizeof(oa));
    RtlZeroMemory(cid,sizeof(cid));
    oa[0]=24;
    cid[0]=pid;
    zwop[0]=(long)(&hp);
    zwop[1]=1;
    zwop[2]=(long)oa;
    zwop[3]=(long)cid;
    invoke("ntdll.dll","ZwOpenProcess",4,zwop);
    zwtp[0]=hp;
    zwtp[1]=0;
    invoke("ntdll.dll","ZwTerminateProcess",2,zwtp);
}

int main()
{
    showmsgbox();
    //killprocess();
    zwkillprocess();
    return 0;
}


也许msvbvm60.dll的导出函数DllFunctionCall就是这样实现的。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-7-23 20:59:43 | 显示全部楼层
当然,上面代码实现的“动态调用”是有缺陷的:每个参数都必须占四个字节,不能多也不能少。

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-7-23 22:18:19 | 显示全部楼层
对汇编不懂,楼主是否可以指点一二
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-7-23 22:24:55 | 显示全部楼层
回复 3# 阿杰


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

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

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2010-7-23 22:25:53 | 显示全部楼层
如果想学汇编,可以看看王爽的书(大学教材)。

2

主题

17

回帖

0

精华

铜牌会员

积分
35
发表于 2010-9-18 15:14:00 | 显示全部楼层
这样写有啥意义?

0

主题

6

回帖

0

精华

初来乍到

积分
2
发表于 2011-11-1 01:22:31 | 显示全部楼层
mark

12

主题

144

回帖

0

精华

铜牌会员

积分
281
发表于 2011-11-1 08:30:25 | 显示全部楼层
好东西啊!

1

主题

26

回帖

0

精华

银牌会员

积分
329
发表于 2011-11-1 12:46:16 | 显示全部楼层
vb能调用吗
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表