Life
好久没搞分析了,还是分析一些东西比较有意思,重拾一下。
Hotkey
如果不是机缘巧合,可能很多人都不知道,lnk & url 文件的快捷方式是可以设置热键的,其实能设置热键倒也是无所谓,但是如果再加上一条,把带有热键的lnk&url快捷方式放到一些固定的目录,explorer就会自动加载解析,然后生效,这个事情是不是就有意思多了。 更有意思的是,当你手工删除后(url快捷方式),你会发现热键依然有效果,这是不是有意思到天上了。那下面一块探究下这个过程。
哪些目录会生效
这个问题的答案就在explorer, 通过procexp,可以看到explorer是有打开一些目录的,见下图
类似的目录,可以自己动手去找,总会有意向不到的收获。
如何注册的
下面是一段ida中的找到的关键代码,该代码位于 ieframe.dll中
__int64 __fastcall ISPS_DlgProc(HWND a1, int a2, unsigned __int64 a3, __int64 a4)
{
__int64 result; // rax
int v5; // edx
int v6; // edx
int v7; // edx
LODWORD(result) = 0;
v5 = a2 - 2;
if ( v5 )
{
v6 = v5 - 76;
if ( v6 )
{
v7 = v6 - 194;
if ( v7 )
{
if ( v7 == 1 )
LODWORD(result) = ISPS_Command(a1, a3);
}
else
{
LODWORD(result) = ISPS_InitDialog(a1, a3, a4);
}
}
else
{
LODWORD(result) = ISPS_Notify(a1, a3, a4);
}
}
else
{
LODWORD(result) = ISPS_Destroy(a1, a3, a4);
}
return (int)result;
}
当在url&lnk文件上面右键属性的属性,出现的对话框所对应的处理函数,就是上面的这个。 当点击保存后,最终会走到下面的函数中,无关代码已经隐藏
__int64 __fastcall InjectISPSData(HWND a1)
{
...
v2 = (CInternetShortcut **)GetWindowLongPtrW(a1, 16);
...
v5 = CopyDlgItemText(v1, 1005, (unsigned __int16 **)&hMem);
...
v6 = IURLQualify((__int64)hMem);
...
v8 = ValidateURL(&v17);
...
if ( (unsigned int)RegisterGlobalHotkeyW(v14, v12, &v16) )
...
}
在上面的函数中解析成功后,会把数据放入到自己内部的缓存中,并调用系统接口注册热键。 这也解释了为什么即使删除了url文件,依然会生效的问题。文件被删除了,但是缓存没有删除。
如何防御
自古解铃还须系铃人,答案也自然在上面的过程中,认真分析会发现的。
End
很多时候,很多功能,系统在设计之初出发点是好的,只是没想到,会好心办坏事。正所谓,阴阳本就如此。