-
-
[原创]LSP修复工具(山寨360的LSP修复工具)
-
发表于:
2011-6-27 08:49
23362
-
[原创]LSP修复工具(山寨360的LSP修复工具)
【文章标题】: LSP修复工具(山寨360的LSP修复工具)
【文章作者】: Root
【作者邮箱】: cppcoffee@gmail.com
【下载地址】: 附件
【编写语言】: VC++、WTL
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
开始先了解下概念:
LSP即分层服务提供商,Winsock 作为应用程序的 Windows 的网络套接字工具,可以由称为“分层服务提供商”的机制进行扩展。Winsock LSP 可用于非常广泛的实用用途,包括 Internet 家长控制 (parental control) 和 Web 内容筛选。在以前版本的 Windows XP 中,删除不正确的(也称为“buggy”)LSP 可能会导致注册表中的 Winsock 目录损坏,潜在地导致所有网络连接的丢失。
“浏览器劫持”或者“分层服务提供程序”。某些间谍软件会修改Winsock 2的设置,进行LSP“浏览器劫持”,所有与网络交换的信息都要通过这些间谍软件,从而使得它们可以监控使用者的信息。著名的如New net插件或WebHancer组件,它们是安装一些软件时带来的你不想要的东西。
最近公司的Client团队在开发自己的LSP,于是开始好奇它,再者见到360有个LSP修复的功能,很想知道它的工作原理和实现,所以就有了这篇文章(纯属菜鸟作品,大牛请飘过).
进入正题吧
先了解下LSP在注册表中的位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters下的Current_NameSpace_Catalog描述了当先使用的协议目录,一般为Protocol_Catalog9。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9下的Num_Catalog_Entries记录了该结构链的节点的总数。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries下面的以序号为键名的内容依次对应了一个服务程序,可以自启动,因此SPI成了流氓软件和病毒的目标。
程序首先读取Current_Protocol_Catalog协议目录存放的子键名称,接着读取存放目录子键下的Num_Catalog_Entries目录总数,接着遍历Catalog_Entries下的所有存放协议目录的子键,他们的存放结构如下:
typedef struct tagPACKED_CATALOG_ITEM
{
char spi_path[MAX_PATH]; // dll的路径名称
WSAPROTOCOL_INFO protocol_info; // 协议的结构体
} PACKED_CATALOG_ITEM, *PPACKED_CATALOG_ITEM;
将注册表存放目录的数据填充到这个结构体里面即可.
如何判断是否有效的LSP呢。
1、对协议结构体中的CLSID进行匹配,与以下的CLSID:
{E70F1AA0-AB8B-11CF-8CA3-00805F48A192}
{9D60A9E0-337A-11D0-BD88-0000C082E69A}
{8D5F1830-C273-11CF-95C8-00805F48A192}
{3972523D-2AF1-11D1-B655-00805F3642CC}
2、根据DLL存放的路径进行匹配,与以下的文件名进行匹配(必须是Windows\System32目录下)
mswsock.dll
rsvpsp.dll
msafd.dll
ws2_64.dll
以上操作就完成了LSP的辨别操作。
接下来是修复的工作:
1、保存原先的注册表信息,路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters 保存为WinSockLSP.reg。
2、保存 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WS2IFSL 到当前路径下的 WinSockLSPIFSL.reg。
3、将在第一步确定为未知的LSP的DLL保存到当前路径下的LSP中,并写入相关的信息到LSP.ini中,以便后续的恢复操作可执行。
4、对检测为未知的DLL再次进行检测,是否与以下的DLL名称相符合。
shdocvw.dll
Shell32.dll
Oleaut32.dll
Actxprxy.dll
Mshtml.dll
Urlmon.dll
Msjava.dll
Browseui.dll
5、如果不符合已知的DLL,那么将这个未知的LSP的DLL进行删除处理,并删除这个相关的LSP协议。
最后是还原操作:
1、导入保存的WinSockLSP.reg和WinSockLSPIFSL.reg
2、读取保存的LSP文件夹下的LSP.ini,得到DLL删除前存放的路径。
3、将所有的DLL拷贝到原先存放的路径中。
在完成这个小工具的期间在反汇编360LSP修复工具的时候发现一个逻辑上的小BUG:
360LSP修复在写入LSP相关的DLL文件到ini中的时候,只能恢复保存在ini中的第一个DLL文件。是由于GetPrivateProfileSection只能读取到第一个换行的数据.而第二行的数据无法得到。(文件版本号: 7.0.2.1005)
贴张界面效果图
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2011年06月26日 21:14:05
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)