嗨,大家好,逆向学习有那么几天了,得有点小产品吧,哈哈……,现在把逆向快播的经验贴出来,大家技术交流啊,对了,只是技术交流啊,其它的与我无关…。
快播播放器里面有三个文件,我们需要用到,为什么呢?自己看吧,因为快播是p2p机制的传输协议,所以我们只要快播涉及p2p的软件块就行了。
好了,以下是部分分析,聪明的你们一定会摸索出他们的规律(主要是获取任务的信息),主要代码已经打包了哦。
有图有真相……
成功的应用…
先贴出OD加载快播时逆向的分析吧
加载时触发
0049ECF9 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 加载时触发 1
0049ECFF |. 3BCB cmp ecx, ebx ; 判断 dd_568328 是否为零
0049ED01 |. 74 04 je short 0049ED07
0049ED03 |. 8B01 mov eax, dword ptr [ecx]
0049ED05 |. FF10 call dword ptr [eax] ; 调用 dd_568328 ;无参
直接调用 _InitQvodNet
0049F444 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 加载时触发 2
0049F44A |. 85C9 test ecx, ecx
0049F44C |. 74 55 je short 0049F4A3
0049F44E |. 8B01 mov eax, dword ptr [ecx]
0049F450 |. 56 push esi ;FFFFFFF
0049F451 |. FF50 40 call dword ptr [eax+40] ; 一个参数
传递一个参数为 FFFFFFF的值 给函数 call dword ptr [eax+40]
返回值为零
0049EDA7 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 加载时触发 3
0049EDAD |. 8B11 mov edx, dword ptr [ecx]
0049EDAF |. 53 push ebx ;ebx=0
0049EDB0 |. 50 push eax ; F:\Media\
0049EDB1 |. FF52 0C call dword ptr [edx+C] ; 调用dd_568328+c函数
0049EDB4 |> 8B35 34A35100 mov esi, dword ptr[<&KERNEL32.GetLogi>; kernel32.GetLogicalDriveStringsW 两个参数
初始化路径函数 dword ptr [edx+c]("F:\Media\",0)
0049EE26 |. 8B0D 28835600 |mov ecx, dword ptr [568328] ; 调用 568326 加载时触发 4
0049EE2C |. 8B01 |mov eax, dword ptr [ecx]
0049EE2E |. 53 |push ebx ebx=0
0049EE2F |. 56 |push esi ;路径=F:\Media\
0049EE30 |. FF50 0C |call dword ptr [eax+C] ; 初始化下载路径吧 两个参数
初始化路径
0042D6FF |. 8B0D 28835600 ||mov ecx, dword ptr [568328] ; 调用 568326 加载时触发 5
0042D705 |. 8D5424 10 ||lea edx, dword ptr [esp+10]
0042D709 |. 52 ||push edx ;weizhi
0042D70A |. 8D5424 34 ||lea edx, dword ptr [esp+34]
0042D70E |. 8BF8 ||mov edi, eax
0042D710 |. 52 ||push edx ;weizhi
0042D711 |. 897424 38 ||mov dword ptr [esp+38], esi
0042D715 |. 8B01 ||mov eax, dword ptr [ecx]
0042D717 |. 57 ||push edi
0042D718 |. FF50 30 ||call dword ptr [eax+30] ;三个参数
循环触发 获得任务个数 以及某数值
00430940 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 dd568328 加载时触发 6 兼 添加网络任务触发 顺序3
00430946 |. 8B01 mov eax, dword ptr [ecx]
00430948 |. 83C4 0C add esp, 0C
0043094B |. 8D5424 20 lea edx, dword ptr [esp+20]
0043094F |. 52 push edx ;未知
00430950 |. FF7424 18 push dword ptr [esp+18] ;未知 但数值显示为256
00430954 |. 56 push esi ;esi=DE4AB6647FA65E303165CACDCEAB741147387B07
00430955 |. FF50 48 call dword ptr [eax+48] ;三个参数
连接触发
0042FA84 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 连接触发
0042FA8A |. 8B11 mov edx, dword ptr [ecx]
0042FA8C |. 57 push edi ;edi=0
0042FA8D |. 83C0 04 add eax, 4
0042FA90 |. 50 push eax ;eax=hash=DE4AB6647FA65E303165CACDCEAB741147387B07
0042FA91 |. FF52 28 call dword ptr [edx+28] ;两个参数
断开触发
0042FA9C |. 8B0D 28835600 mov ecx, dword ptr [568328] ;断开触发
0042FAA2 |. 8B11 mov edx, dword ptr [ecx]
0042FAA4 |. 57 push edi ;edi=0
0042FAA5 |. 83C0 04 add eax, 4
0042FAA8 |. 50 push eax ;hash=DE4AB6647FA65E303165CACDCEAB741147387B07
0042FAA9 |. FF52 24 call dword ptr [edx+24] ;两个参数
修改路径触发
00491226 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 修改路径触发
0049122C |. 85C9 test ecx, ecx
0049122E |. 74 08 je short 00491238
00491230 |. 8B1B mov ebx, dword ptr [ebx]
00491232 |. 8B01 mov eax, dword ptr [ecx]
00491234 |. 53 push ebx ;//路径
00491235 |. FF50 18 call dword ptr [eax+18] ;一个参数
全部连接触发
004AA8CE |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 全部连接触发调用 568328
004AA8D4 |. 83C4 0C add esp, 0C
004AA8D7 |. 3BCB cmp ecx, ebx
004AA8D9 |.^ 0F84 3CE4FFFF je 004A8D1B
004AA8DF |. 8B01 mov eax, dword ptr [ecx] ;
004AA8E1 |. 6A 01 push 1 ; 估计个数
004AA8E3 |. 8D9424 380A00>lea edx, dword ptr [esp+A38]
004AA8EA |. 52 push edx ; 0
004AA8EB |. FF50 28 call dword ptr [eax+28] 两个参数
//全部断开触发
004AA924 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 //全部断开触发
004AA92A |. 83C4 0C add esp, 0C
004AA92D |. 3BCB cmp ecx, ebx
004AA92F |.^ 0F84 E6E3FFFF je 004A8D1B
004AA935 |. 33C0 xor eax, eax
004AA937 |. 833D E48D5600>cmp dword ptr[568DE4], 1
004AA93E |. 6A 01 push 1
004AA940 |. 0F9FC0 setg al
004AA943 |. 8D9424 380A00>lea edx, dword ptr [esp+A38]
004AA94A |. 52 push edx =0
004AA94B |. A3 4C875600 mov dword ptr [56874C], eax
004AA950 |. 8B01 mov eax, dword ptr [ecx]
004AA952 |. FF50 24 call dword ptr [eax+24] ; 全部断开 两个参数
删除任务触发
0042FE34 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 568328 删除任务触发
0042FE3A |. FF75 A4 push dword ptr [ebp-5C] ;ebp-5c=hash=DE4AB6647FA65E303165CACDCEAB741147387B07
0042FE3D |. 8B01 mov eax, dword ptr [ecx]
0042FE3F |. FF50 20 call dword ptr [eax+20] ;一个参数
播放触发
0042F3DC |> /8B0D 28835600 /mov ecx, dword ptr [568328] ; 调用 568328 播放触发
0042F3E2 |. |8B7424 2C |mov esi, dword ptr [esp+2C]
0042F3E6 |. |8B01 |mov eax, dword ptr [ecx]
0042F3E8 |. |8D5424 18 |lea edx, dword ptr [esp+18] ;edx=77CF7094(ntdll.KiFastSystemCallRet)
0042F3EC |. |52 |push edx
0042F3ED |. |FF7424 14 |push dword ptr [esp+14]
0042F3F1 |. |56 |push esi ;esi=DE4AB6647FA65E303165CACDCEAB741147387B07
0042F3F2 |. |FF50 3C |call dword ptr [eax+3C] ;三个参数
循环触发 每0.2秒触发哟
0042D6A9 |. 8B0D 28835600 |mov ecx, dword ptr [568328] ; 调用 dd_568328 循环触发 每0.2秒触发哟
0042D6AF |. 69C0 54040000 |imul eax, eax, 454
0042D6B5 |. 8D5424 10 |lea edx, dword ptr [esp+10] ;任务个数
0042D6B9 |. 52 |push edx
0042D6BA |. 8D5424 34 |lea edx, dword ptr [esp+34] ;edx=330f
0042D6BE |. 52 |push edx ;
0042D6BF |. FF7424 1C |push dword ptr [esp+1C] ;hash zhi ? (ASCII"03C61BC8CE96CB5072C9E149DE7771C9D6A03E24")
0042D6C3 |. 894424 3C |mov dword ptr [esp+3C], eax
0042D6C7 |. 8B01 |mov eax, dword ptr [ecx]
0042D6C9 |. FF50 30 |call dword ptr [eax+30] ;三个参数 非常可疑
添加网络任务触发
0042F0D1 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 dd568328 添加网络任务触发 顺序1
0042F0D7 |. 8B01 mov eax, dword ptr [ecx]
0042F0D9 |. 53 push ebx ;ebx=0
0042F0DA |. 8D55 C4 lea edx, dword ptr [ebp-3C]
0042F0DD |. 52 push edx ;edx=0 有十个四字节数为零
0042F0DE |. 57 push edi ;edi=qvod://189694296|DE4AB6647FA65E303165CACDCEAB741147387B07|你是我爱人_22.rmvb|
0042F0DF |. FF50 04 call dword ptr [eax+4] ;三个参数
0042F163 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 dd568328 添加网络任务触发 顺序2
0042F169 |. 8B11 mov edx, dword ptr [ecx]
0042F16B |. 50 push eax ;估计 某内存块地址 因为为初始化
0042F16C |. 8945 C0 mov dword ptr [ebp-40], eax
0042F16F |. 8D45 C4 lea eax, dword ptr [ebp-3C]
0042F172 |. 50 push eax ;eax=DE4AB6647FA65E303165CACDCEAB741147387B07
0042F173 |. FF52 44 call dword ptr [edx+44] ;两个参数
00430940 |. 8B0D 28835600 mov ecx, dword ptr [568328] ; 调用 dd568328 添加网络任务触发 顺序3
00430946 |. 8B01 mov eax, dword ptr [ecx]
00430948 |. 83C4 0C add esp, 0C
0043094B |. 8D5424 20 lea edx, dword ptr [esp+20]
0043094F |. 52 push edx ;未知
00430950 |. FF7424 18 push dword ptr [esp+18] ;未知 但数值显示为256
00430954 |. 56 push esi ;esi=DE4AB6647FA65E303165CACDCEAB741147387B07
00430955 |. FF50 48 call dword ptr [eax+48] ;三个参数
看着上面的代码,是不是显得很无助啊?没事,接着看,我来讲解下原因。
快播启动时,加载了QvodNet.dll文件,该文件有什么用呢?答案是控制p2p资源下载以及限速的操作,上面逆向代码都是对这的分析,也就是说,只要围绕这它,你就掌握了逆向快播了,随时随地下载快播资源,包括最新的电影,具体操作请下载下载包,看代码吧。
代码部分讲解---
启动时
//#ifdef _DEBUG cmd窗体 以后输出的信息都在这显示
AllocConsole();
freopen("CONOUT$","w+t",stdout);
//#endif
//为什么添加这段?防止快播自动下载更新。有些模块地址不一样,所以要禁止更新。
{
TCHARpath[MAX_PATH] = {0};
::GetModuleFileName(NULL,path,MAX_PATH);
CStringstrUpdate(path);
strUpdate.Replace(_T("TestQvod.exe"),_T("update.jpg"));
::CreateFile(strUpdate,GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN,NULL);
}
程序中有全局变量
BYTE*m_byteBuffer=NULL; //从内存中读出的消息全部放到这变量中(消息含有任务MD5值、路径、影片名、文件大小、已下载大小、是否下载……等等)
HMODULEm_hMouleQvodNet; //句柄
DWORDm_dFunctionHandle,m_dHandle; //消息句柄
DWORDd_517864; //一个地址
//逆向快播的初始化
void CTestQvodDlg::OnInitQvodNet()
//获得任务信息,获取任务个数,传参任务的MD5,返回值为零成功,其它不成功,成功时读取的信息有(消息含有任务MD5值、路径、影片名、文件大小、已下载大小、是否下载……等等),每个任务都有,只是要懂的这个任务类的结构大小,就好定位了,源码已经写好了。
int CTestQvodDlg::GetTaskInfo(int *pLength,int *task)
//点击连接 里面有测试MD5值
在项目中有文件videolist.db 里面有很多测试的任务,你们可以了解下。其它的就说了,详细看代码哟。
下载地址:http://download.csdn.net/detail/banketree/4416468