學習內容:MASM + OllyDGB
在某個遊戲寫了一套自動化的流程,但開發過程借助太多人了力量。
現在想要提升效率只能把別人寫的功能轉到自己的程式裡面,否則太多意外或浪費除錯時間了。
以前只會用 Cheat Engine 找找基址、指針,放到C#裡調用,以為這樣就可以滿足需求了。
單純的紀錄一下學習的筆記,找不到什麼好的地方可以給我放這些,就放在這吧。
學習進度
2020/1/29 | 04/52
2020/1/30 | 06/52
2020/1/31 | 09/52
2020/2/01 | 10/52
2020/2/02 | 12/52
2020/2/03 | 14/52
2020/2/04 | 16/52
2020/2/05 | 19/52
2020/2/06 | 21/52
2020/2/07 | 22/52
2020/2/08 | 23/52
2020/2/09 | 24/52
2020/2/10 | 26/52
使用教材:逆向工程實戰 Win32+遊戲逆向實戰
線上看要拉進度調有時候會卡,有點麻煩,就找了幾個方式下載。
我一開始寫了個Python去下載,但是速度慢得可以,還越來越慢。
後來找到一款軟體:唧唧Down
直接就可以下載了,速度很快。
如果左下角出現在更新 ffmpeg 且發現一直在轉檔MP4沒辦法下載完畢,建議你進他們的QQ群下載最新版,網站放的不一定是最新。
也可以把字幕下載下來,轉成ass檔案,就可以看彈幕了,有些網友會補充點知識還是有幫助的。
課程實作
前19課:8086理論講解
都在講 8086 CPU 的理論及組合語言的一些指令介紹,第10節課開始在玩OllyDGB了。
第20課:OllyBDG + Cheat Engine + MFC 基本操作
UP主教了做踩地雷的自動掃雷並寫成MFC軟體,但在這邊我的電腦沒有踩地雷,虛擬機裡面的Win7也沒有= =...
課程說道,他安設了一個作業就是玩計算機的。意思也就是說,玩玩計算機也等同學會了這堂課,沒有遊樂區總有計算機了。
第22課:單機經典遊戲實戰
開始搞了植物大戰殭屍,開始學習怎麼用MFC寫輔助,比較麻煩的是英文版的沒辦法用OD開
最終弄了跟UP主一樣的簡體版,但繁體系統會亂碼,還是挺不爽的。
PS:他在找陽光的那集用OD找非常久,結果還是沒找出來,最後還是用CE去找二級指針,所以如果你也沒找到別灰心繼續看下去,反正他後面也都是用CE在找值才進OD。
第23課:nop 刪除遊戲代碼達成效果
OD裡面的代碼都是映射位置,每次開起來程式碼位置都會相同,所以如果找到關鍵的判斷語句後,把該段nop掉即可。
void 放植物無CD() UCHAR buf[2] = { 0 }; if (m_plants_nocd) { buf[0] = 0x90; buf[1] = 0x90; } else { buf[0] = 0x7E; buf[1] = 0x14; } //注意這邊的Sizeof,改的是Buf所以要用Buf,否則報錯 if (!::WriteProcessMemory(hProcess, (LPVOID)0x487296, &buf, sizeof(buf), NULL)) { MessageBox(_T("寫入數據失敗"), NULL, 0); CloseHandle(hProcess); return; } CloseHandle(hProcess); UpdateData(FALSE);
第24課:攻擊速度分析思路、調用Call放植物
攻擊速度分析思路
大嘴花的攻擊速度,用未知的值去找,吞了一個候會進入攻擊冷卻時間,此時應該有個計時器一直在變動,到最後會找到一個遞減的值,找到後去看誰訪問了他。
冷卻記憶體位置:124353EC
EDI=12435398
0046323E - mov eax,edi
00463240 - call 00464820
00463245 - mov eax,[edi+54]
00463248 - test eax,eax
此時進入OD,直接 Ctrl+G 到 00463245 段去分析
但發現在這段把它 nop 掉沒有效果
dd 124353EC 下訪問斷點,看看還有誰經過了它。
在 00461561 段,發現有一個 cmp 比較,比較完就 jne 跳轉,這段很久可能是在判斷冷卻時間。
把 00461565 nop 掉。
發現就可以狂吞猛吞了
在彈幕看到,有人問:「可不可以把碗豆射手,改成碗豆機關槍啊?」"
我也好奇,用了同樣手法去找,不太好找,不知道為什麼一直找失敗,不過最終找到
技能冷卻減1
0045F8A9 |. 8346 58 FF add dword ptr ds:[esi+0x58],-0x1
攻擊速度
0045F8BF |. 8B4E 5C mov ecx,dword ptr ds:[esi+0x5C]
改成以下可達到攻速加快效果,低於22會不攻擊(參考網路)
0045F8BF B9 22000000 mov ecx,0x22
-----------------------------------------------
程式編寫
UCHAR buf[5] = { 0 };
if (m_Peashooter_atkspeed) //CheckBox 為 True
{
buf[0] = 0xB9;
buf[1] = 0x22;
buf[2] = 0x00;
buf[3] = 0x00;
buf[4] = 0x00;
}
else
{
buf[0] = 0x8B;
buf[1] = 0x4E;
buf[2] = 0x5C;
buf[3] = 0x2B;
buf[4] = 0xC8;
}
如果把第一個【jnz 0045F935】nop 會導致不攻擊,第二個 nop 則會加快一點
0045F920 |. /75 13 jnz short PlantsVs.0045F935
0045F922 |. |837E 24 2B cmp dword ptr ds:[esi+0x24],0x2B
0045F926 |. |75 0D jnz short PlantsVs.0045F935
0045F928 |. |8B46 1C mov eax,dword ptr ds:[esi+0x1C] ; PlantsVs.0043467D
調用 Call 放植物
透過按下、彈起植物找值,可以找到植物的ID
看誰訪問了它,要找放下植物時他訪問了誰,所以要把植物放下去才會出現關鍵的訪問斷點
00410A91 |. 8B40 28 mov eax,dword ptr ds:[eax+0x28]
00410A94 |. 52 push edx //固定-1
00410A95 |. 50 push eax //植物ID
00410A96 |. 8B4424 20 mov eax,dword ptr ss:[esp+0x20] //座標X [0-5]
00410A9A |. 57 push edi //座標Y [0-8]
00410A9B |. 55 push ebp //
00410A9C |. E8 7FC6FFFF call PlantsVs.0040D120
注入代碼調試
push -1
push 2
mov eax,3
push 8
push 0694AF60 //ebp 每場都不一樣
call 0040D120
可以注入成功,但是ebp每場都會不一樣,要找到他的偏移位置
用CE HEX找到訪問數據後,回OD找代碼段,反覆查找後得到偏移,最後結果如下
push -1
push 2
mov eax,3
push 8
mov ebx,[6A9EC0]
mov ebx,[ebx+768]
push ebx
call 0040D120