Rundll32.exe原理及使用, 参数传递问题解决方法(可用于批处理中)
Rundll32.exe參數(shù)傳遞問(wèn)題解決方法
本人曾經(jīng)碰到一個(gè)問(wèn)題,就是按照網(wǎng)上搜索到的說(shuō)明,Rundll32的用法為:
rundll32 DllName,FunctionName [Arguments]
假設(shè)以上DLL編譯好后得到L_test1.dll,于是,我在命令行下輸入:rundll32 L_test1.dll,F1 888
可是,結(jié)果卻不是我所期望的彈出一個(gè)顯示內(nèi)容為888對(duì)話框。這是為什么呢?
?
后來(lái)本人又試了很久,還認(rèn)為網(wǎng)上所說(shuō)的格式是錯(cuò)誤的,于是還試了很多種自己亂想的格式,就像破解密碼一樣,但依然失敗,暈!
最后,我想到了MSDN,于是就有了這一篇譯文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx
?
?
#include?<afxwin.h>???
看了MSDN上的說(shuō)明,我終于明白了原因,原來(lái)導(dǎo)出函數(shù)的原型是有要求的,要像上面這樣寫的DLL才行,假設(shè)這個(gè)DLL名為L(zhǎng)_test2.dll。
?
運(yùn)行命令:rundll32 L_test2.dll,F2 888
OK!終于成功了!
?
最后還有一點(diǎn)值得一提,我并沒(méi)有完全按照MSDN上的那樣把導(dǎo)出函數(shù)的調(diào)用方式聲明為CALLBACK方式,因?yàn)槲野l(fā)現(xiàn)如果完全按照MSDN上的那種函數(shù)導(dǎo)出格式是會(huì)失敗的!
https://support.microsoft.com/en-us/kb/164787
#include?<afxwin.h>???
本人曾經(jīng)碰到一個(gè)問(wèn)題,就是按照網(wǎng)上搜索到的說(shuō)明,Rundll32的用法為:
rundll32 DllName,FunctionName [Arguments]
假設(shè)以上DLL編譯好后得到L_test1.dll,于是,我在命令行下輸入:rundll32 L_test1.dll,F1 888
可是,結(jié)果卻不是我所期望的彈出一個(gè)顯示內(nèi)容為888對(duì)話框。這是為什么呢?
?
后來(lái)本人又試了很久,還認(rèn)為網(wǎng)上所說(shuō)的格式是錯(cuò)誤的,于是還試了很多種自己亂想的格式,就像破解密碼一樣,但依然失敗,暈!
最后,我想到了MSDN,于是就有了這一篇譯文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx
?
?
#include?<afxwin.h>???
看了MSDN上的說(shuō)明,我終于明白了原因,原來(lái)導(dǎo)出函數(shù)的原型是有要求的,要像上面這樣寫的DLL才行,假設(shè)這個(gè)DLL名為L(zhǎng)_test2.dll。
?
運(yùn)行命令:rundll32 L_test2.dll,F2 888
OK!終于成功了!
?
最后還有一點(diǎn)值得一提,我并沒(méi)有完全按照MSDN上的那樣把導(dǎo)出函數(shù)的調(diào)用方式聲明為CALLBACK方式,因?yàn)槲野l(fā)現(xiàn)如果完全按照MSDN上的那種函數(shù)導(dǎo)出格式是會(huì)失敗的!
本人曾經(jīng)碰到一個(gè)問(wèn)題,就是按照網(wǎng)上搜索到的說(shuō)明,Rundll32的用法為:
rundll32 DllName,FunctionName [Arguments]
假設(shè)以上DLL編譯好后得到L_test1.dll,于是,我在命令行下輸入:rundll32 L_test1.dll,F1 888
可是,結(jié)果卻不是我所期望的彈出一個(gè)顯示內(nèi)容為888對(duì)話框。這是為什么呢?
?
后來(lái)本人又試了很久,還認(rèn)為網(wǎng)上所說(shuō)的格式是錯(cuò)誤的,于是還試了很多種自己亂想的格式,就像破解密碼一樣,但依然失敗,暈!
最后,我想到了MSDN,于是就有了這一篇譯文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx
?
?
#include?<afxwin.h>???
看了MSDN上的說(shuō)明,我終于明白了原因,原來(lái)導(dǎo)出函數(shù)的原型是有要求的,要像上面這樣寫的DLL才行,假設(shè)這個(gè)DLL名為L(zhǎng)_test2.dll。
?
運(yùn)行命令:rundll32 L_test2.dll,F2 888
OK!終于成功了!
?
最后還有一點(diǎn)值得一提,我并沒(méi)有完全按照MSDN上的那樣把導(dǎo)出函數(shù)的調(diào)用方式聲明為CALLBACK方式,因?yàn)槲野l(fā)現(xiàn)如果完全按照MSDN上的那種函數(shù)導(dǎo)出格式是會(huì)失敗的!
///
///
///
Rundll32.exe原理
本人曾經(jīng)碰到一個(gè)問(wèn)題,就是按照網(wǎng)上搜索到的說(shuō)明,Rundll32的用法為:
rundll32 DllName,FunctionName [Arguments]
假設(shè)以上DLL編譯好后得到L_test1.dll,于是,我在命令行下輸入:rundll32 L_test1.dll,F1 888
可是,結(jié)果卻不是我所期望的彈出一個(gè)顯示內(nèi)容為888對(duì)話框。這是為什么呢?
?
后來(lái)本人又試了很久,還認(rèn)為網(wǎng)上所說(shuō)的格式是錯(cuò)誤的,于是還試了很多種自己亂想的格式,就像破解密碼一樣,但依然失敗,暈!
最后,我想到了MSDN,于是就有了這一篇譯文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx
?
?
#include?<afxwin.h>???
看了MSDN上的說(shuō)明,我終于明白了原因,原來(lái)導(dǎo)出函數(shù)的原型是有要求的,要像上面這樣寫的DLL才行,假設(shè)這個(gè)DLL名為L(zhǎng)_test2.dll。
?
運(yùn)行命令:rundll32 L_test2.dll,F2 888
OK!終于成功了!
?
最后還有一點(diǎn)值得一提,我并沒(méi)有完全按照MSDN上的那樣把導(dǎo)出函數(shù)的調(diào)用方式聲明為CALLBACK方式,因?yàn)槲野l(fā)現(xiàn)如果完全按照MSDN上的那種函數(shù)導(dǎo)出格式是會(huì)失敗的!
Rundll32
這個(gè)運(yùn)行DLL的實(shí)用工具(Rundll32.exe)是包含在Windows中的,它能讓你去調(diào)用從一個(gè)32位DLL中導(dǎo)出的函數(shù)。但是那些被調(diào)用的函數(shù)必須遵循以下語(yǔ)法規(guī)則:
void CALLBACK EntryPoint(
? HWND hwnd,??????? // 父窗口的句柄
? HINSTANCE hinst,? // DLL的實(shí)例句柄
? LPTSTR lpCmdLine, // DLL將要解析的字符串
? int nCmdShow????? // 顯示狀態(tài)
);
請(qǐng)注意那個(gè)EntryPoint僅僅是一個(gè)為了表示真實(shí)函數(shù)名的一個(gè)占位符。對(duì)于一系列可能的顯示狀態(tài),請(qǐng)參見(jiàn)WinMain。
下面是Rundll32在命令行下的語(yǔ)法:
rundll32 DllName,FunctionName [Arguments]
DllName?
指定這個(gè)DLL的名字。這個(gè)名字不能包含空格,逗號(hào),或引號(hào)。這個(gè)實(shí)用工具為了LoadLibrary這個(gè)函數(shù),將會(huì)用搜索標(biāo)準(zhǔn)文件記錄的方式來(lái)搜索這個(gè)DLL。因此,對(duì)于這個(gè)DLL,最好使用短文件名并且提供一個(gè)完整路徑。
FunctionName?
指定這個(gè)在DllName中被調(diào)用的函數(shù)的名字。要求在DllName和FunctionName之間有一個(gè)逗號(hào)(不帶任何空格)。
Arguments?
對(duì)于FunctionName的可選參數(shù)。
Rundll32使用LoadLibrary來(lái)載入這個(gè)指定的DLL,使用GetProcAddress函數(shù)來(lái)獲取函數(shù)地址,然后帶著這個(gè)指定的參數(shù)(如果有這個(gè)參數(shù)的話)去調(diào)用函數(shù)。當(dāng)這個(gè)函數(shù)返回時(shí),Rundll32將卸載這個(gè)DLL并退出。
Windows NT/2000:為這個(gè)函數(shù)創(chuàng)建一個(gè)Unicode版本是可能的。Rundll32首先嘗試去查找一個(gè)命名為EntryPointW的函數(shù)。如果無(wú)法找到該函數(shù),則會(huì)接著嘗試EntryPointA,再然后是EntryPoint。為了創(chuàng)建一個(gè)在Windows 95/98/Me上支持ANSI和Unicode的DLL,需要導(dǎo)出兩個(gè)函數(shù):EntryPointW和EntryPoint。
?
---------------------------------------------------以下是原文---------------------------------------------------
?
Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:
void CALLBACK EntryPoint(
? HWND hwnd,??????? // handle to owner window
? HINSTANCE hinst,? // instance handle for the DLL
? LPTSTR lpCmdLine, // string the DLL will parse
? int nCmdShow????? // show state
);
Note that EntryPoint is a placeholder for the actual function name. For a list of possible show states, see WinMain.
The following is the command-line syntax for Rundll32:
rundll32 DllName,FunctionName [Arguments]
DllName?
Specifies the name of the DLL. The name cannot contain spaces, commas, or quotation marks. The utility searches for the DLL using the search criteria documented for the LoadLibrary function. Therefore, it is best to use the short name and provide a full path for the DLL.?
FunctionName?
Specifies the name of the function to call in DllName. Requires a comma (without no spaces) between DllName and FunctionName.?
Arguments?
Optional arguments for FunctionName.?
Rundll32 loads the specified DLL using LoadLibrary, obtains the address of the function using the GetProcAddress function, and calls the function with the specified arguments, if any. When the function returns, Rundll32 unloads the DLL and exits.
Windows NT/2000: It is possible to create a Unicode version of the function. Rundll32 first tries to find a function named EntryPointW. If it cannot find this function, it tries EntryPointA, then EntryPoint. To create a DLL that supports ANSI on Windows 95/98/Me and Unicode otherwise, export two functions: EntryPointW and EntryPoint.
#include?<afxwin.h>???
本人曾經(jīng)碰到一個(gè)問(wèn)題,就是按照網(wǎng)上搜索到的說(shuō)明,Rundll32的用法為:
rundll32 DllName,FunctionName [Arguments]
假設(shè)以上DLL編譯好后得到L_test1.dll,于是,我在命令行下輸入:rundll32 L_test1.dll,F1 888
可是,結(jié)果卻不是我所期望的彈出一個(gè)顯示內(nèi)容為888對(duì)話框。這是為什么呢?
?
后來(lái)本人又試了很久,還認(rèn)為網(wǎng)上所說(shuō)的格式是錯(cuò)誤的,于是還試了很多種自己亂想的格式,就像破解密碼一樣,但依然失敗,暈!
最后,我想到了MSDN,于是就有了這一篇譯文:http://blog.csdn.net/leng_que/archive/2009/10/07/4639073.aspx
?
?
#include?<afxwin.h>???
看了MSDN上的說(shuō)明,我終于明白了原因,原來(lái)導(dǎo)出函數(shù)的原型是有要求的,要像上面這樣寫的DLL才行,假設(shè)這個(gè)DLL名為L(zhǎng)_test2.dll。
?
運(yùn)行命令:rundll32 L_test2.dll,F2 888
OK!終于成功了!
?
最后還有一點(diǎn)值得一提,我并沒(méi)有完全按照MSDN上的那樣把導(dǎo)出函數(shù)的調(diào)用方式聲明為CALLBACK方式,因?yàn)槲野l(fā)現(xiàn)如果完全按照MSDN上的那種函數(shù)導(dǎo)出格式是會(huì)失敗的!
總結(jié)
以上是生活随笔為你收集整理的Rundll32.exe原理及使用, 参数传递问题解决方法(可用于批处理中)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 风云人物——李一男
- 下一篇: kali由wifi握手包破解密码gnup