欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
如何獲知DLL中函數的參數

查看dll接口的函數與參數  

2012-04-17 22:36:36|  分類(lèi): VC++|字號 訂閱

如何獲知DLL中函數的參數--轉貼自CSDN(BCB)   
這篇文章是轉貼的,不要問(wèn)我具體的實(shí)現方法。   
可以通過(guò)反匯編來(lái)知道接口函數的參數,建議使用W32DSM來(lái)分析,也可以直接使用VC來(lái)分析,就是麻煩一點(diǎn)。   
現在使用W32DSM來(lái)具體說(shuō)明:   
1。先打開(kāi)需要分析的DLL,然后通過(guò)菜單功能-》出口來(lái)找到需要分析的函數,雙擊就可以了。   
它可以直接定位到該函數。   
2??礈试摵瘮档娜肟?,一般函數是以以下代碼作為入口點(diǎn)的。   
push   ebp   
mov   ebp,   esp   
...   
3。然后往下找到該函數的出口,一般函數出口有以下語(yǔ)句。   
...   
ret   xxxx;//其中xxxx就是函數差數的所有的字節數,為4的倍數,xxxx除以4得到的結果   
就是參數的個(gè)數。   
其中參數存放的地方:   
ebp+08   //第一個(gè)參數   
ebp+0C   //第二個(gè)參數   
ebp+10   //第三個(gè)參數   
ebp+14   //第四個(gè)參數   
ebp+18   //第五個(gè)參數   
ebp+1C   //第六個(gè)參數   
。。。。   
-------------------------------------------   
還有一種經(jīng)??吹降恼{用方式:   
sub   esp,xxxx   //開(kāi)頭部分   
//函數的內容   
。。。   
//函數的內容   
add   esp,xxxx   
ret   //結尾部分   
其中xxxx/4的結果也是參數的個(gè)數。   
-------------------------------------------------   
還有一種調用方式:   
有于該函數比較簡(jiǎn)單,沒(méi)有參數的壓棧過(guò)程,   
里面的   
esp+04就是第一個(gè)參數   
esp+08就是第二個(gè)參數   
。。。   
esp+xx就是第xx/4個(gè)參數   
你說(shuō)看到的xx的最大數除以4后的結果,就是該函數所傳遞的參數的個(gè)數。   
----------------------------------------------   
到現在位置,你應該能很清楚的看到了傳遞的參數的個(gè)數。至于傳遞的是些什么內容,還需要進(jìn)一步的分析。   
最方便的辦法就是先找到是什么軟件在調用此函數,然后通過(guò)調試的技術(shù),找到該函數被調用的地方。一般都是PUSH指令   
來(lái)實(shí)現參數的傳遞的。這時(shí)可以看一下具體是什么東西被壓入堆棧了,一般來(lái)說(shuō),如果參數是整數,一看就可以知道了,   
如果是字符串的話(huà)也是比較簡(jiǎn)單的,只要到那個(gè)地址上面去看一下就可以了。   
如果傳遞的結構的話(huà),沒(méi)有很方便的辦法解決,就是讀懂該匯編就可以了。對于以上的分析,本人只其到了拋磚引玉,   
希望對大家有點(diǎn)用處。   
昨天已經(jīng)簡(jiǎn)單的告訴大家,怎么知道接口的參數個(gè)數了,以及簡(jiǎn)單的接口。由于編譯器的優(yōu)化原因,   
可能有的參數沒(méi)有我前面說(shuō)的那么簡(jiǎn)單,今天就讓我再來(lái)分析一下的DLL的調用的接口。如果在該DLL的   
某個(gè)函數中,有關(guān)于A(yíng)PI調用的話(huà),并且調用API的參數整好有一個(gè)或多個(gè)是該DLL函數的參數的話(huà)。   
那么就可以很容易的知道該DLL函數的參數了。   
舉例說(shuō)明:以下匯編代碼通過(guò)W32DSM得到。   
Exported   fn():   myTestFunction   -   Ord:0001h   
:10001010   8B442410   mov   eax,   dword   ptr   [esp+10]   
:10001014   56   push   esi   
:10001015   8B74240C   mov   esi,   dword   ptr   [esp+0C]   
:10001019   0FAF742410   imul   esi,   dword   ptr   [esp+10]   
:1000101E   85C0   test   eax,   eax   
:10001020   7414   je   10001036   
:10001022   8B442418   mov   eax,   dword   ptr   [esp+18]   
:10001026   8B4C2408   mov   ecx,   dword   ptr   [esp+08]   
:1000102A   6A63   push   00000000   
:1000102C   50   push   eax   
:1000102D   51   push   ecx   
:1000102E   6A00   push   00000000   
*   Reference   To:   USER32.MessageBoxA,   Ord:01BEh   
|   
:10001030   FF15B0400010   Call   dword   ptr   [100040B0]   
*   Referenced   by   a   (U)nconditional   or   (C)onditional   Jump   at   Address:   
|:10001020(C)   
|   
:10001036   8BC6   mov   eax,   esi   
:10001038   5E   pop   esi   
:10001039   C3   ret   
-------------------------------------------------------   
其中myTestFunction是需要分析的函數,它的里面調用了USER32.MessageBoxA   
這個(gè)函數計算參數個(gè)數的時(shí)候要注意了,它不是0X18/4的結果,原因是程序入口   
的第二條語(yǔ)句又PUSH了一下,PUSH之前的ESP+10就是第4個(gè)參數,就是0x10/4   =4   
PUSH之后的語(yǔ)句ESP+   XX,   
其中(XX-4)/4才對應于第幾個(gè)參數。   
ESP+0C   ==第2個(gè)參數   
ESP+10   ==第3個(gè)參數   
ESP+18   ==第5個(gè)參數   
ESP+08   ==第1個(gè)參數   
----------------------------這樣共計算出參數的個(gè)數是5個(gè),注意PUSH   esi之前與PUSH   esi之后,   
PUSH一下,ESP的值就減了4,特別需要注意的地方?。?!然后看函數的返回處RET指令,   
由于看到了RET之前給EAX賦了值,所以可以知道該函數就必定返回了一個(gè)值,大家都知道EAX的寄存器   
是4個(gè)字節的,我們就把它用long來(lái)代替好了,現在函數的基本接口已經(jīng)可以出來(lái)了,   
long   myTestFunction(long   p1,long   p2,long   p3,long   p4,long   p5);   
但是具體的參數類(lèi)型還需調整,如果該函數里面沒(méi)有用到任何一個(gè)參數的話(huà)。那么參數   
多少于參數的類(lèi)型就無(wú)所謂了。一般來(lái)說(shuō)這是不太會(huì )遇到的。那么,我們怎么去得到該函數的   
參數呢?請看下面分析:   
你有沒(méi)有看到*   Reference   To:   USER32.MessageBoxA,   Ord:01BEh這一條語(yǔ)句,   
這說(shuō)明了,在它的內部使用了WINAPI::MessageBox函數,我們先看一下它的定義:   
int   MessageBox(   
HWND   hWnd,   //   handle   of   owner   window   
LPCTSTR   lpText,   //   address   of   text   in   message   box   
LPCTSTR   lpCaption,   //   address   of   title   of   message   box   
UINT   uType   //   style   of   message   box   
);   
它有4個(gè)參數。一般我們知道調用API函數的參數是從右往左壓入堆棧的,把它的調用過(guò)程   
翻譯為偽ASM就是:   
PUSH   uType   
PUSH   lpCaption   
PUSH   lpText   
PUSH   hWnd   
CALL   MessageBox   
---------------------------------------   
我們把這個(gè)于上面的語(yǔ)句對應一下,就可以清楚的知道   
hWnd   =   NULL(0)   
lpText   =   ecx   
lpCaption   =   eax   
uType   =   MB_OK(0)   
---------------------------------   
在往上面看,   
原來(lái)   EAX   中的值是ESP+18中的內容得到了   
ECX   中的值是ESP+08中的內容得到了   
那么到現在為止就可以知道   
lpText   =   ECX   =   [ESP+08]   ==第1個(gè)參數   
lpCaption   =   EAX   =   [ESP+18]   ==第5個(gè)參數   
現在我們可以把該DLL函數接口進(jìn)一步寫(xiě)成:   
long   myTestFunction(LPCTSTR   lpText,long   p2,long   p3,long   p4,LPCTSTR   lpCaption);   
至于第3個(gè)參數ESP+10,然后找到該參數使用的地方,imul   esi,   dword   ptr   [esp+10]有這么一條指令。   
因為imul是乘法指令,我們可以肯定是把ESP+10假設位long是不會(huì )錯的,同理可以知道第2個(gè)參數esp+0C   
肯定用long也不會(huì )錯了,至于第4個(gè)參數,它只起到了一個(gè)測試的作用,   
mov   eax,   dword   ptr   [esp+10]   
test   eax,   eax   
je   10001036   
看到這個(gè)參數的用法了嗎?   
把它翻譯位C語(yǔ)言就是:   
if(p3)   
{   
//做je   10001036下面的那些指令   
}   
return   ;   
到現在為止可以把第3個(gè)參數看成是個(gè)指針了吧!就是如果p3為空就直接返回,如果不空就做其它一下事情。   
好了,到現在位置可以把正確的接口給列出來(lái)了:   
long   myTestFunction(LPCTSTR   lpText,long   n1,char   *pIsNull,long   n2,LPCTSTR   lpCaption);   
哈哈,現在成功了?。?!   
long   CryptExtOpenCER(long   p1,long   p2,LPCSTR   p3,long   p4);   
其中第3個(gè)參數可能是文件名稱(chēng),   
或者是PCERT_BLOB   
它有CERT_QUERY_OBJECT_FILE,或者是CERT_QUERY_OBJECT_BLOB來(lái)決定。   
---------------------------------------------------------------   
今天想到了一個(gè)很好的辦法,來(lái)解決參數的問(wèn)題,不過(guò)有一定難度。   
1。根據以前講的各種方法,可以很快速的知道參數的個(gè)數,假設該函數   
名稱(chēng)為MyTestFunc,參數的個(gè)數為3個(gè)。   
于是可以定義如下:   
long   MyTestFunc(long   p1,long   p2,long   p3);   
2。安裝一個(gè)HOOK(DLL)   
3。通過(guò)別的程序調用,觸發(fā)HOOK,調試到HOOK里面,就可以很清楚的知道   
調用的參數,數值。   
-------------   
此方法本人還沒(méi)有去實(shí)現,相信肯定是可以的。這樣得到的參數應該相當準確。 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VC實(shí)現DLL劫持
【學(xué)習制作QQ外掛方法及原理】超詳細 - QQ技術(shù)交流 - 綠色兵團 - 創(chuàng )造一個(gè)綠色,寧...
【轉自看雪】解密市面上考試軟件系列所有題庫 + 編寫(xiě)自己的考試軟件 + [求職]
DLL中調用約定和名稱(chēng)修飾(一)
函數調用方式介紹
函數調用約定和堆棧
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久