- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
作者信息:
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 的导出函数表:
- LiveUpd360.dll 0001 PPClose . . . . . . . 000015C0
- LiveUpd360.dll 0002 PPCloseHandle . . . . . . 000029B5
- LiveUpd360.dll 0003 PPDownload . . . . . . 00001CAF
- LiveUpd360.dll 0004 PPGetConfig . . . . . . 000015EF
- LiveUpd360.dll 0005 PPInit . . . . . . . 00001B35
- LiveUpd360.dll 0006 PPQueryTask . . . . . . 00002BB4
- LiveUpd360.dll 0007 PPQueryTaskEx . . . . . . 00002B38
- LiveUpd360.dll 0008 PPRemoveTask . . . . . . 00001BE4
- LiveUpd360.dll 0009 PPRestart . . . . . . . 000010C4
- LiveUpd360.dll 000A PPSetConfig . . . . . . 000015D2
- LiveUpd360.dll 000B PPStartTask . . . . . . 00001B65
- LiveUpd360.dll 000C PPStartTaskEx . . . . . . 00001B89
- LiveUpd360.dll 000D PPStopSeed . . . . . . 00001C18
- LiveUpd360.dll 000E PPStopTask . . . . . . 00001BB0
- LiveUpd360.dll 000F StartLan . . . . . . . 000010C4
- LiveUpd360.dll 0010 StopLan . . . . . . . 000010C4
- LiveUpd360.dll 0011 _EnableP2P . . . . . . 00001097
- LiveUpd360.dll 0012 _GetTasks . . . . . . . 000010B0
- LiveUpd360.dll 0013 _IsStopped . . . . . . 000010B5
- LiveUpd360.dll 0014 _P2SPCancelCheckProxy . . . . 00001144
- LiveUpd360.dll 0015 _P2SPCheckProxy . . . . . 000010D6
- LiveUpd360.dll 0016 _P2SPSetOption . . . . . 00001149
- LiveUpd360.dll 0017 _P2SPUpdateRegInfo . . . . 000010D1
- LiveUpd360.dll 0018 _PPQueryIPPort . . . . . 000010C7
- LiveUpd360.dll 0019 _PPQueryTask2 . . . . . . 000010BA
- LiveUpd360.dll 001A _PPSetLocalLog . . . . . 000010CC
- LiveUpd360.dll 001B _Run . . . . . . . . 000010A1
- LiveUpd360.dll 001C _SetKeep . . . . . . . 0000108D
- LiveUpd360.dll 001D _SetKeepEx . . . . . . 00001092
- LiveUpd360.dll 001E _SetLocalLog . . . . . . 00003212
- LiveUpd360.dll 001F _StartRun . . . . . . . 000010A6
- LiveUpd360.dll 0020 _StopRun . . . . . . . 000010AB
- LiveUpd360.dll 0021 __PPSetModulePath2 . . . . 000010BF
- //老版本的没有这个
- LiveUpd360.dll 001E _PPQueryTask3 . . . . . . 000053D0
复制代码 (注意:所有参数标记为Unknow的,那么这个参数,我也不知道是干什么的,可以不管)
通过这些函数列表,就应该对如何使用它们有一个梗概的了解,我们继续,我们将要用的函数有这些:PPStartTask,PPStopTask,_StartRun,_StopRun,_EnableP2P,PPSetConfig,_PPQueryTask3,PPRemoveTask这几个函数,使用它们就可以达到建立下载任务,获取任务信息,限制速度,至少是达到了下载的一个完整体系。函数的分析过程我已经搞定了,现在放出函数原型:- //启动下载器
- int _StartRun(); //启动下载器,无参数
- //停止下载器
- int _StopRun(); //停止运行下载器,无参数
- //建立任务,开始下载
- int _ PPStartTask
- (
- LPSZSTR szDownUrl, //下载URL
- LPSZSTR szFilePaht, //下载文件的存放 完整路径
- int nUnknow1, //0x14
- int nUnknow2, //0
- int nUnknow3, //0
- int nUnknow4, //0
- int nUnknow5 //0
- );
- //暂停/停止任务
- int PPStopTask
- (
- DWORD nTaskID //包含任务的ID
- );
- //开启P2P下载
- int _EnabledP2P
- (
- BOOL bEnabled //指定是否启用P2P下载
- );
- //设置下载速度 0:不限速
- int PPSetConfig
- (
- IN LPVOID lpPreperties,//指向一个属性的结构体
- DWORD nUnknow //未知参数,始终为0
- );
- //获取指定任务的任务信息
- int _PPQueryTask3
- (
- IN DWORD nTaskID, //包含指定将要获取的任务ID信息
- OUT LPVOID lpTask //指向一个用来返回任务信息的结构体
- );
- //移除指定的任务
- int PPRemoveTask
- (
- IN DWORD nTaskID //传入要移除的任务ID
- );
复制代码 以上函数所使用到的两个结构体- typedef struct _TASK
- {
- DWORD nUnknown1;
- ULONG64 nTotalBytes; //下载文件的总大小,单位:字节
- ULONG64 nDownloadedBytes; //已下载字节数,单位:字节
- ULONG64 nUnknow2;
- ULONG64 nUnknow3;
- DWORD nUnknow4;
- DWORD nDownloadSpeed; //当前任务下载速度,单位:字节
- DWORD nUploadSpeed; //当前任务上传速度,单位:字节
- DWORD nUnknow5;
- DWORD nUnknow6;
- DWORD nUnknow7;
- DWORD nUnknow8;
- WCHAR wFilePath[512]; //文件下载全路径
- WCHAR wCurPath[1024];
- }TASK,*PTASK;
- typedef struct _CONFIG
- {
- DWORD nUnknow1; //指定为0xC,可能不同操作系统有所不同,如果不能用,自己去调试
- DWORD nDownSpeed; //指定限制的下载速度,单位:字节
- DWORD nUploadSpeed; //指定上传的速度,单位:字节
- CHAR cUnknown2[180];
- }CONFIG,*PCONFIG;
复制代码 所谓眼见为实,光说是没用的,上代码,只是片段
用到的全局变量- HMODULE hModule;//全局变量
- DWORD g_nTaskID;//全局变量
复制代码- wchar_t wDllPath[MAX_PATH]={0};
- GetModuleFileName(NULL,wDllPath,MAX_PATH);
- PathRemoveFileSpec(wDllPath);
- wcscat(wDllPath,L"\\LiveUpd360.dll");
- hModule=LoadLibrary(wDllPath);
- if(0==hModule)
- {
- return false;
- }
- DWORD StartRun=(DWORD)GetProcAddress(hModule,"_StartRun");
- DWORD EnableP2P=(DWORD)GetProcAddress(hModule,"_EnableP2P");
- //开始运行
- _asm
- {
- mov eax,StartRun
- call eax
- push 1
- mov eax,EnableP2P
- call eax
- add esp,0x4
- }
复制代码 上面这段代码用于启动下载器,并启用P2P下载,内嵌汇编不懂得可以问我。- DWORD PPStartTask=(DWORD)GetProcAddress(hModule,"PPStartTask");
- wchar_t wFilePath[MAX_PATH]=L"c://test/test.exe";
- wchar_t wDownUrl[1024]=L"pdown://http://cdn.browser.aliyun.com/download/bin/YunOSzhushou-2.7.0.3458.exe";
- _asm
- {
- push 0
- push 0
- push 0
- push 0
- push 0x14
- lea eax,dword ptr wFilePath
- push eax
- lea ebx,dword ptr wDownUrl
- push ebx
- mov ebx,PPStartTask
- call ebx//新建任务,开始下载
- add esp,0x1c
- mov g_nTaskID,eax//保存任务ID
- }
复制代码 上面的代码片段演示了,如何新建任务,需要注意的就是,下载链接字符串的前面的pdown://不能去掉,下载链接直接跟在后面就行,还有就是函数调用之后,要手动恢复堆栈。- TASK *task=new TASK();
- DWORD _PPQueryTask3=(DWORD)GetProcAddress(hModule,"_PPQueryTask3");
- _asm
- {
- mov eax,eax
- mov ebx,ebx
- mov eax,eax
- mov ebx,task
- push ebx
- mov eax,g_nTaskID
- push eax
- mov eax,_PPQueryTask3
- call eax
- add esp,8h
- }
- CString strTemp;
- strTemp.Format(L"%.2fMB",task->nTotalBytes/1024.0/1024.0);
- ((CEdit*)GetDlgItem(IDC_EDT_TOTAL))->SetWindowText(strTemp);
- strTemp.Format(L"%.2fMB",task->nDownloadedBytes / 1024.0 / 1024.0);
- ((CEdit*)GetDlgItem(IDC_EDT_DOWNLOADED))->SetWindowText(strTemp);
- strTemp.Format(L"%.2fKB",task->nDownloadSpeed / 1024.0);
- ((CEdit*)GetDlgItem(IDC_EDT_DOWNSPEED))->SetWindowText(strTemp);
- delete task;
复制代码 上面的代码演示通过TaskID获取任务信息,旧版本的没有这个导出函数,需要尝试的自己去试,不过猜想应该是_PPQueryTask2- DWORD PPStopTask=(DWORD)GetProcAddress(hModule,"PPStopTask");
- _asm
- {
- mov ebx,dword ptr g_nTaskID
- push ebx
- mov eax,PPStopTask
- call eax
- }
复制代码 以上代码演示 暂停/停止一个任务- PCONFIG pConfig=new CONFIG();
- pConfig->nUnknow1=0xC;
- pConfig->nDownSpeed=200*1024;
- pConfig->nUploadSpeed=10*1024;
- memset(pConfig->cUnknown2,0,180);
- TASK *task=new TASK();
- DWORD PPSetConfig=(DWORD)GetProcAddress(hModule,"PPSetConfig");
- _asm
- {
- push 0
- mov eax,pConfig
- push eax
- mov eax,PPSetConfig
- call eax
- add esp,0x8
- }
- delete task;
- delete pConfig;
复制代码 以上代码演示如何限制下载,上传速度,限速为:下载速度:200KB,上传限制为10KB。- DWORD PPRemoveTask=(DWORD)GetProcAddress(hModule,"PPRemoveTask");
- _asm
- {
- mov ebx,dword ptr g_nTaskID
- push ebx
- mov eax,PPRemoveTask
- call eax
- }
复制代码 以上代码演示了,如何移除一个任务,他可以移除正在下载的任务,也可以移除暂停/停止 状态的任务,注意的就是:移除一个任务,源文件也会删除,不能移除已下载完成的任务。
现在贴上使用的图,看看效果:
1. 现在为打开的图片,可以看到后面的目录里面没有文件
2.开始下载任务,第一个数值为总大小,第二个为已下载大小,第三个为下载速度
3.停止任务,下载速度就为0了
4.限制下载上传速度,下载200KB,上传10KB
5.取消下载/长传 限制
6.下载完成
7.移除任务
以上演示就是如何使用360的下载接口了(导出函数),使用过程不难,但我弄出来却不容易,如果有说我什么技术不行,喷我的请远离,不欢迎你。 本人原创,转载请注明出处,谢谢!
有兴趣研究这个但是还不会用的,可以加我QQ:896396837 |
|