首页
论坛
课程
招聘
[原创]动手给音速启动加点动力、
2011-3-25 11:53 13146

[原创]动手给音速启动加点动力、

2011-3-25 11:53
13146
http://www.52pojie.cn/thread-84483-1-1.html
成品
动手给音速启动加点动力、

音速启动这玩艺我也用了好几年了、昨天上官网发现作者也很久不更新了- -
习惯了还是舍不得放弃,可是每当用它打开很多文件夹的时候,任务管理器里的explorer进程多到让人感觉蛋疼,今天我就动手来给他加点动力,让它打开文件夹的时候不再这么蛋疼。
原理是HookVB的rtcShell,执行我们指定的处理流程。
VB 里的Shell函数执行的这条命令,调用参数自己猜(=w=微软自然没有那么好心)、看了几个调用以后猜测应该是2个参数,第一个参数指向一个pParam结构体,第二个总是1(类似于SW_SHOW么?)

看一看调用
0012F658   00605B79  返回到 VStart_-.00605B79 来自 MSVBVM60.rtcShell
0012F65C   0012F74C
0012F660   00000001

rtcShell入口两个变量、
0012F664   0012F7E0
0012F668   0012F864
0012F66C   00000001
0012F670   00630069  VStart_-.00630069
0012F674   0049006B  VStart_-.0049006B
0012F678   0064006E  VStart_-.0064006E

我猜测的结构体信息
typedef struct
{
        DWORD dwType;
        DWORD pSelf;
        PWCHAR pCommand;
}rtcParam;
函数类型
typedef HMODULE (WINAPI __pfnrtcShell)(rtcParam* pParam,DWORD unknow);
Hook以后用OutputDebugString格式化一些参数变量、然后多调用几次、寻找规律。
 	char temp[MAX_PATH];
	sprintf(temp,"call from: 0x%.8X\nType:0x%X",RetAddr,pParam->pSelf);
 	OutputDebugString(temp);
 	OutputDebugStringW(pParam->pCommand);

得到使用Shell调用的基本上分为四个类型、一个是他启动的时候对于自己部分插件的调用,被我猜测为反身指针的那个变量是个很奇怪的值,第二种是对于文件夹快捷方式的调用,这时候那个反身指针是0,当然还有其它的系统功能调用的时候这个参数也是0,所以这里要进行特殊处理,仅过滤出我们想要的,第三种是浏览程序目录的调用,这个时候反身指针指向pParam,最后一种实际上属于第三种调用,需要特殊处理。

下面是根据所找出的规律写的rtcShell的Hook处理函数。

HMODULE WINAPI My_rtcShell(DWORD RetAddr,
__pfnrtcShell pfnrtcShell,
rtcParam* pParam,
DWORD unknow
)
{
if (pParam->pSelf==(DWORD)pParam)
/*
[4964] call from: 0x00605B79
[4964] Type:0x12F74C
[4964] Explorer /select,"D:\Program Files\Microsoft Math 3.0\MATHAPP.EXE" SelectByExplorer
*/
{
LPWSTR pCmd=wcschr(pParam->pCommand,'\"');
if (pCmd)
{
*(
pCmd+wcslen(pCmd)-1)=0;
SelectByExplorer(pCmd+1);
return 0;
}
}
else if (pParam->pSelf==0)
/*
[4964] call from: 0x0051C1EB
[4964] Type:0x0
[4964] Explorer.exe "E:\Projects\Developing"无参数调用文件夹
----------------------------------------------------------------------
[4964] call from: 0x00519A80
[4964] Type:0x0
[4964] Explorer.exe /n,::{450D8FBA-AD25-11D0-98A8-0800361B1103}
----------------------------------------------------------------------
[4964] call from: 0x00519A80
[4964] Type:0x0
[4964] rundll32.exe shell32.dll,Control_RunDLL
这里要考虑另外调用的情况
*/
{
BOOL bExecute=FALSE;
LPWSTR pCmd=wcschr(pParam->pCommand,'\"');
if (pCmd)
{
*(
pCmd+wcslen(pCmd)-1)=0;
wcscat(pCmd,L"\\*.*");
WIN32_FIND_DATAW FindFileData;
HANDLE hFind = FindFirstFileW(pCmd+1, &FindFileData);
while ( hFind !=INVALID_HANDLE_VALUE&&FindNextFileW(hFind, &FindFileData))
{
if ( FindFileData.cFileName[0] != '.' )
{
*(
wcsrchr(pCmd,'\\')+1)=0;//- -这样子搞很成问题、
wcscat(pCmd,FindFileData.cFileName);
SelectByExplorer(pCmd+1);
bExecute=TRUE;
break;
}
}
FindClose(hFind);
if (!bExecute)
{
PWCHAR pOr=wcsrchr(pCmd,'\\');
*
pOr='\"';
*(
pOr+1)=0;//还原命令行
pfnrtcShell(pParam,unknow);
}
return 0;
}
}
// char temp[MAX_PATH];
// sprintf(temp,"call from: 0x%.8X\nType:0x%X",RetAddr,pParam->pSelf);
// OutputDebugString(temp);
// OutputDebugStringW(pParam->pCommand);
return pfnrtcShell(pParam,unknow);//这里调用非hook的
}

替换的核心函数
void SelectByExplorer(LPWSTR lpPath)
{
	LPSHELLFOLDER IpsfDeskTop;
	LPITEMIDLIST pidl;
	SHGetDesktopFolder(&IpsfDeskTop);
	IpsfDeskTop ->ParseDisplayName(NULL, NULL, lpPath, NULL, &pidl, NULL);
	IpsfDeskTop->Release();
//	if (FAILED(hres)) return FALSE;
	SHOpenFolderAndSelectItems(pidl,0,NULL,NULL);
}

这个函数其实还是蛮有用的,要是能直接打开文件夹而不需要选中文件那就更好了。我对文件夹调用快捷方式的处理其实很挫,直接去那个文件夹底下随便找一个文件,然后粘在地址后面,再调用SelectByExplorer函数,这样当文件夹下没有文件的时候就会失败……但是我想不到怎么用更少的办法做到比这好的效果了。目前个人用了这个增强版以后感觉不错、意外崩溃一次,原因不明。大概真的是意外吧……

以上,这就是本篇文章的所有核心内容,感谢各位观赏。其实就是抛砖引玉的作用、相信各位能做出比我更好的功能拓展:)

最后直接修改壳的外部、在程序启动时装载VstartPlug.dll
call 00401000
$ "VStartPlug.dll"
call dword ptr[006792DC]
jmp 411b60

完整源码请参考附件

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (24)
雪    币: 7509
活跃值: 活跃值 (371)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2011-3-25 11:58
2
0
这个玩意儿我也用了四五年了,呵呵,工具太多,全靠它呢~
雪    币: 24959
活跃值: 活跃值 (2825)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 活跃值 19 2011-3-25 12:25
3
0
任务管理器里的explorer进程多到让人感觉蛋疼

楼主指的是explorer.exe内存占用太多么
雪    币: 502
活跃值: 活跃值 (42)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
yangjt 活跃值 10 2011-3-25 12:33
4
0
进程太多、用的Shell("Explorer.exe XXX")的形式、打开一个文件夹就创建一个进程
雪    币: 24959
活跃值: 活跃值 (2825)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 活跃值 19 2011-3-25 12:40
5
0
xpsp2 VStart 5.0 Build 2009.7.16 无论打开多少个文件夹都只有一个进程.
雪    币: 1481
活跃值: 活跃值 (146)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-3-25 12:51
6
0
膜拜发哥, 全用 start - run.
为啥文章最后还要帖一张图呀...
雪    币: 502
活跃值: 活跃值 (42)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
yangjt 活跃值 10 2011-3-25 12:55
7
0
Win7上很明显的……


个人爱好……啊哈哈哈……
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoxyz 活跃值 2011-3-25 14:04
8
0

图片不错  支持下~
雪    币: 240
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gzsmhf 活跃值 2011-3-25 14:54
9
0
这个不是vstart的问题,是系统的设置问题
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer下的
DesktopProcess值为1的话,打开文件夹就会多一个explorer.exe
雪    币: 502
活跃值: 活跃值 (42)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
yangjt 活跃值 10 2011-3-25 17:07
10
0
恩、不过能用一个进程解决的话用创建新进程的方法肯定是要更加浪费时间和内存的。而且创建进程这件事是肯定的、只不过通过程序间通信最后一个进程自己退出了而已,另外我这样打开比较快……
雪    币: 421
活跃值: 活跃值 (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 活跃值 1 2011-3-25 20:05
11
0
win7下确实是多个explorer.exe进程,我还纳闷哪来的这些东西
雪    币: 421
活跃值: 活跃值 (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 活跃值 1 2011-3-25 20:13
12
0
难道是我人品有问题吗?
error C2065: 'SHOpenFolderAndSelectItems' : undeclared identifier
雪    币: 421
活跃值: 活跃值 (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 活跃值 1 2011-3-25 20:14
13
0
我的是绿色版的vc6,自带的sdk是低版本的,是不是这个问题啊
雪    币: 254
活跃值: 活跃值 (78)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hacker一疒亻 活跃值 2011-3-25 20:26
14
0
很棒的理解。
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-3-25 20:44
15
0
图片不错
雪    币: 1558
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无忧 活跃值 2011-3-25 20:56
16
0
以前用过,现在不用了!
雪    币: 203
活跃值: 活跃值 (108)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
XPoy 活跃值 3 2011-3-26 02:19
18
0
发哥?跟着学习发哥 (?) 好像不是发哥
不过我觉得windows任务栏里自定义个目录的工具栏更好用...
雪    币: 502
活跃值: 活跃值 (42)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
yangjt 活跃值 10 2011-3-26 06:39
19
0
版本太低了、要2003的SDK才可以……你可以用cntrump做的绿色版、当然是新的。
雪    币: 1481
活跃值: 活跃值 (146)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-3-26 13:24
20
0
我知道 LZ 不是发哥, 上次和发哥聊过, 我说我用 音速启动 的时候,被他BS了. 他说自己全用脚本的.
雪    币: 50
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
soog 活跃值 2011-3-26 13:47
21
0
不错的文章,最下面的公仔图也很不错哦
雪    币: 111
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
是昔流芳 活跃值 2011-3-26 20:46
22
0
我想你还有很多这样的图吧做种发上来吧
雪    币: 108
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
今夕望月 活跃值 2011-3-26 21:35
23
0
直接调用的别的浏览器。。。。。。。。。。
雪    币: 16
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
drean 活跃值 2011-3-27 18:26
24
0
我承认  我是来看图的....
雪    币: 20
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
流逝在夏 活跃值 2011-3-28 21:51
25
0
发现新大陆 ,
游客
登录 | 注册 方可回帖
返回