石頭門第四集33秒處代碼解析

這東西乍眼一看就是亂打的是吧,其實不是。
注意看8B和5X出現(xiàn)了多少次:8B是x86的MOV指令 MOV REG,MEM;5X是x86的push和pop
畫面里面有8B 55 D4 52,8B E5 5D C3,8B 45 0C 50,8B 4D 08 51,8B 55 FC,8B 45 08 89 42 3C,8B EC 51 89 4D FC 8B 45 EC
這些分別是
MOV DX,[DI-2Ch]
PUSH DX
MOV SP,BP
POP BP
RET
MOV AX,[DI+Ch]
PUSH AX
MOV CX,[DI+8]
PUSH CX
MOV DX,[DI-4]
MOV AX,[DI+8]
MOV [BP+SI+3Ch],AX
MOV BP,SP
PUSH CX
MOV [DI-4],CX
MOV AX,[DI-14h]
我來解釋一下
動漫描述這個是用來破譯信息的,那么它的邏輯就不希望被人輕易看懂,所以經常壓彈棧并把數(shù)據滿內存亂放是很正常的。而且有個細節(jié)——總是用DS:DI——這個就指明了這是在操作數(shù)據,DS是“數(shù)據段”的意思,DI是“目標地址指針”的意思。
然后我找到了一個重要的東西——U駆——Shift_JIS編碼55 8B EC——x86堆棧傳參子程序常用開頭——
PUSH BP
MOV BP,SP
意思是把基址(BP)保存下來,然后讓BP指向棧頂(SP),這樣就可以用SS:BP+xx來訪問堆棧上的參數(shù)
同時對應結尾
MOV SP,BP
POP BP
RET
意思是恢復棧頂,因為程序里面會壓棧彈棧,而且壓的可能比彈得多,為了棧平衡(為了在子程序返回時候不會返回到錯誤地址以及不會破壞調用者數(shù)據)有時候用 ADD SP,xx,有時候一堆POP(尤其喜歡POP CX),但是偷懶點也可以讓SP直接指BP所指,畢竟BP就是直接復制的SP。PUSH了就要POP,所以POP BP與前文PUSH BP相對應,然后RET,返回到調用者。
你也看到了,一個子程序的結尾就在第五行末端。
那么能讀出更連續(xù)的內容嗎?可以。這個畫面里面的十六進制編輯器左邊是十六進制區(qū),寬9字節(jié),右邊是文本區(qū)(Shift_JIS編碼),寬8字節(jié)。這玩意一行十六字節(jié),剛好能湊夠,所以我就試了下——

(到現(xiàn)在我都不知道那個兩字節(jié)的點是什么)
55????????????????PUSH????BP
8B EC????????MOV????? BP,SP
51????????????????PUSH????CX????????????????????;這里PUSH因為后面動CX了
89 4D ??????MOV????[DI+disp8],CX????;disp8就是缺損的那個字節(jié)
8B 45 0C????MOV????AX,[DI+Ch]
50????????????????PUSH????AX????????????????????;這兩行的格式特別常見,因為IBM51XX系列用的Intel8088還不支持后面的x86那種直接PUSH MEM
8B 4D 08????MOV????CX,[DI+8]
51????????????????PUSH????CX????????????????????;格式同上
8B 20????????MOV????SP,[BP+SI]????????;這一句稍微有些莫名其妙,但是這個操作還能彌補
x86是變長指令集,如果不知道第一字節(jié)就絕對無法譯指,x86一條指令可以一字節(jié)兩字節(jié)三字節(jié)四字節(jié)等等,就像文言文斷句,倆字斷不開若是后面沒提示就一大長串斷不了了。
總結,這個估計是找了個什么程序直接復制出來的,并不是胡打的?;氐絼∏椋白舆@么牛逼怎么可能不了解這指令集——這現(xiàn)在滿大街都用的,隨便抓個程序員都會說見過的指令集?唯一的解釋就是這個世界很像現(xiàn)實世界,但是,x86可能被ARM打敗并完全替代,嚴重到x86指令集都丟了,那么Intel和AMD絕對倒閉了,沒人擠牙膏了,放眼望去恐怕滿眼高通聯(lián)發(fā)科吧,悲慘的世界……
PS:為了駆和窺兩個字,我搜索了半天其對應平假名,吃了文化的窺(笑哭