工具:Exeinfo PE ver0.0.5.2 - 2018 ( 1021 + 69 signatures x64 ) ;OD
说明:这个程序来源于网络,是2017年的版本了,只是有兴趣,并无盗版之意,只为探讨和交流。
这段时间在研究网路通信的问题,拿了几个软件学习了一下,写下一点体会。
先查壳:
无壳:Microsoft Visual C++ v.12 - 2013 ( E8 6A14 - WinXP ) www.microsoft.com [ Debug:02 ] 开OD,加载 金钻指标启动器.exe,F9正常运行,出现登陆对话框, 随便输入
用户名:88888888888888
密码:88888888888888
点击登录,出现:网络链接失败 看来服务器可能有问题。 OD中搜索一下字符,找到4处:
00403374 |. 68 D0815400 push 0x5481D0 ; |网络链接失败
00404373 . 68 D0815400 push 0x5481D0 ; 网络链接失败
00404BAA |. 68 D0815400 push 0x5481D0 ; 网络链接失败
00404EAB |. 68 D0815400 push 0x5481D0 ; |网络链接失败
全部都是明码,4处可以一一下F2断点,但我想研究一下,主程序注册时,想从服务方的服务器得到什么,也就是服务方的服务器回答给我这个用户机什么,才能让这个程序正常运行。
下面给ws2_32.inet_addr和ws2_32.connect函数下F2断点,
71A22EE1 ws2_32.inet_addr 6A 10 push 0x10
71A24A07 ws2_32.connect 8BFF mov edi,edi
OD重新运行程序,点击登录按钮:
断在71A22EE1 ws2_32.inet_addr 6A 10 push 0x1 看寄存器:EAX 00128E74 ASCII "112.74.54.28"
找到了服务器的IP地址,我们对这个IP地址来验证一下,ping 112.74.54.28一下:
在使用的,有效的IP。
客户机和服务机需要通信,我到ws2_32.send函数下F2断点:
71A24C27 ws2_32.send 8BFF mov edi,edi
OD重新加载主程序,取消ws2_32.inet_addr和ws2_32.connect断点,F9,点击登录按钮,断在:
71A24C27 ws2_32.send 8BFF mov edi,edi
Alt+F9回到主程序领空, 00402D4A |. 6A 00 push 0x0 ; /Flags = 0
00402D4C |. 68 00010000 push 0x100 ; |DataSize = 100 (256.)
00402D51 |. 8D4424 18 lea eax,dword ptr ss:[esp+0x18] ; |
00402D55 |. 50 push eax ; |Data = FFFFFFFF
00402D56 |. FF75 08 push dword ptr ss:[ebp+0x8] ; |Socket = 0x12C
00402D59 |. FF15 F8545100 call dword ptr ds:[0x5154F8] ; \send
00402D5F |. 33C9 xor ecx,ecx
00402D61 |. 3D 00010000 cmp eax,0x100 ;
00402D66 |. 5F pop edi
00402D67 |. 0f94c1 sete cl
00402D6A |. 8BC1 mov eax,ecx
00402D6C |. 8B8C24 30010000 mov ecx,dword ptr ss:[esp+0x130]
00402D73 |. 5E pop esi
00402D74 |. 5B pop ebx
00402D75 |. 33CC xor ecx,esp
00402D77 |. E8 A03E0000 call 00406C1C ; 金钻指标.00406C1C
00402D7C |. 8BE5 mov esp,ebp
00402D7E |. 5D pop ebp
00402D7F . C3 retn
我们来看一下这段代码,发现从ws2_32.send函数返回后寄存器eax有一个比较语句:
00402D61 |. 3D 00010000 cmp eax,0x100 ;
看看实际返回的eax值:
Eax=0xFFFFFFFF,表示错误,与0x100不符,标记这段语句:
00402D61 |. 3D 00010000 cmp eax,0x100 ;
我到ws2_32.recv函数下F2断点:
71A2676F ws2_32.recv 8BFF mov edi,edi
00402D61下F2断点。
OD重新加载主程序,点击登录按钮,断在00402D61,将eax赋值0x100,F9,断在
71A2676F ws2_32.recv 8BFF mov edi,edi
Alt+F9回到主程序领空,
00403040 |> /6A 00 /push 0x0 ; /Flags = 0
00403042 |. |B8 00010000 |mov eax,0x100 ; |
00403047 |. |2BC6 |sub eax,esi ; |
00403049 |. |50 |push eax ; |BufSize = FFFFFFFF (-1.)
0040304A |. |8D043E |lea eax,dword ptr ds:[esi+edi] ; |
0040304D |. |50 |push eax ; |Buffer = FFFFFFFF
0040304E |. |53 |push ebx ; |Socket = 0x138
0040304F |. |FF15 FC545100 |call dword ptr ds:[0x5154FC] ; \recv
00403055 |. |85C0 |test eax,eax
00403057 |. |7E 0C |jle short 00403065 ; 金钻指标.00403065
00403059 |. |03F0 |add esi,eax
0040305B |. |81FE 00010000 |cmp esi,0x100
00403061 |.^\7C DD \jl short 00403040 ; 金钻指标.00403040
00403063 |. EB 02 jmp short 00403067 ; 金钻指标.00403067
00403065 |> 8BF0 mov esi,eax
00403067 |> 81FE 00010000 cmp esi,0x100 ;
0040306D |. 74 06 je short 00403075 ; 金钻指标.00403075
0040306F |. 5F pop edi
00403070 |. 5E pop esi
00403071 |. 33C0 xor eax,eax
00403073 |. 5B pop ebx
00403074 |. C3 retn 我们看一下00403065和00403067,这两条语句相当于cmp eax,0x100
我们看看eax实际返回的值: Eax=0xFFFFFFFF,表示错误,与0x100不符,标记这段语句:
00403067 |> 81FE 00010000 cmp esi,0x100 ;
将esi赋值0x100,F8,到
00403081 |. 33C0 xor eax,eax
00403083 |. 813F FC00E88C cmp dword ptr ds:[edi],0x8CE800FC
我们到数据窗口看看dword ptr ds:[edi]的值 堆栈 ds:[00128EC0]=76767676,不等于0x8CE800FC,我们将这个值赋给他,F9,程序进入正常界面:
|