【文章标题】:给暴风影音添加主程序关闭时自动结束传输进程功能
【文章作者】:lpfei
【软件名称】:暴风影音Build版本:3.11.9.12  MEE版本:3.11.7.15
【下载地址】:http://115.com/file/aqauicsz#StormII(版本3.11.9.12).rar
【使用工具】:OllyDbg,LordPE,Rebaser.exe,Vc,WinHex
【操作平台】:Windows XP Sp2
--------------------------------------------------------------------------------
【详细过程】
暴风影音没有提供主程序关闭时结束Stormtray.exe功能,Stormtray.exe会占用宽带资源,于是就想让它随主程序"同死"。
参考不问年少前辈的这篇文章http://bbs.pediy.com/showthread.php?t=82841。在此表示感谢。
我发现暴风播放控件mps.dll每次都加载到0x1950000处,可以在它的入口函数处添加"同死"代码。可是它的ImageBase为0x10000000,于是可以用Rebaser.exe把ImageBase修改成0x1950000,修改mps.dll的重定位表,这样就没有地址重定向的问题了。
然后就可以在dll入口处添加自己的代码了,因为我比较菜,把结束代码先用c写了一遍(其实也是在网上抄的),参考反汇编代码写dll入口代码。
#include <windows.h>
#include <Tlhelp32.h>
main()
{
  HANDLE SnapShot,ProcessHandle;
  SHFILEINFO shSmall;
  PROCESSENTRY32 ProcessInfo; 
  BOOL Status;
  char msg[20]={"explorer.exe"}; //可以在此添加需要关闭的进程名称
  SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if(SnapShot!=NULL) 
  {
    ProcessInfo.dwSize=sizeof(ProcessInfo); //设置ProcessInfo的大小
    Status=Process32First(SnapShot,&ProcessInfo);
    while(Status)
    {
        if(!strcmp(msg,ProcessInfo.szExeFile)) 
        {
          //获取进程句柄,强行关闭
          ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessInfo.th32ProcessID);
          TerminateProcess(ProcessHandle,0);
                  break;
        }
        //获取下一个进程的信息
        Status=Process32Next(SnapShot,&ProcessInfo);
    }
  }
  return 0;
}
用LordPE添加需要的api函数,具体怎么添加可以参考不问年少前辈的文章。添加的时候一定要把总是查看FirstThunk选上。记下ThunkRVA值,我这里是这样的:
CreateToolhelp32Snapshot:00141024
Process32First:          00141046
OpenProcess:             00141065
TerminateProcess:        00141089
Process32Next:           001410AA
这样就可以用call [00141024]调用CreateToolhelp32Snapshot函数。Strcmp直接从c反汇编代码copy下就可以使用了。
设计要使用的变量:
msg[20]:可以用WinHex在.data区段写入”Stormtray.exe”字符串
其余的使用局部变量比较方便:
SnapShot:                           ---->ebp-4  
ProcessHandle:                      ---->ebp-8
Status:                             ---->ebp-C
ProcessInfo:  ebp-10 --- ebp-134
typedef struct tagPROCESSENTRY32 {
  DWORD     dwSize;                 ---->ebp-134
  DWORD     cntUsage;
  DWORD     th32ProcessID;          ---->ebp-12C
  ULONG_PTR th32DefaultHeapID;
  DWORD     th32ModuleID;
  DWORD     cntThreads;
  DWORD     th32ParentProcessID;
  LONG      pcPriClassBase;
  DWORD     dwFlags;
  TCHAR     szExeFile[MAX_PATH];    ---->ebp-110
} PROCESSENTRY32, *PPROCESSENTRY32;
总共需要134h字节的堆栈空间。
使用od在.text区段写代码:

 
Dll入口会执行2次,我们只需要卸载dll的情况。
Pushad后的堆栈:

 
开辟堆栈:

 
主体程序:

 
最后用LordPE修改mps.dll入口点为0x0009E400。因为修改了多个文件,提供下载的暴风文件可能会被报毒。
本文介绍的方法局限性比较大,xp下修改的mps.dll直接放在win7测试了不可用,不过暴风影音的最新版本倒是可以用。就到这里了,有不对的地方欢迎指正。

上传的附件 修改的mps.dll及od的udd.rar