0xAA55 发表于 2014-3-18 20:33:28

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

作者信息:
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.dll0001PPClose   .   .   .   .   .   .   .   000015C0
    LiveUpd360.dll0002PPCloseHandle .   .   .   .   .   .   000029B5
    LiveUpd360.dll0003PPDownload    .   .   .   .   .   .   00001CAF
    LiveUpd360.dll0004PPGetConfig   .   .   .   .   .   .   000015EF
    LiveUpd360.dll0005PPInit    .   .   .   .   .   .   .   00001B35
    LiveUpd360.dll0006PPQueryTask   .   .   .   .   .   .   00002BB4
    LiveUpd360.dll0007PPQueryTaskEx .   .   .   .   .   .   00002B38
    LiveUpd360.dll0008PPRemoveTask.   .   .   .   .   .   00001BE4
    LiveUpd360.dll0009PPRestart .   .   .   .   .   .   .   000010C4
    LiveUpd360.dll000APPSetConfig   .   .   .   .   .   .   000015D2
    LiveUpd360.dll000BPPStartTask   .   .   .   .   .   .   00001B65
    LiveUpd360.dll000CPPStartTaskEx .   .   .   .   .   .   00001B89
    LiveUpd360.dll000DPPStopSeed    .   .   .   .   .   .   00001C18
    LiveUpd360.dll000EPPStopTask    .   .   .   .   .   .   00001BB0
    LiveUpd360.dll000FStartLan.   .   .   .   .   .   .   000010C4
    LiveUpd360.dll0010StopLan   .   .   .   .   .   .   .   000010C4
    LiveUpd360.dll0011_EnableP2P    .   .   .   .   .   .   00001097
    LiveUpd360.dll0012_GetTasks .   .   .   .   .   .   .   000010B0
    LiveUpd360.dll0013_IsStopped    .   .   .   .   .   .   000010B5
    LiveUpd360.dll0014_P2SPCancelCheckProxy .   .   .   .   00001144
    LiveUpd360.dll0015_P2SPCheckProxy   .   .   .   .   .   000010D6
    LiveUpd360.dll0016_P2SPSetOption    .   .   .   .   .   00001149
    LiveUpd360.dll0017_P2SPUpdateRegInfo    .   .   .   .   000010D1
    LiveUpd360.dll0018_PPQueryIPPort    .   .   .   .   .   000010C7
    LiveUpd360.dll0019_PPQueryTask2 .   .   .   .   .   .   000010BA
    LiveUpd360.dll001A_PPSetLocalLog    .   .   .   .   .   000010CC
    LiveUpd360.dll001B_Run.   .   .   .   .   .   .   .   000010A1
    LiveUpd360.dll001C_SetKeep.   .   .   .   .   .   .   0000108D
    LiveUpd360.dll001D_SetKeepEx    .   .   .   .   .   .   00001092
    LiveUpd360.dll001E_SetLocalLog.   .   .   .   .   .   00003212
    LiveUpd360.dll001F_StartRun .   .   .   .   .   .   .   000010A6
    LiveUpd360.dll0020_StopRun.   .   .   .   .   .   .   000010AB
    LiveUpd360.dll0021__PPSetModulePath2    .   .   .   .   000010BF
//老版本的没有这个
    LiveUpd360.dll001E_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;       //文件下载全路径
    WCHAR wCurPath;   
}TASK,*PTASK;

typedef struct _CONFIG
{
    DWORD nUnknow1;             //指定为0xC,可能不同操作系统有所不同,如果不能用,自己去调试
    DWORD nDownSpeed;         //指定限制的下载速度,单位:字节
    DWORD nUploadSpeed;         //指定上传的速度,单位:字节
    CHARcUnknown2;
}CONFIG,*PCONFIG;所谓眼见为实,光说是没用的,上代码,只是片段
用到的全局变量HMODULE hModule;//全局变量
DWORD g_nTaskID;//全局变量wchar_t wDllPath={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=L"c://test/test.exe";
wchar_t wDownUrl=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获取任务信息,旧版本的没有这个导出函数,需要尝试的自己去试,不过猜想应该是_PPQueryTask2DWORD 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

yaxuan97 发表于 2016-5-23 09:40:06

看完了才发现是两年前的帖子

Tao0Lu 发表于 2018-3-3 19:26:14

前来考古

watermelon 发表于 2018-6-26 09:16:02

一知半解,但是感觉还是收获了许多,这个帖子里的是不是用到了类似dll劫持类似的技术?

0xAA55 发表于 2018-6-26 11:56:37

溯影 发表于 2018-6-26 09:16
一知半解,但是感觉还是收获了许多,这个帖子里的是不是用到了类似dll劫持类似的技术?
...

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

watermelon 发表于 2018-6-26 14:07:41

0xAA55 发表于 2018-6-26 11:56
否。所谓DLL劫持一般指的是写一个看起来一模一样的DLL让目标加载

哦哦,这个我又看了看好像是自己先分析哪些dll有用,然后用软件分析相应的dll里的一些导出函数,最后用那些导出函数和内嵌汇编来自己用,就好像是用360里的下载程序的函数来给自己下载东西的吧。下载东西程序看来还是比较考验人的,原文:360的下载接口,可以P2P下载,多线程,断点续传,即使下载的时候断电,重新开机也可以接着继续下载。
页: [1]
查看完整版本: 【转载】使用360安全卫士的下载接口