用內嵌彙編來解決執行時引數不確定的函式的呼叫問題

2021-04-13 09:09:10 字數 1033 閱讀 2182

問題的描述:

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 structparameter;

其中的value是乙個union:

typedef unionvalue;

在程式中我們定義了vectorv ,將引數按從左至右的順序push_back。然後就可以進行呼叫了:

#define push_int(var) __a**  push var

#define push_char(var) __a**  push var

#define push_float(var) __a**  push var

hinstance hdll = loadlibrary("test.dll");

if (hdll!=null)

}__a** call proc

int retval;

__a** mov  dword ptr[retval],eax}}

這樣就完成了不確定引數的函式的呼叫

TestNG執行時引數說明

從字面理解也能大概看出是什麼意思。為了方便理解,我們先來看乙個完整的xml 下面這個是我自己平時專案用到的xml thread count 10 parallel verbose 1 name test annotations jdk time out 1800000 name browser va...

執行時間超時用這個。

方法一,修改php.ini檔案 max execution time 30 maximum execution time of each script,in seconds 把它設定成需要的值就可以了。如果設定成0的話,就是永不過期。方法二,修改php執行檔案 加上 set time limit 0...

WePY根據環境變數來改變執行時的引數

wepy根據環境變數來改變執行時的引數 tencent wepy wiki gcaufy edited this page mar 15,2018 1 revision 在package.json中使用script字段,配置環境變數,可以通過不通編譯命令打包 至不同環境,如 scripts 因此,在...