tgjarwl的博客

道可道,非常道;名可名,非常名

记录生活,记录更好的自己。


有意思的explorer.exe

Life

好久没搞分析了,还是分析一些东西比较有意思,重拾一下。

Hotkey

如果不是机缘巧合,可能很多人都不知道,lnk & url 文件的快捷方式是可以设置热键的,其实能设置热键倒也是无所谓,但是如果再加上一条,把带有热键的lnk&url快捷方式放到一些固定的目录,explorer就会自动加载解析,然后生效,这个事情是不是就有意思多了。 更有意思的是,当你手工删除后(url快捷方式),你会发现热键依然有效果,这是不是有意思到天上了。那下面一块探究下这个过程。

哪些目录会生效

这个问题的答案就在explorer, 通过procexp,可以看到explorer是有打开一些目录的,见下图 avatar

类似的目录,可以自己动手去找,总会有意向不到的收获。

如何注册的

下面是一段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

很多时候,很多功能,系统在设计之初出发点是好的,只是没想到,会好心办坏事。正所谓,阴阳本就如此。