【文章标题】: diy迅雷的开放引擎
【文章作者】: Netsd
【作者邮箱】: yezhu_love@163.com
【软件名称】: 迅雷开放引擎
【下载地址】: http://thunderplatform.xunlei.com/
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VC
【使用工具】: od vs2008
【操作平台】: win32
【软件介绍】: 依托迅雷强大的下载加速技术,加速下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
PS:本文只是从技术角度进行分析,无意侵犯迅雷的版权,也没对迅雷的文件,进行任何的修改。
迅雷,开放的一个极其简单的下载引擎,不过看起来扭扭捏捏的,开放的不够彻底,每次用使用,还总自动来个托盘,提示安装迅雷可以加速,右键点下,还不能退出。左键单击- -!那更是坑爹,直接开始下载迅雷了。更要命的是,这东西还搞共享的托盘。牢骚发了一堆,直接进入正题吧。下面就直接搞掉托盘和共享一个托盘的问题。
下面是下载的链接:http://thunderplatform.xunlei.com/
这次走的是IAT HOOK的路子,不patch文件,还有数字签名,看着安全。。。
开始的时候,直接断Shell_NotifyIconW,能看到关键字符串。用IAT HOOK搞之,修改图标,发现能正常的显示,设置后的图标。后面发现在先开起其他实例的情况下,我自己的托盘就不出来了。也就是上面说的,共享了一个托盘。
下面就主要去patch那个东西。跨进程的首先考虑窗口和共享内存的东西
10039F0D push XLDownlo.1003BBBC xl_open_downlaod_engine_mutex 10039F28 push XLDownlo.1003BBF8 xl_open_downlaod_engine_share_memory 10039F43 push XLDownlo.1003BC48 xl_open_downlaod_engine_task_tray_icon_wnd_name 10039F5E push XLDownlo.1003BCA8 xl_tasknumber_and_speed 10039FB3 push XLDownlo.1003C800 DownloadServerNeedFileList.dat 10039FCE push XLDownlo.1003C840 xl_open_download_engine_temp_folder
直接就能看见几个关键的字符串了。我试了下,修改xl_open_downlaod_engine_share_memory和xl_open_downlaod_engine_task_tray_icon
就可以跳过共享一个托盘的问题。自己拥有一个新的实例,不会被其他的实例干扰。
xl_open_downlaod_engine_task_tray_icon 是一个窗口的类名,所以需要hook Hook_RegisterClassExW,当遇到这个字符串的时候
直接替换,然后记录下,注册之后的结果,代码如下
LPCTSTR lpNetsdFileMap = _T("Netsd_xl_open_downlaod_engine_share_memory"); ATOM ret = 0; LPCWSTR lpXlTrayIconClassName = L"xl_open_downlaod_engine_task_tray_icon"; LPCWSTR lpHookXlTrayClass = L"Netsd_TrayIcon"; ATOM WINAPI CTestProject2Dlg::Hook_RegisterClassExW(WNDCLASSEX *lpwcx) { if(lpwcx && (StrCmpW(lpwcx->lpszClassName,lpXlTrayIconClassName) == 0)) { lpwcx->lpszClassName = lpHookXlTrayClass; ret = RegisterClassExW(lpwcx); return ret; } else { return RegisterClassExW(lpwcx); } }
HWND WINAPI CTestProject2Dlg::Hook_CreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { if ((ATOM)lpClassName == ret) { AtlTrace(lpWindowName); AtlTrace(_T("\r\n")); lpWindowName = _T("Netsd_TrayIcon_WindowName"); } return CreateWindowExW(dwExStyle,lpClassName,lpWindowName,dwStyle,X,Y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam); }
HANDLE WINAPI CTestProject2Dlg::Hook_CreateFileMappingW( __in HANDLE hFile, __in_opt LPSECURITY_ATTRIBUTES lpAttributes, __in DWORD flProtect, __in DWORD dwMaximumSizeHigh, __in DWORD dwMaximumSizeLow, __in_opt LPCWSTR lpName ) { AtlTrace(lpName); AtlTrace(_T("\r\n")); return CreateFileMappingW(hFile,lpAttributes,flProtect,dwMaximumSizeHigh,dwMaximumSizeLow,lpNetsdFileMap); }
最后就在HOOK Shell_NotifyIconW 让迅雷的注册托盘的成为睁眼瞎,然后我们获取下载速度等信息,发送到自己托盘上
BOOL WINAPI CTestProject2Dlg::Hook_Shell_NotifyIconW(DWORD dwMessage,PNOTIFYICONDATAW lpData) { DWORD dwCbSize; WCHAR wszTemp[128]; dwCbSize = 0; CTestProject2Dlg * m_this; LPCTSTR lpConvent; m_this = (CTestProject2Dlg *)(theApp.GetMainWnd()); lpConvent = NULL; if(lpData && m_this) { dwCbSize = lpData->cbSize; if(IsBadWritePtr(lpData,dwCbSize) == FALSE) { if(dwMessage == NIM_ADD) { // lpData->hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // lpData->uID = IDR_TRAYMENU; // lpData->hWnd = theApp.GetMainWnd()->GetSafeHwnd(); // lpData->uCallbackMessage = WM_MY_TRAY_NOTIFICATION; } else if(dwMessage == NIM_MODIFY) { if(lpData->uFlags == (NIF_MESSAGE|NIF_ICON|NIF_TIP)) { ZeroMemory(wszTemp,sizeof(wszTemp)); StringCbCopyW(wszTemp,sizeof(wszTemp),L"XXX升级程序"); if(lpData->szTip[8]) StringCbCatW(wszTemp,sizeof(wszTemp),lpData->szTip+8); //StringCbCopyW(lpData->szTip,sizeof(lpData->szTip),wszTemp); //AtlTrace(lpData->szTip); //AtlTrace(L"\r\n"); lpConvent = W2T(wszTemp); m_this->m_trayIcon.SetTooltipText(lpConvent); }else if(lpData->uFlags == (NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_INFO)) { //StringCbCopyW(lpData->szInfoTitle,sizeof(lpData->szInfoTitle),L"xxxxx下载"); //StringCbCopyW(lpData->szInfo,sizeof(lpData->szInfo),L"xxxxxxxxx_Info"); //AtlTrace(lpData->szInfo); lpConvent = W2T(lpData->szInfoTitle); m_this->m_trayIcon.ShowInfo(lpConvent,_T("XXX升级程序")); } } } } return TRUE; }
还有就是自己实现一个托盘了,详细的看代码吧。
ThunderPlatform_SDK_1.1.0.rar
--------------------------------------------------------------------------------
【经验总结】
主要还是注意寻找关键点,正常程序字符串应该都很容易看到。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2011年12月20日 22:29:15