好吧,哥也只是一個很菜的死胖紙
聽JJ同學說,小雪做了一個連連看的外掛,是用->映像分析->尋路做的.瞬間各種膜拜.分析映像這一點已經夠亮了,但是據說以此為基礎的尋路有點小問題.昨天幹了一個命令列版的.曬下
如果讓我說亮點,我覺得
1.直接開進程空間讀Table,能夠自動適應不同的作業系統尋找Table基址(就是棋盤基址,寫入程式碼嘖- -),分析過程比較亮,後面有圖有真相
2.做了自動Reload功能,單無解時候自動進行Reload,不過只做一次(一般Reload道具有兩個)
學到神馬,嗯,CE工具,無敵加強大,記憶體斷點,nice~介面...表示很糾結...過段時間拜JJ同學為師學C#吧(熱衷底層的人兒你傷不起啊有木有)
程式思路:1.讀Table;2.尋路(無解則reload);3.輸出解決指令碼;4.按指令碼類比滑鼠點擊;
晒圖先:
稍微看看圖,通過分析可以知道,Table基址是棧地址,不同的作業系統是不同的,程式裡面通過EBP+1770C來定位這個Table的基址,在不同的作業系統中,EBP的值有變化.
對於尋路演算法,推薦文章:http://hi.baidu.com/umu618/blog/item/8eb88b0a624ef23eb1351db4.html,講的很清楚,實現了之後暴力對棋盤進行窮舉就OK了,之前擔心這樣的時間複雜度太高,但是由於尋路裡面的判斷條件很多,因此總體來說已耗用時間還好啦.
對於文章當中講到的3種尋路的實現代碼:
BOOL<br />FindLine(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int i = 0;<br />int max, min;<br />if (p1.row == p2.row)<br />{<br />max = (p1.col > p2.col) ? p1.col : p2.col;<br />min = (p1.col < p2.col) ? p1.col : p2.col;<br />if (max == min + 1)<br />{<br />return TRUE;<br />}<br />for (i = min + 1; i < max; i++)<br />{<br />if (Table[p1.row][i] != 0)<br />{<br />return FALSE;<br />}<br />}<br />return TRUE;<br />}</p><p>if (p1.col == p2.col)<br />{<br />max = (p1.row > p2.row) ? p1.row : p2.row;<br />min = (p1.row < p2.row) ? p1.row : p2.row;<br />if (max == min + 1)<br />{<br />return TRUE;<br />}<br />for (i = min + 1; i < max; i++)<br />{<br />if (Table[i][p1.col] != 0)<br />{<br />return FALSE;<br />}<br />}<br />return TRUE;<br />}</p><p>return FALSE;<br />}</p><p>BOOL<br />FindCorner(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int row = 0;<br />int col = 0;<br />LLKPOINT p = {0};</p><p>row = p1.row;<br />col = p2.col;<br />if (Table[row][col] == 0)<br />{<br />p.row = row;<br />p.col = col;<br />if (FindLine(Table, p1, p)/<br />&& FindLine(Table, p, p2))<br />{<br />return TRUE;<br />}<br />}</p><p>row = p2.row;<br />col = p1.col;<br />if (Table[row][col] == 0)<br />{<br />p.row = row;<br />p.col = col;<br />if (FindLine(Table, p1, p)/<br />&& FindLine(Table, p, p2))<br />{<br />return TRUE;<br />}<br />}</p><p>return FALSE;<br />}</p><p>BOOL<br />FindTwoCorner(<br />UCHAR Table[ROW][COL],<br />LLKPOINT p1,<br />LLKPOINT p2<br />)<br />{<br />int i;<br />LLKPOINT tp1 = {0};<br />LLKPOINT tp2 = {0};</p><p>//橫向搜尋<br />for (i = 0; i < COL; i++)<br />{<br />if (i == p1.col)<br />{<br />continue;<br />}<br />tp1.row = p1.row;<br />tp1.col = i;<br />if (Table[tp1.row][tp1.col] == 0)<br />{<br />if (FindLine(Table, p1, tp1))<br />{<br />tp2.row = p2.row;<br />tp2.col = i;<br />if (Table[tp2.row][tp2.col] == 0)<br />{<br />if (FindLine(Table, p2, tp2))<br />{<br />if (FindLine(Table, tp1, tp2))<br />{<br />return TRUE;<br />}<br />}<br />}<br />}<br />}<br />}</p><p>//縱向搜尋<br />for (i = 0; i < ROW; i++)<br />{<br />if (i == p1.row)<br />{<br />continue;<br />}<br />tp1.col = p1.col;<br />tp1.row = i;<br />if (Table[tp1.row][tp1.col] == 0)<br />{<br />if (FindLine(Table, p1, tp1))<br />{<br />tp2.col = p2.col;<br />tp2.row = i;<br />if (Table[tp2.row][tp2.col] == 0)<br />{<br />if (FindLine(Table, p2, tp2))<br />{<br />if (FindLine(Table, tp1, tp2))<br />{<br />return TRUE;<br />}<br />}<br />}<br />}<br />}<br />}</p><p>return FALSE;<br />}
哥一直都是在練習裡面測試的,為了測試真實效果而跟真人玩了2局.
哥享受的是寫的過程,測試成功的過程,而不是虐人的過程..
最後代表黨和人民感謝一下JJ同學,如果有機會順便感謝一下史努比和加菲貓(前進方向上的明燈啊)..