UID 2
精华
积分 7736
威望 点
宅币 个
贡献 次
宅之契约 份
最后登录 1970-1-1
在线时间 小时
电驴资源下载.exe
(1.34 MB, 下载次数: 5)
这个是源文件,早上刚下的时候,我震惊了,输入verycd网址,如http://www.verycd.com/topics/2922088/ 不一会就会在下面出现解析出来的ed2k地址
因为大家知道电驴是现在设置了权限的,如果你不是钻石级会员,是没有下载链接的,这个工具却得到了链接
这是为什么呢?难道破解了?
带着这个疑问,开始着手研究,
使用ida分析该程序,蛮大的,1M+,一般1M意味着里面将有至少上10W行C/C++代码了,当然包括所有你链接的库
先来整体分析:export->start->WinMain,打开以后是这样:
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return sub_501092(hInstance, hPrevInstance, lpCmdLine, nShowCmd);
}
一般MFC才是这样,我们再往下看
signed int __stdcall sub_501092(int a1, int a2, int a3, int a4)
{
signed int v4; // ebx@1
int v5; // esi@1
int v6; // edi@1
int v7; // ecx@5
int v8; // eax@7
v4 = -1;
v5 = AfxGetThread();
v6 = *(_DWORD *)(AfxGetModuleState() + 4);
if ( sub_5053EC(a1, a2, a3, a4) && (!v6 || (*(int (__thiscall **)(int))(*(_DWORD *)v6 + 132))(v6)) )
{
if ( (*(int (__thiscall **)(int))(*(_DWORD *)v5 + 80))(v5) )
{
v8 = (*(int (__thiscall **)(int))(*(_DWORD *)v5 + 84))(v5);
}
else
{
v7 = *(_DWORD *)(v5 + 28);
if ( v7 )
(*(void (**)(void))(*(_DWORD *)v7 + 88))();
v8 = (*(int (__thiscall **)(int))(*(_DWORD *)v5 + 104))(v5);
}
v4 = v8;
}
AfxWinTerm();
return v4;
}
这回无疑了,不过我机子上没sig,我也不太用sig这玩意所以关键函数都显示不出来,不过左边解析出来的4000+函数,让我还是压力很大
MFC最彻底的逆向方式,还是找资源控件DLG,然后找各自消息回调,分析类成员函数和变量,这是个很痛苦的过程,需要在MFC的消息结构体中和各种复杂类中分析老长时间,所以需要有种投机取巧的方式
回到程序,点击提取按钮点击以后,会变成正在提取,根据这个提示,首先想到SetWindowText,或者是尝试ollydbg下消息断点(不过这玩意我懒得试了)
于是让IDA用Windbg来调试下断,不过断下来的有点让我不知所措:
BOOL __thiscall sub_4FF391(int this, LPCSTR lpString)
{
int v2; // eax@1
BOOL result; // eax@2
v2 = *(_DWORD *)(this + '8');
if ( v2 )
result = (*(int (__thiscall **)(int, LPCSTR))(*(_DWORD *)v2 + 128))(v2, lpString);
else
result = SetWindowTextA(*(HWND *)(this + 28), lpString);
return result;
}
再跟出去又出现了这个
v4 = (int)a1;
if ( a1 )
{
if ( a4 )
*(_DWORD *)a4 = 0;
v6 = 0;
switch ( a2 )
{
case 0:
v7 = a3;
*(_DWORD *)(v4 + 204) = 1;
sub_4A4170(v4 + 64, (LPCSTR)*v7);
sub_4FF391(v4, *(LPCSTR *)(v4 + 64));
*(_DWORD *)(v4 + 204) = 0;
SendMessageA(*(HWND *)(v4 + 28), 0x111u, (WPARAM)&unk_3000000, *(_DWORD *)(v4 + 28));
break;
可见最后只是发了一个WM_COMMAND给某控件,连网络函数的影子都没见到,所以得另想办法
不过留心输出,会发现:每解析出一个地址,会有:
Unloaded D:\Windows\system32\peerdist.dll
Unloaded D:\Windows\system32\AUTHZ.dll
Unloaded D:\Windows\system32\USERENV.dll
自然而然想到下断点到peerdist加载的时候,所以sxe ld:peerdist,不过结果我啥都没得到,可能我用法不对,windbg也不是一直用
那么我就只好采用最根本的方式,bp loadlibrary,这次再点按钮就断下了,从loadlibraryw回到上级调用,会发现进入了wininet.dll空间
这回一目了然了,果然还是调用了wininet api的,很多网络功能都是靠这个实现的,找到了根源,那么这回目标明确,
直接在httpopenrequest和httpsendrequest上下断,程序稳稳地断了下来,结果如图:
最主要看sendrequest第二个参数,他是请求的url,可以看到左边hex里www.verycd.gdajie.com/detail.htm?id=917073
而返回原程序领空,会发现这里有拼凑请求的代码段
最后拼凑的请求是:
EE FE EE FE EE FE EE FE 66 4C BA 45 B5 A8 00 1A 铪铪铪铪fL篍胆..
41 63 63 65 70 74 3A 20 69 6D 61 67 65 2F 67 69 Accept: image/gi
66 2C 20 69 6D 61 67 65 2F 62 6D 70 2C 20 69 6D f, image/bmp, im
61 67 65 2F 78 2D 78 62 69 74 6D 61 70 2C 20 69 age/x-xbitmap, i
6D 61 67 65 2F 6A 70 65 67 2C 20 69 6D 61 67 65 mage/jpeg, image
2F 70 6A 70 65 67 2C 20 61 70 70 6C 69 63 61 74 /pjpeg, applicat
69 6F 6E 2F 78 2D 73 68 6F 63 6B 77 61 76 65 2D ion/x-shockwave-
66 6C 61 73 68 2C 20 61 70 70 6C 69 63 61 74 69 flash, applicati
6F 6E 2F 76 6E 64 2E 6D 73 2D 65 78 63 65 6C 2C on/vnd.ms-excel,
20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 76 6E 64 application/vnd
2E 6D 73 2D 70 6F 77 65 72 70 6F 69 6E 74 2C 20 .ms-powerpoint,
61 70 70 6C 69 63 61 74 69 6F 6E 2F 6D 73 77 6F application/mswo
72 64 2C 20 2A 2F 2A 0D 0A 52 65 66 65 72 65 72 rd, */*..Referer
3A 20 68 74 74 70 3A 2F 2F 77 77 77 2E 76 65 72 : http://www.ver
79 63 64 2E 67 64 61 6A 69 65 2E 63 6F 6D 2F 64 ycd.gdajie.com/d
65 74 61 69 6C 2E 68 74 6D 3F 69 64 3D 39 31 37 etail.htm?id=917
30 37 33 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 073..Accept-Lang
75 61 67 65 3A 20 7A 68 2D 63 6E 0D 0A 00 AB AB uage: zh-cn...
不骗你们,当时我逆向CSDN免积分下载地址获取器,他也是这么干的
所以目标明确,只需要知道这个网站是干啥的就行了,可以发现,这个网正是原始的verycd,里面资源号和verycd都是一一对应的!!!
该程序间接用这个网站来进行搜索,而并没有做黑客的事
其实很多程序看起来像黑客,做的事情其实很简单,就是借用别人的东西,实际上没干什么事情
另外这个程序这么大,核心代码估计还上不了300行,所以肯定是静态链接的MFC库
以后就到www.verycd.gdajie.com 找东西好了