對一遊戲外掛淺淺的分析

前言:夜闌靜,已是凌晨2:11分,明天還要實習,但這幾天在研究一個網頁遊戲的輔助,也分享下自己的一些筆記和心得,雖然我是個大菜鳥。


真的是很遺憾,今天花了6,7個小時分析,基本上每一行都寫了註釋,後來分析了另外一個程序,註釋和斷點都清除了。下次一定要保存好!大家湊合着看吧T T


1.查殼
PEID---->ASPack 2.12 -> Alexey Solodovnikov
手脫
腳本脫
脫殼機脫
都行

記得用LordPE 和ImportREC 修復一下就好了。

2.來到代碼入口點:

004F568D >  55              push ebp
004F568E    8BEC            mov ebp,esp
004F5690    6A FF           push -0x1
004F5692    68 084B5500     push Dumped_.00554B08
004F5697    68 44804F00     push Dumped_.004F8044
004F569C    64:A1 00000000  mov eax,dword ptr fs:[0]
004F56A2    50              push eax
004F56A3    64:8925 0000000>mov dword ptr fs:[0],esp
004F56AA    83EC 58         sub esp,0x58
004F56AD    53              push ebx
004F56AE    56              push esi
004F56AF    57              push edi
明顯的C++頭。
我在MessageBoxA 下斷點:
註冊按鈕之後
斷下來了來到:

77D507EA >  8BFF            mov edi,edi
77D507EC    55              push ebp
77D507ED    8BEC            mov ebp,esp
77D507EF    833D BC14D777 0>cmp dword ptr ds:[0x77D714BC],0x0
77D507F6    74 24           je short user32.77D5081C
77D507F8    64:A1 18000000  mov eax,dword ptr fs:[0x18]
77D507FE    6A 00           push 0x0
77D50800    FF70 24         push dword ptr ds:[eax+0x24]
77D50803    68 241BD777     push user32.77D71B24
77D50808    FF15 C412D177   call dword ptr ds:[<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange
77D5080E    85C0            test eax,eax
77D50810    75 0A           jnz short user32.77D5081C
77D50812    C705 201BD777 0>mov dword ptr ds:[0x77D71B20],0x1
77D5081C    6A 00           push 0x0
77D5081E    FF75 14         push dword ptr ss:[ebp+0x14]
77D50821    FF75 10         push dword ptr ss:[ebp+0x10]
77D50824    FF75 0C         push dword ptr ss:[ebp+0xC]
77D50827    FF75 08         push dword ptr ss:[ebp+0x8]
77D5082A    E8 2D000000     call user32.MessageBoxExA
77D5082F    5D              pop ebp
77D50830    C2 1000         retn 0x10
因爲沒發現關鍵跳,因此我Ctrl+F9 F8 幾層之後,來到:

0048ED10   .  83EC 64       sub esp,64
0048ED13   .  56            push esi                                 ;  Dumped_.004613AC
0048ED14   .  8B7424 74     mov esi,dword ptr ss:[esp+74]            ;  Dumped_.00580070
0048ED18   .  57            push edi
0048ED19   .  8B7E 08       mov edi,dword ptr ds:[esi+8]
0048ED1C   .  57            push edi
0048ED1D   .  E8 0E410100   call Dumped_.004A2E30
0048ED22   .  83C4 04       add esp,4
0048ED25   .  85C0          test eax,eax
0048ED27   .  74 10         je short Dumped_.0048ED39
0048ED29   .  8D4424 08     lea eax,dword ptr ss:[esp+8]
0048ED2D   .  50            push eax
0048ED2E   .  56            push esi                                 ;  Dumped_.004613AC
0048ED2F   .  E8 FCE2FFFF   call Dumped_.0048D030
0048ED34   .  83C4 08       add esp,8
0048ED37   .  EB 42         jmp short Dumped_.0048ED7B
0048ED39   >  81FF 04000080 cmp edi,80000004                         ;  Switch (cases 80000002..80000004)
0048ED3F      75 04         jnz short Dumped_.0048ED45
0048ED41   .  8B0E          mov ecx,dword ptr ds:[esi]               ;  Case 80000004 (SINGLE STEP) of switch 0048ED39
0048ED43   .  EB 3A         jmp short Dumped_.0048ED7F
0048ED45   >  81FF 02000080 cmp edi,80000002
0048ED4B      75 12         jnz short Dumped_.0048ED5F
0048ED4D   .  8B16          mov edx,dword ptr ds:[esi]               ;  Case 80000002 (DATATYPE MISALIGNMENT) of switch 0048ED39
0048ED4F   .  8D4C24 08     lea ecx,dword ptr ss:[esp+8]
0048ED53   .  51            push ecx
0048ED54   .  52            push edx
這裏有一個跳是可以跳過messagebox的,可是我試了之後,發現程序跑飛,因此不得不再次找上一級的CALL。。。。
根據遠CALLF7  近CALL F8的原則  時時刻刻觀察OD的幾個窗口,真的叫一個目不轉睛!
跟蹤+跟蹤+再跟蹤!堅持+堅持+再堅持!
看到一行疑似註冊碼的字母,相當興奮,仔細一分析,原來是磁盤序列號,,接着是各種序列號,MAC,機器註冊碼,總之走了很久。
name和serial終於出現!本來要放棄的我又興奮起來了,可惜仔細分析之後,並沒有明碼比較,而是和http://www.etigou.com/jqm/index.php/index/zhuce/cardid/有關,於是我想 可能是網絡驗證。
fosom師傅之前雖然指點過 要修改幾個跳轉

但是接下來還是讓我發現了一個關鍵跳,只要修改一個 可以實現註冊界面上的爆破:

0040B9F2    33C9            xor ecx,ecx       此時;ecx=0
0040B9F4    41              inc ecx
0040B9F5    51              push ecx
0040B9F6    50              push eax
0040B9F7    3BC8            cmp ecx,eax       ;此時ecx=1 eax=0
0040B9F9    0F8F 8F020000   jg Dumped_.0040BC8E                      ; 關鍵跳,跳則死,不跳成功    (但是這個程序跳了之後再次運行到這裏的時候必須不跳)

ecx 此處是計註冊次數用的
爆破1.
我先將jg 改成je 發現可以註冊成功,但是註冊成功的窗口i一直彈出,關了繼續彈出。
面對這樣,我寫了個內存註冊機,點擊註冊之前先將jg改成je,彈出框後再將je改成jg,於是就成功提示“註冊成功”了。
爆破2.
我在想,如果可以將eax改成1的話,那麼也能實現第一次不跳,之後跳轉恢復,實現爆破,可惜字節不夠,fosom師傅說用SMC技術,可是我找了一下,CC也很少。。
最後我往上找,
把0040B9F2    33C9            xor ecx,ecx
改成not ecx  讓ecx=FFFFFFFF  
成功實現了爆破
爆破3.
我繼續往上找:
想辦法讓一個寄存器的值=1,我是讓EDX=1了
然後在0040B9F7    3BC8            cmp ecx,eax 
這一句上,將eax改成edx 也能實現爆破。


其實我覺得 還有很多方法的,比如說,既然關鍵跳是0040B9F9    0F8F 8F020000   jg Dumped_.0040BC8E  
而JG的測試條件是SF=OF且ZF=0,我們是否能找到影響標誌位的語句來影響這個跳轉呢?



如圖所示:
1,在需要改的jne,修改成jmp。
2,在所在模塊,找9個空字節(連續的CC很多,容易找)。
  這樣就實現了,運行一次就自動恢復原有代碼。






我覺得很不錯,今天雖然累了 明天還要實習。但是收穫頗多,我會繼續努力的!


當然還有點問題,雖然只改了和少部分代碼,但是還是有功能失效了,我覺得可以用對比分析來找出失效的原因,再加以改正就能成功。


努力早就實力!態度決定高度!
加油~!
                                                       2013.6.26.凌晨3點5分 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章