用内嵌汇编来解决运行时参数不确定的函数的调用问题

原创 2007年09月12日 02:04:00
 

问题的描述:
1.有一个test.dll库,其中有一些函数,但是我们并不知道其中的函数名和参数表;
2.当我们的程序在运行时会得到需要调用的函数名和其参数表,我们用这些信息来调用test.dll中相应的函数。
比如在运行时获得了调用 int Add(int i,intj)函数的命令,我们需要首先装载dll文件,然后查找相应的函数是否存在,如果存在则获得函数的入口地址并希望通过函数指针调用该函数。问题产生了:在编译时我们并不清楚被调用的函数的返回值和参数表,我们如何定义这个函数指针呢?
用汇编代码直接把参数push到堆栈中,然后再调用函数,最后恢复堆栈,这样就能解决这些问题了,具体的实现方法如下:
我们调用函数的方式是__stdcall,在调用函数时是以从右至左的顺序将参数依次压栈,与C/C++默认的__cdecl方式不同,__stdcall在函数返回时会自动恢复堆栈,而__cdecl需要显式的恢复堆栈;__stdcall函数如有返回值,则会把值保存在寄存器eax中。
我们获得了函数名_Add@8存储在字符串变量procName中;参数从左至右为int型的i,int型的j;返回值为int
首先定义一个参数的结构体:
 typedef struct{
  int tag;//代表参数的类型;其中1为int,2为char,3为float
  value val;
 }parameter;
其中的value是一个union:
 typedef union{
  int intVal;
  char chVal;
  float fltVal;
 }value;


在程序中我们定义了vector<parameter> v ,将参数按从左至右的顺序push_back。然后就可以进行调用了:
#define PUSH_INT(var) __asm  push var
#define PUSH_CHAR(var) __asm  push var
#define PUSH_FLOAT(var) __asm  push var
 


 HINSTANCE hdll = LoadLibrary("Test.dll");
 if (hdll!=NULL)
 {
  FARPROC proc = (FARPROC)GetProcAddress(hdll,procName);
  if(proc != NULL)
  {
   for(int i=v.size()-1;i>=0;i-)
   {
    parameter p = v.at(i);
    switch(p.tag){
     case 1:
      PUSH_INT(p.val.intVal)
      break;
     case 2:
      PUSH_CHAR(p.val.chVal)
     case 3:
      PUSH_FLOAT(p.val.fltVal)
      break;
    }
   }
   __asm call proc
   int retVal;
   __asm mov  dword ptr[retVal],eax
  }
 
 }

这样就完成了不确定参数的函数的调用

用内嵌汇编来解决运行时参数不确定的函数的调用问题

问题的描述:1.有一个test.dll库,其中有一些函数,但是我们并不知道其中的函数名和参数表;2.当我们的程序在运行时会得到需要调用的函数名和其参数表,我们用这些信息来调用test.dll中相应的函...
  • qsdnet
  • qsdnet
  • 2007年02月28日 10:25
  • 511

函数参数的获取:嵌入汇编的方法

函数参数的获取:嵌入汇编的方法 通常我们能够想到的函数参数有两种,一种是显示的定长参数,还有就是变长,这两种方式都有各自的捞取参数的方法,但是如果是定长参数却没有参数名该怎么办呢,这节我们就是要讨论一...
  • liaoyoujinb
  • liaoyoujinb
  • 2014年08月19日 17:46
  • 1024

JavaScript中函数的arguments对象(不确定函数参数)

在JavaScript中使用函数的时候,如果出现不确定传参的数量,可以使用arguments对象进行处理,其中arguments对象的length属性可以得到传递进来的参数。     下面看一个例子:...
  • loster_Li
  • loster_Li
  • 2016年11月14日 17:10
  • 879

C 不确定参数个数的函数的实现

某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()等。 那么它们是怎样实现的呢? C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造...
  • w00w12l
  • w00w12l
  • 2014年01月02日 20:41
  • 4220

用 wait-notify 写一段代码来解决生产者-消费者问题?

一、生产者代码: package com.edu.chapter03.test; import java.util.Vector; import java.util.logging.Level; i...
  • aishangyutian12
  • aishangyutian12
  • 2016年12月13日 15:48
  • 947

C语言中函数参数不确定的情况

C语言中函数参数不确定情况 声明 double average(double v1, double v2, ...); 使用宏va_start():va_start 接受两个参数,第一个参数va_li...
  • qq_25367755
  • qq_25367755
  • 2016年03月21日 14:58
  • 775

在SQL中对不确定参数问题的解决方案

一般来说,对于拥有数据类型为字符串类型的列的表,当知道最多使用N个参数,而每次使用其中的某m(MSQL语句的写法:Select       *From        TableWhere      I...
  • proglovercn
  • proglovercn
  • 2007年01月19日 10:25
  • 1009

C++省略号类型和参数个数不确定函数参数范例

今天想写个宏定义,发现宏定义里也可以写不定参数,但是我的宏最终没有用。 因为我觉得写完,这个不定参数给我带来的麻烦,比好处好想多。 因此我就定义了两个宏,用一个宏定义另一个。 把今天这个c++的类...
  • cartzhang
  • cartzhang
  • 2015年03月11日 20:08
  • 2678

面试题:用 wait-notify 写一段代码来解决生产者-消费者问题

public class ProductTest { public static void main(String[] args) { Clerk clerk ...
  • jyxmust
  • jyxmust
  • 2017年02月24日 10:31
  • 2249

对于参数个数不确定的方法简介

java中提供了一种对于方法的参数不确定的情况下使用的方式。 比如说,当使用max(int a, int b)方法的时候,可以判断两个参数的大小,但当我们想要比较三个数的大小的时候就要重新编写max...
  • kejizuiqianfang
  • kejizuiqianfang
  • 2017年03月05日 10:16
  • 705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用内嵌汇编来解决运行时参数不确定的函数的调用问题
举报原因:
原因补充:

(最多只允许输入30个字)