2014年12月20日 星期六

彩虹冒險私服編程 (五) - 如何模擬成功登入封包

Format:   [iosocket.CGenericMessage::GetSize] [iosocket.CGenericMessage::GetType]               [iosocket.CGenericMessage::CheckError] [iosocket.CGenericMessage::MakeDigest]
[iosocket.CGenericMessage::GetState][Data]
Packet Content: [Packet length] [Packet type] [Magic header] [Checksum] [Packet State][Data]
Length:    [4 bytes] [4 bytes] [4 bytes] [4 bytes] [4 bytes][N bytes]

分析:
1.編寫初步payload
AA AA AA AA BB BB BB BB CC CC CC CC DD DD DD DD EE EE EE EE FF

AA=最後根據封包長度而填寫(注意16進制)
2.找Packet type(BB)
利用字串 找到Enter Channel字樣
Address: 484DB0

利用CE找  484DB0
找到其中一個結果是00700783 call 484DB0
向上找到700430
這個地址是UDP接收到封包後會根據你的Packet type而去跳到不同的function(做不同的工作)
我們可以發現700430 是其中一個function

0070046F會判斷目前GameState是否等於4(cmp dword ptr ds:[0x7E00D0],0x4)
不是的話就跳到00700507
我們可以發現00700507對接收回來的封包讀到第0x24的內容(4 bytes)
mov eax,dword ptr ds:[esi+0x24]
由於我們不是GameState=4 因此我們可以知道由0x16~0x24內容是對我們沒有用,利用0x00進行填充

目前的Payload:
AA AA AA AA BB BB BB BB CC CC CC CC DD DD DD DD EE EE EE EE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


而0070050A進行了比較 先將0x24的內容進行讀取,再加上-0x64,最後結果比較是不是0x8
我們向下可以看到位於00700510 (ja 007007F8)比較eax是不是大於8 大於8就跳
007007F8 不是我們想跳的地方 我們要跳回00700783附近地址 讓封包接收後 我們就能call 484DB0(讓遊戲進入選頻)
經過強制修改eax後 我們最後發現eax=0x7 先會跳到007006AB
所以我們只要把0x64+0x7=0x6B
只要我們的封包內容是6B 00 00 00,系統就會判斷跳到007006AB
目前的Payload:
AA AA AA AA BB BB BB BB CC CC CC CC DD DD DD DD EE EE EE EE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6B 00 00 00

位於007006C9 (repe cmps byte ptr es:[edi],byte ptr ds:[esi])
先把edi寫入"SPEEDHACK"字串
跟esi判斷到底是否跟相同
不相同就跳到00700706

位於00700714 (repe cmps byte ptr es:[edi],byte ptr ds:[esi])
先把edi寫入"prev ping"字串
跟esi判斷到底是否跟相同
相同就不用跳

最後會運行到我們想要到的地址00700783(call 00484DB0)

最後的封包構成:
32 00 00 00 21 11 00 00 1C 2B 00 00 A4 C7 C0 71 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6B 00 00 00 70 72 65 76 20 70 69 6E 67 00
加密後:
32 00 00 00 F6 77 FF FF 1F A6 FF FF DA C1 F9 74 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF A4 FF FF FF 7C 6C D4 4C FE 7C B4 8C C4 FF


2014年12月14日 星期日

彩虹冒險私服編程 (四) - 如何解密封包

加密send fucntion:  
01833B60    57              push edi
01833B61    8B7C24 0C       mov edi,dword ptr ss:[esp+0xC]
01833B65    33C9            xor ecx,ecx
01833B67    85FF            test edi,edi
01833B69    7E 1D           jle Xiosocket.01833B88
01833B6B    56              push esi
01833B6C    8B7424 0C       mov esi,dword ptr ss:[esp+0xC]
01833B70    8A0431          mov al,byte ptr ds:[ecx+esi]
01833B73    F6D0            not al
01833B75    8AD0            mov dl,al
01833B77    C0EA 05         shr dl,0x5
01833B7A    C0E0 03         shl al,0x3
01833B7D    0AD0            or dl,al
01833B7F    881431          mov byte ptr ds:[ecx+esi],dl
01833B82    41              inc ecx
01833B83    3BCF            cmp ecx,edi
01833B85  ^ 7C E9           jl Xiosocket.01833B70
01833B87    5E              pop esi
01833B88    5F              pop edi
解密send fucntion:  
01833B90    57              push edi
01833B91    8B7C24 0C       mov edi,dword ptr ss:[esp+0xC]
01833B95    33C9            xor ecx,ecx
01833B97    85FF            test edi,edi
01833B99    7E 1D           jle Xiosocket.01833BB8
01833B9B    56              push esi
01833B9C    8B7424 0C       mov esi,dword ptr ss:[esp+0xC]
01833BA0    8A0431          mov al,byte ptr ds:[ecx+esi]
01833BA3    8AD0            mov dl,al
01833BA5    C0EA 03         shr dl,0x3
01833BA8    C0E0 05         shl al,0x5
01833BAB    0AD0            or dl,al
01833BAD    F6D2            not dl
01833BAF    881431          mov byte ptr ds:[ecx+esi],dl
01833BB2    41              inc ecx
01833BB3    3BCF            cmp ecx,edi
01833BB5  ^ 7C E9           jl Xiosocket.01833BA0
01833BB7    5E              pop esi
01833BB8    5F              pop edi

加密前send內容:
0012FD0C  88 00 00 00                                                                             ?..
0012FD1C  07 27 00 00 1C 2B 00 00 88 FE 35 C2 FF FF FF FF             '.. +..5?
0012FD2C  8D F8 A1 29 4C 24 A5 8C 4C 6D A5 D6 C6 E2 C2 4E        ?L$?Lm皮齋
0012FD3C  0B 85 73 80 FC 0A 79 D9 CF 7B 21 C0 78 2A 81 FC            €?y棝{!儲*
0012FD4C  3F 38 6E 00 23 16 00 00 61 6C 61 6E 00 85 17 00                 ?8n.# ..alan.?.
0012FD5C  00 00 00 00 FE 31 32 33 00 FF FF FF 00 00 00 C0                ....123....
0012FD6C  14 C7 FB 02 75 1C 00 00 1A 03 38 02 00 04 00 03                u .. 8 . .
0012FD7C  00 F4 70 00 00 00 00 00 E0 FD 12 00 00 00 00 00                .皫.....僣 .....
0012FD8C  E1 82 D2 77 20 0D 81 00 E1 82 D2 77 00 00 00 00               ?烅 .??烅....
0012FD9C  C8 05 00 00                                                                             ?..

加密後send內容:
0012FD0C  88 00 00 00                                                                               ?..
0012FD1C  C7 C6 FF FF 1F A6 FF FF B8 4D A3 D9 00 00 00 00            ?碉?....
0012FD2C  93 38 F2 B6 9D DE D2 9B 9D 94 D2 49 C9 E8 E9 8D           ?繲??洍扢?
0012FD3C  A7 D3 64 FB 18 AF 34 31 81 24 F6 F9 3C AE F3 18            志d??1?穱<氦
0012FD4C  06 3E 8C FF E6 4F FF FF F4 9C F4 8C FF D3 47 FF           >?潗??笉
0012FD5C  FF FF FF FF FF 76 6E 66 FF FF FF FF FF FF FF FF  vnf
0012FD6C  5F C1 20 EF 54 1F FF FF 2F E7 3E EF FF DF FF E7           _?餰 /???
0012FD7C  FF 58 7C FF FF FF FF FF F8 10 6F FF FF FF FF FF           X|?o
0012FD8C  F0 EB 69 44 FE 97 F3 FF F0 EB 69 44 FF FF FF FF            謻iD??謻iD
0012FD9C  B9 D7 FF FF                                                                           塽
 紅字: username
 藍字: password





2014年12月8日 星期一

彩虹冒險私服編程 (三) - 修改Server連接配置

原TCP Server IP: 95.211.178.168
原TCP Server Port: 22002

目測Server端由Web,TCP及UDP組成
TCP會處理登入部份
Web只會顯示當前時間給系統判斷是否進行維護

修改Server IP:
1.增加/config/gng.ini

登入流程:
1.與Server進行TCP連接,成功的話會傳message給WinProc處理跳進選頻道界面
2.TCP不能連接就會跳到004831B0
3.判斷當前時間,如果是0700~0900就會顯示維護中
4.否則會彈錯誤信息

/config/gng.ini:
[Server]
Login Server Port=1234
Login Server IP=你的外網IP

IP限制
1.127.0.0.1

P.S:假設你是使用路由器用戶,建議Login Server IP填寫為192.x.x.x
      假設你是外網IP用戶,建議Login Server IP為你的外網IP







2014年12月7日 星期日

彩虹冒險私服編程 (二) - 如何使用Ollydbg進行調試及繞過遊戲保護

初步資料及工具搜集


1.CE6.3,UCE可以用

P.S:
>>Debug不能及OD不能附加
>>CE必須先開,否則IOProtect會偵測

2.XueTr

未有發現任何inline/ssdt hook

3.利用ollydbg 進行調試
條件:
>>必須強制關掉IOProtect
>>必須nop掉update.exe檢測

利用以下bypass即可使用OD跟CE進行調試
----------bypass IOProtect----------
Credit: alanlei
=>2004年國際版
patch update:
00402CC5 jmp 00402D24
004023FC  jmp 0040251A

=>2011年無殼版
patch update:
00404A1B jmp 00404B18
Remark:RegCreateKeyExA

patch IOProtect detection:
00404346 jmp 00404535

附上教學影片:
https://www.youtube.com/watch?v=srJc5ZXYhL0