找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29741|回复: 9

[特效代码] 高手来看看rundll32如何加载DLL

[复制链接]
发表于 2012-8-31 23:56:53 | 显示全部楼层 |阅读模式
RUNDLL32如何工作  
RUNDLL32按以下步骤工作:  
1、分析命令行   
2、用LoadLibrary()这个API来装载DLL   
3、用GetProcAddress()这个API来找到函数入口点   
4、调用函数,把<可选参数>做为命令行传递给函数

批处理如何示例加载一个DLL
 楼主| 发表于 2012-8-31 20:59:28 | 显示全部楼层

批处理如何加载一个DLL使其运行

DLL是带有入口点的。 如何汇编修改或者某种方法使其运行。

最好是批处理就可以实现的。

救助中!
发表于 2012-8-31 21:13:52 | 显示全部楼层
我觉得这需要第三方软件实现了。
发表于 2012-8-31 21:14:36 | 显示全部楼层
批处理真是无所不能。
 楼主| 发表于 2012-8-31 21:21:39 | 显示全部楼层
回复 2# xinje


    我见过别人实现过。可惜的是我把那个代码给删了。 现在想找却找不到了。 真是存起来不可惜。删掉才可惜啊. 希望哪位大神再能写一个
发表于 2012-9-1 12:13:26 | 显示全部楼层
发表于 2012-9-1 15:16:27 | 显示全部楼层
不是的
rundll32 调用的函数入口必须有如下的形式:

  1. void CALLBACK <entrypoint>(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,int nCmdShow)
复制代码



所以他不能调用大多数的API
 楼主| 发表于 2012-9-1 21:05:38 | 显示全部楼层
回复 5# forfiles


    不是第三方工具。而是一个批处理代码
发表于 2012-9-2 01:16:33 | 显示全部楼层
纯批处理代码实现调用所有的DLL入口的不太可能

估计楼主之前丢失的代码用了rundll32。
但是rundll32也不是万能的
发表于 2012-9-2 11:21:21 | 显示全部楼层
从rundll32的工作原理可以知道,rundll32可以调用几乎所有导出函数!
rundll32能不能调用函数,和函数能不能正常工作,是两个不同的概念。
譬如你可以任意喊你同学的名字,但你同学听到后是否屌你,已经不是你能左右的。

rundll32最后会以如下参数调用函数:
func  hwnd, hinst, lpszCmdLine, nCmdShow
但被调用的函数func要不要这些参数及如何处理这些参数才是关键。
比如下面这个函数随便怎么搞都能运行(虽然形参是整形和指针,但你输入任何类型的参数都没问题):
int foo(int i, void *p)
{
    char buf[1024] = "";
    sprintf(buf, "0x%08X 0x%08X", i, p);
    return MessageBoxA(0, buf, "IUnknown", 0);
}

gcc -shared -fPIC -o test.dll test.c

rundll32.exe test.dll,foo ***

评分

参与人数 1技术 +3 收起 理由
zqz0012005 + 3 有道理

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 12:55 , Processed in 0.019769 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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