找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4235|回复: 5

【转载】使用360安全卫士的下载接口

[复制链接]

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24221 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-3-18 20:33:28 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
作者信息:
QQ:896396837
ID:@你的香气
原文:http://pan.baidu.com/s/1i3DSqNV
转载请注明出处:http://www.0xaa55.com/thread-382-1-1.html

  如题,本帖讲述如何使用 360安全卫士的P2P下载接口,希望这贴能能够让大家会使用360的接口,同时不希望有人拿这贴所涉的东西,去做有侵犯奇虎360权益的事情;如有,责任自负,本帖只讨论技术。

  很久一段时间,看到了360安全卫士的P2P 下载的东西心里就痒痒,因此花了一段时间来搞了搞,期间也去研究过迅雷的下载接口,但是那个复杂度,不得不放弃,只能叹技术不够……,但是苍天不负有心人,让我搞定了360安全卫士的P2P 下载接口,哈哈,让我得意一会儿…

  360的下载接口,可以P2P下载,多线程,断点续传,即使下载的时候断电,重新开机也可以接着继续下载。

  只要你有360安全卫士,那么就一定包含了这三个文件:LiveUpd360.dll,360P2SP.dll,360net.dll,这3个DLL,就有了360的P2P下载接口,360net.dll 这个文件,本人觉得在使用过程中没什么用处,但是没办法,人家有依赖关系,不要还不行(老版本的可以不要,只要LiveUpd360.dll,360P2SP.dll,我待会儿会提供下载)。其中我们只需要使用LiveUpd360.dll 里面的函数接口就行了,他会自动去调用相关DLL里面的函数。

LiveUpd360.dll 的导出函数表:

  1.     LiveUpd360.dll  0001  PPClose   .   .   .   .   .   .   .   000015C0
  2.     LiveUpd360.dll  0002  PPCloseHandle .   .   .   .   .   .   000029B5
  3.     LiveUpd360.dll  0003  PPDownload    .   .   .   .   .   .   00001CAF
  4.     LiveUpd360.dll  0004  PPGetConfig   .   .   .   .   .   .   000015EF
  5.     LiveUpd360.dll  0005  PPInit    .   .   .   .   .   .   .   00001B35
  6.     LiveUpd360.dll  0006  PPQueryTask   .   .   .   .   .   .   00002BB4
  7.     LiveUpd360.dll  0007  PPQueryTaskEx .   .   .   .   .   .   00002B38
  8.     LiveUpd360.dll  0008  PPRemoveTask  .   .   .   .   .   .   00001BE4
  9.     LiveUpd360.dll  0009  PPRestart .   .   .   .   .   .   .   000010C4
  10.     LiveUpd360.dll  000A  PPSetConfig   .   .   .   .   .   .   000015D2
  11.     LiveUpd360.dll  000B  PPStartTask   .   .   .   .   .   .   00001B65
  12.     LiveUpd360.dll  000C  PPStartTaskEx .   .   .   .   .   .   00001B89
  13.     LiveUpd360.dll  000D  PPStopSeed    .   .   .   .   .   .   00001C18
  14.     LiveUpd360.dll  000E  PPStopTask    .   .   .   .   .   .   00001BB0
  15.     LiveUpd360.dll  000F  StartLan  .   .   .   .   .   .   .   000010C4
  16.     LiveUpd360.dll  0010  StopLan   .   .   .   .   .   .   .   000010C4
  17.     LiveUpd360.dll  0011  _EnableP2P    .   .   .   .   .   .   00001097
  18.     LiveUpd360.dll  0012  _GetTasks .   .   .   .   .   .   .   000010B0
  19.     LiveUpd360.dll  0013  _IsStopped    .   .   .   .   .   .   000010B5
  20.     LiveUpd360.dll  0014  _P2SPCancelCheckProxy .   .   .   .   00001144
  21.     LiveUpd360.dll  0015  _P2SPCheckProxy   .   .   .   .   .   000010D6
  22.     LiveUpd360.dll  0016  _P2SPSetOption    .   .   .   .   .   00001149
  23.     LiveUpd360.dll  0017  _P2SPUpdateRegInfo    .   .   .   .   000010D1
  24.     LiveUpd360.dll  0018  _PPQueryIPPort    .   .   .   .   .   000010C7
  25.     LiveUpd360.dll  0019  _PPQueryTask2 .   .   .   .   .   .   000010BA
  26.     LiveUpd360.dll  001A  _PPSetLocalLog    .   .   .   .   .   000010CC
  27.     LiveUpd360.dll  001B  _Run  .   .   .   .   .   .   .   .   000010A1
  28.     LiveUpd360.dll  001C  _SetKeep  .   .   .   .   .   .   .   0000108D
  29.     LiveUpd360.dll  001D  _SetKeepEx    .   .   .   .   .   .   00001092
  30.     LiveUpd360.dll  001E  _SetLocalLog  .   .   .   .   .   .   00003212
  31.     LiveUpd360.dll  001F  _StartRun .   .   .   .   .   .   .   000010A6
  32.     LiveUpd360.dll  0020  _StopRun  .   .   .   .   .   .   .   000010AB
  33.     LiveUpd360.dll  0021  __PPSetModulePath2    .   .   .   .   000010BF
  34. //老版本的没有这个
  35.     LiveUpd360.dll  001E  _PPQueryTask3 .   .   .   .   .   .   000053D0
复制代码
(注意:所有参数标记为Unknow的,那么这个参数,我也不知道是干什么的,可以不管)
通过这些函数列表,就应该对如何使用它们有一个梗概的了解,我们继续,我们将要用的函数有这些:PPStartTask,PPStopTask,_StartRun,_StopRun,_EnableP2P,PPSetConfig,_PPQueryTask3,PPRemoveTask这几个函数,使用它们就可以达到建立下载任务,获取任务信息,限制速度,至少是达到了下载的一个完整体系。函数的分析过程我已经搞定了,现在放出函数原型:
  1. //启动下载器
  2. int _StartRun();        //启动下载器,无参数
  3. //停止下载器
  4. int _StopRun();         //停止运行下载器,无参数
  5. //建立任务,开始下载
  6. int _ PPStartTask
  7. (
  8.     LPSZSTR szDownUrl,  //下载URL
  9.     LPSZSTR szFilePaht, //下载文件的存放 完整路径
  10.     int nUnknow1,       //0x14
  11.     int nUnknow2,       //0
  12.     int nUnknow3,       //0
  13.     int nUnknow4,       //0
  14.     int nUnknow5        //0
  15. );
  16. //暂停/停止任务
  17. int PPStopTask
  18. (
  19.     DWORD nTaskID       //包含任务的ID
  20. );
  21. //开启P2P下载
  22. int _EnabledP2P
  23. (
  24.     BOOL bEnabled       //指定是否启用P2P下载
  25. );
  26. //设置下载速度   0:不限速
  27. int PPSetConfig
  28. (
  29.     IN LPVOID lpPreperties,//指向一个属性的结构体
  30.     DWORD nUnknow       //未知参数,始终为0
  31. );
  32. //获取指定任务的任务信息
  33. int  _PPQueryTask3
  34. (
  35.     IN DWORD nTaskID,   //包含指定将要获取的任务ID信息
  36.     OUT LPVOID lpTask   //指向一个用来返回任务信息的结构体
  37. );
  38. //移除指定的任务
  39. int PPRemoveTask
  40. (
  41.     IN DWORD nTaskID    //传入要移除的任务ID
  42. );
复制代码
以上函数所使用到的两个结构体
  1. typedef struct _TASK
  2. {
  3.     DWORD nUnknown1;
  4.     ULONG64 nTotalBytes;        //下载文件的总大小,单位:字节
  5.     ULONG64 nDownloadedBytes;   //已下载字节数,单位:字节
  6.     ULONG64 nUnknow2;
  7.     ULONG64 nUnknow3;
  8.     DWORD nUnknow4;
  9.     DWORD nDownloadSpeed;       //当前任务下载速度,单位:字节
  10.     DWORD nUploadSpeed;         //当前任务上传速度,单位:字节
  11.     DWORD nUnknow5;
  12.     DWORD nUnknow6;
  13.     DWORD nUnknow7;
  14.     DWORD nUnknow8;
  15.     WCHAR wFilePath[512];       //文件下载全路径
  16.     WCHAR wCurPath[1024];   
  17. }TASK,*PTASK;

  18. typedef struct _CONFIG
  19. {
  20.     DWORD nUnknow1;             //指定为0xC,可能不同操作系统有所不同,如果不能用,自己去调试
  21.     DWORD nDownSpeed;           //指定限制的下载速度,单位:字节
  22.     DWORD nUploadSpeed;         //指定上传的速度,单位:字节
  23.     CHAR  cUnknown2[180];
  24. }CONFIG,*PCONFIG;
复制代码
所谓眼见为实,光说是没用的,上代码,只是片段
用到的全局变量
  1. HMODULE hModule;//全局变量
  2. DWORD g_nTaskID;//全局变量
复制代码
  1. wchar_t wDllPath[MAX_PATH]={0};

  2. GetModuleFileName(NULL,wDllPath,MAX_PATH);
  3. PathRemoveFileSpec(wDllPath);
  4. wcscat(wDllPath,L"\\LiveUpd360.dll");
  5. hModule=LoadLibrary(wDllPath);

  6. if(0==hModule)
  7. {
  8.     return false;
  9. }

  10. DWORD StartRun=(DWORD)GetProcAddress(hModule,"_StartRun");
  11. DWORD EnableP2P=(DWORD)GetProcAddress(hModule,"_EnableP2P");
  12. //开始运行
  13. _asm
  14. {
  15.     mov eax,StartRun
  16.     call eax

  17.     push 1
  18.     mov eax,EnableP2P
  19.     call eax
  20.     add esp,0x4
  21. }
复制代码
上面这段代码用于启动下载器,并启用P2P下载,内嵌汇编不懂得可以问我。
  1. DWORD PPStartTask=(DWORD)GetProcAddress(hModule,"PPStartTask");
  2. wchar_t wFilePath[MAX_PATH]=L"c://test/test.exe";
  3. wchar_t wDownUrl[1024]=L"pdown://http://cdn.browser.aliyun.com/download/bin/YunOSzhushou-2.7.0.3458.exe";
  4. _asm
  5. {
  6.     push 0
  7.     push 0
  8.     push 0
  9.     push 0
  10.     push 0x14
  11.     lea eax,dword ptr wFilePath
  12.     push eax
  13.     lea ebx,dword ptr wDownUrl
  14.     push ebx
  15.     mov ebx,PPStartTask
  16.     call ebx//新建任务,开始下载
  17.     add esp,0x1c

  18.     mov g_nTaskID,eax//保存任务ID
  19. }
复制代码
上面的代码片段演示了,如何新建任务,需要注意的就是,下载链接字符串的前面的pdown://不能去掉,下载链接直接跟在后面就行,还有就是函数调用之后,要手动恢复堆栈。
  1. TASK *task=new TASK();
  2. DWORD _PPQueryTask3=(DWORD)GetProcAddress(hModule,"_PPQueryTask3");
  3. _asm
  4. {
  5.     mov eax,eax
  6.     mov ebx,ebx
  7.     mov eax,eax

  8.     mov ebx,task
  9.     push ebx
  10.     mov eax,g_nTaskID
  11.     push eax
  12.     mov eax,_PPQueryTask3
  13.     call eax
  14.     add esp,8h
  15. }

  16. CString strTemp;
  17. strTemp.Format(L"%.2fMB",task->nTotalBytes/1024.0/1024.0);
  18. ((CEdit*)GetDlgItem(IDC_EDT_TOTAL))->SetWindowText(strTemp);
  19. strTemp.Format(L"%.2fMB",task->nDownloadedBytes / 1024.0 / 1024.0);
  20. ((CEdit*)GetDlgItem(IDC_EDT_DOWNLOADED))->SetWindowText(strTemp);
  21. strTemp.Format(L"%.2fKB",task->nDownloadSpeed / 1024.0);
  22. ((CEdit*)GetDlgItem(IDC_EDT_DOWNSPEED))->SetWindowText(strTemp);

  23. delete task;
复制代码
上面的代码演示通过TaskID获取任务信息,旧版本的没有这个导出函数,需要尝试的自己去试,不过猜想应该是_PPQueryTask2
  1. DWORD PPStopTask=(DWORD)GetProcAddress(hModule,"PPStopTask");
  2. _asm
  3. {
  4.     mov ebx,dword ptr g_nTaskID
  5.     push ebx
  6.     mov eax,PPStopTask
  7.     call eax
  8. }
复制代码
以上代码演示 暂停/停止一个任务
  1. PCONFIG pConfig=new CONFIG();
  2. pConfig->nUnknow1=0xC;
  3. pConfig->nDownSpeed=200*1024;
  4. pConfig->nUploadSpeed=10*1024;
  5. memset(pConfig->cUnknown2,0,180);

  6. TASK *task=new TASK();
  7. DWORD PPSetConfig=(DWORD)GetProcAddress(hModule,"PPSetConfig");
  8. _asm
  9. {
  10.         push 0
  11.         mov eax,pConfig
  12.         push eax

  13.         mov eax,PPSetConfig
  14.         call eax
  15.         add esp,0x8
  16. }
  17. delete task;
  18. delete pConfig;
复制代码
以上代码演示如何限制下载,上传速度,限速为:下载速度:200KB,上传限制为10KB。
  1. DWORD PPRemoveTask=(DWORD)GetProcAddress(hModule,"PPRemoveTask");
  2. _asm
  3. {
  4.         mov ebx,dword ptr g_nTaskID
  5.         push ebx
  6.         mov eax,PPRemoveTask
  7.         call eax
  8. }
复制代码
以上代码演示了,如何移除一个任务,他可以移除正在下载的任务,也可以移除暂停/停止 状态的任务,注意的就是:移除一个任务,源文件也会删除,不能移除已下载完成的任务。

现在贴上使用的图,看看效果:
1. 现在为打开的图片,可以看到后面的目录里面没有文件
1.png
2.开始下载任务,第一个数值为总大小,第二个为已下载大小,第三个为下载速度
2.png
3.停止任务,下载速度就为0了
3.png
4.限制下载上传速度,下载200KB,上传10KB
4.png
5.取消下载/长传 限制
4.png
6.下载完成
5.png
7.移除任务
6.png
以上演示就是如何使用360的下载接口了(导出函数),使用过程不难,但我弄出来却不容易,如果有说我什么技术不行,喷我的请远离,不欢迎你。 本人原创,转载请注明出处,谢谢!
有兴趣研究这个但是还不会用的,可以加我QQ:896396837
回复

使用道具 举报

0

主题

7

回帖

77

积分

用户组: 小·技术宅

UID
1678
精华
0
威望
0 点
宅币
70 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-5-8
发表于 2016-5-23 09:40:06 | 显示全部楼层
看完了才发现是两年前的帖子
回复 赞! 靠!

使用道具 举报

12

主题

35

回帖

959

积分

用户组: 大·技术宅

UID
3517
精华
1
威望
36 点
宅币
802 个
贡献
33 次
宅之契约
0 份
在线时间
207 小时
注册时间
2018-3-2
发表于 2018-3-3 19:26:14 | 显示全部楼层
前来考古
回复

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
发表于 2018-6-26 09:16:02 | 显示全部楼层
一知半解,但是感觉还是收获了许多,这个帖子里的是不是用到了类似dll劫持类似的技术?
Passion Coding!
回复 赞! 靠!

使用道具 举报

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24221 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
 楼主| 发表于 2018-6-26 11:56:37 | 显示全部楼层
溯影 发表于 2018-6-26 09:16
一知半解,但是感觉还是收获了许多,这个帖子里的是不是用到了类似dll劫持类似的技术?
...

否。所谓DLL劫持一般指的是写一个看起来一模一样的DLL让目标加载
回复 赞! 靠!

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
发表于 2018-6-26 14:07:41 | 显示全部楼层
0xAA55 发表于 2018-6-26 11:56
否。所谓DLL劫持一般指的是写一个看起来一模一样的DLL让目标加载

哦哦,这个我又看了看好像是自己先分析哪些dll有用,然后用软件分析相应的dll里的一些导出函数,最后用那些导出函数和内嵌汇编来自己用,就好像是用360里的下载程序的函数来给自己下载东西的吧。下载东西程序看来还是比较考验人的,原文:360的下载接口,可以P2P下载,多线程,断点续传,即使下载的时候断电,重新开机也可以接着继续下载。
Passion Coding!
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 06:12 , Processed in 0.042365 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表