反編譯記事本(3) 解決編譯錯(cuò)誤
????上一篇文章漏掉了一步, 那就是去除@<寄存器名>的操作. IDA Pro導(dǎo)出的代碼中, 如果一個(gè)函數(shù)不是常規(guī)的參數(shù)傳遞方式, 而是使用了特定的寄存器來(lái)傳遞參數(shù)的話, 這個(gè)函數(shù)會(huì)被聲明為_(kāi)_usercall, 而且函數(shù)名或參數(shù)后面會(huì)加上一個(gè)@<寄存器名>的符號(hào).

????比如這個(gè)函數(shù), 函數(shù)名后的@<eax>表示返回值放在EAX寄存器, a1后的@<eax>表示a1這個(gè)參數(shù)放在EAX寄存器中.

????記事本項(xiàng)目的編譯錯(cuò)誤很多, 接下來(lái)分類列舉解決辦法.

類型未定義
? ? (1) 對(duì)于類型, 肯定是用來(lái)聲明變量的. 如果一個(gè)類型沒(méi)有定義, 那么看使用這個(gè)類型的地方, 如果這個(gè)類型的變量沒(méi)有使用到(全局搜索), 那么可以注釋掉(或者刪掉)用這個(gè)類型聲明變量的語(yǔ)句.
????比如, 上一篇文章刪掉了 start 函數(shù), 那么只在start函數(shù)中使用到變量也是可以刪掉的.

? ? (2) 其次, 類型未定義, 很可能是沒(méi)有包含對(duì)應(yīng)的頭文件, 網(wǎng)上搜索后, 包含對(duì)應(yīng)的頭文件. 比如 _snwprintf_s 需要包含 wchar.h 才能使用.

類型對(duì)不上
????聲明了某種類型的一個(gè)變量, 但是使用其他類型的值來(lái)給這個(gè)變量賦值. 這種情況直接強(qiáng)制類型轉(zhuǎn)換一般就能解決問(wèn)題. C語(yǔ)言中大多數(shù)類型都是可以強(qiáng)制類型轉(zhuǎn)換的, 完全可以把一個(gè)結(jié)構(gòu)體變量當(dāng)作整型數(shù)組來(lái)使用.?

????

未初始化錯(cuò)誤
????這種錯(cuò)誤百分百是IDA Pro識(shí)別錯(cuò)誤, 屬于邏輯錯(cuò)誤, 現(xiàn)在不處理, 全部初始化為0就好.

????這里一看就是數(shù)組大小沒(méi)有識(shí)別對(duì), 但是現(xiàn)在先不管.

復(fù)雜錯(cuò)誤
????有些編譯錯(cuò)誤很麻煩, 比如直接訪問(wèn)寄存器的函數(shù). 對(duì)于這種錯(cuò)誤, 先把它放一邊, 以后再處理, 先讓項(xiàng)目可以跑起來(lái)才是硬道理. 做法是將整個(gè)函數(shù)內(nèi)的語(yǔ)句全部注釋起來(lái), 然后再加上一個(gè)throw 語(yǔ)句, 以便跑起來(lái)后運(yùn)行到這里時(shí), 提醒我們?cè)摻鉀Q這個(gè)問(wèn)題了.

????


成果
????記事本項(xiàng)目就這么多編譯錯(cuò)誤了, 好了, 現(xiàn)在可以運(yùn)行項(xiàng)目看看效果了.

????欲知后事如何, 且聽(tīng)下回分解.