作者:juckerpp
文件夹内有几个文件,分别是main.dat,start.exe
OD加载start.exe,退出,弹出软件窗口,OD下断CreateProcess,发现其打开的是main.dat,用UE查看main.dat, 原来是个可执行文件被改名了,于是改名为main.exe。
PE查壳 ASPack 2.12 -> Alexey Solodovnikov
直接cooldumper搞定
开始分析
点击登录,出现MessageboxW,未注册用户,窃喜,bp MessageBoxW.
果断断住,看堆栈调用情况
0013F550 0065A066 /CALL 到 MessageBoxW
0013F554 007802CC |hOwner = 007802CC ('三国哈哈 1.17',class='TLoginForm',parent=018803B2)
0013F558 00C6F33C |Text = "?,B4,"",D7,"",A2,"",B2,"嵊?,BB,"?
0013F55C 00C76544 |Title = ""D7,"",A2,"意"
0013F560 00000000 \Style = MB_OK|MB_APPLMODAL
0013F564 0013F93C 指向下一个 SEH 记录的指针
0013F568 00546D1F SE处理程序
0013F56C 0013F5F8
0013F570 0013F798
0013F574 0044E700 dumped_.0044E700
0013F578 00BC67C0 ASCII "pkD"
0013F57C 00000000
0013F580 00000000
0013F584 00000000
0013F588 00000000
0013F58C 00000000
0013F590 00000000
0013F594 00000000
0013F598 00000000
0013F59C 00000000
0013F5A0 00C6F33C ASCII "*g鑜孮(u7b"
0013F5A4 00C76544
0013F5A8 00000000
0013F5AC 00000000
0013F5B0 00C8AA7C UNICODE "d00b-207dcdd2"
0013F5B4 00C8AA1C UNICODE "D00B-207DCDD2"
0013F5B8 00C8AA4C UNICODE "d00b-207dcdd2"
0013F5BC 00C8EC14 UNICODE "D:\sg117\script\"
0013F5C0 00000000
0013F5C4 00000000
0013F5C8 00000000
0013F5CC 00000000
0013F5D0 00CA581C UNICODE "D:\sg117\upup.exe"
0013F5D4 00000000
0013F5D8 00CA57E4 UNICODE "D:\sg117\start.exe"
0013F5DC 00C8EC14 UNICODE "D:\sg117\script\"
0013F5E0 00000000
0013F5E4 00CA5774 UNICODE "D:\sg117\updata.exe"
0013F5E8 00000000
0013F5EC 00000000
0013F5F0 00C8A9EC UNICODE "D00B-207DCDD2"
看到最后面几行有D00b什么的,是软件上提示的机器码。其他没什么营养,先放住不管。
可能我才疏学浅,认为这种外挂一定是网络验证的,所以也没去深究这个D00B什么的,既然MessageBox没看出什么端倪,换方法。
bp send, bp recv全部打好断点
点击登录。断下在bp send ,看发包data,是明文,如下
0013F2A8 |00C214F8 ASCII "GET Http://60.190.222.188:8000/wglogin/wglogin.asp?id=9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B9EA8330EFCB1E3BCF8E6CA50C8AA1E6B98F7A78CB1449ADBF6DC2C2DECE8F09C85&port=8020 HTTP/1.1",CR,LF,"Host: 60.190.222.188",CR,LF,"Connection: Ke"...
好长的一段串啊,不管它查下堆栈很容易发现它的组包过程。
几个Unicode串摆在堆栈里面,是由之前的D00B-207DCDD2+我硬盘号+我MAC地址+一个时间数,然后看长度好像将这些参数组合进行了一 次SHA运算,得出的这个串.当然这只是猜想,我认为没必要去跟组包的算法。毕竟网络验证都是通过回包的信息进行各种跳,各种逻辑的。
直接F9跑到recv这里看看,收包明文,如下
0013F274 |0110A048 ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAEDGWE29AB8C"
恩服务器回来的包很短REG:AAEDGWE29AB8C
分析一下发包的包值吧,每次发包相同值都是9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B
不同点的地方在于后面,如果我每次把不同的值记录下来,发一样的,服务器是否会给我回一样的包呢,测试一下。
使用一次截获的包进行测试F7A78CB1449ADBF6DC2C2DECE8F09C85
013F2A8 |00C214F8 ASCII "GET Http://60.190.222.188:8000/wglogin/wglogin.asp?id=9D1669ADA23091A6F454E45991E4EB2258E2B2DF5B591B9EA8330EFCB1E3BCF8E6CA50C8AA1E6B98F7A78CB1449ADBF6DC2C2DECE8F09C85&port=8020 HTTP/1.1",CR,LF,"Host: 60.190.222.188",CR,LF,"Connection: Ke"...
服务器回的
结果两次完全一致
0013F274 |0110A048 ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAED1FAE8829AB8C"
0013F274 |0110A048 ASCII "HTTP/1.1 200 OK",CR,LF,"Connection: keep-alive",CR,LF,"Content-Type: text/html",CR,LF,"Content-Length: 20",CR,LF,"Server: Indy/9.00.10",CR,LF,CR,LF,"REG:AAED1FAE8829AB8C"
由此断定,服务器那边并没有随机算法。客户端和服务器端只有一方进行了随机处理,外挂并没有做双面的随机同步。
那么请各位大牛帮小弟分析一下这样做是否可行?
hook其Send Api,修改验证服务器地址,改写为本地
购买一个正版KEY,截获正确的发包收包的数据,记录
然后每次hook Send将包重组,发给本地服务器,本地服务器返回刚才截获到的正确回包值,是否就可以破解。
追到了一个地方,那个地方将Reg后面的值push进去,但是在里面没进行什么操作就ret了。不知道是不是关键点。
00426FB5 85C0 test eax, eax
00426FB7 74 05 je short 00426FBE
00426FB9 83E8 04 sub eax, 4
00426FBC 8B00 mov eax, dword ptr [eax]
00426FBE 8BD8 mov ebx, eax
00426FC0 85DB test ebx, ebx
00426FC2 74 16 je short 00426FDA
00426FC4 8BCB mov ecx, ebx
00426FC6 03C9 add ecx, ecx
00426FC8 8B55 E0 mov edx, dword ptr [ebp-20] ; 将 服务器返回信息给edx
00426FCB 8B45 F8 mov eax, dword ptr [ebp-8]
00426FCE E8 81C4FDFF call 00403454
下了内存访问断追到这里。EDX里面保存着服务器返回REG后面的信息,但是不知如何追到比对算法。