C++程序反編譯筆記(12) 讀取位置 0x00000001 時(shí)發(fā)生訪問(wèn)沖突
????接下來(lái)遇到了這樣的錯(cuò)誤:

????這樣的錯(cuò)誤一般都是非法訪問(wèn)內(nèi)存造成的, 比如數(shù)組越界, 訪問(wèn)野指針等.

數(shù)組越界
????具體出錯(cuò)誤位置如下:

????點(diǎn)擊"中斷"按鈕, 可以看到是調(diào)用 RegQueryValueEx時(shí)的第2個(gè)參數(shù)v7的值為0x00000001. 而RegQueryValueEx的第二個(gè)參數(shù)是注冊(cè)表子項(xiàng)字符串.
????根據(jù)1477行的v7賦值語(yǔ)句, 查看?lpKeyName 的定義,

????1477行的賦值是將字符串?dāng)?shù)組索引為?Data 的字符串賦值給v7, lpKeyName是該數(shù)組的第一個(gè)元素; 但是下方的 lpKeyName 的定義指示,?lpKeyName僅是一個(gè)字符串指針, 這是矛盾的, 這就是問(wèn)題所在.

解決方法
????通常情況下, IDA Pro反編譯出來(lái)的的偽代碼是沒(méi)錯(cuò)的, 而變量的識(shí)別是很容易出錯(cuò)的. 這里就是這樣的情況. 解決方法是 將lpKeyName開(kāi)始的一系列變量合并為一個(gè)字符串?dāng)?shù)組.?
????在IDA Pro中查看lpKeyName.

原因是IDA Pro識(shí)別錯(cuò)了, 此處lpKeyName確實(shí)應(yīng)該是一個(gè)長(zhǎng)度18的字符串?dāng)?shù)組. 選中這18個(gè)字符串, 右鍵選擇"Array", 點(diǎn)確定, 最后點(diǎn)擊lpKeyName, 按Y鍵修改它的類型為L(zhǎng)PCWSTR lpKeyName[]; 再按Shift + E, 打開(kāi)導(dǎo)出數(shù)據(jù)窗口, 復(fù)制Preview下方的定義到Visual Studio里面替換掉原來(lái)的定義:



修正引用代碼
????修改了lpKeyName的類型, 還需要修改引用到它的代碼, 反編譯就是這么麻煩. 不過(guò)好在IDA Pro會(huì)根據(jù)變量類型自動(dòng)修正代碼, 只需要按F5刷新一下.
????對(duì)每個(gè)需要修正的代碼, 到IDA Pro中復(fù)制修正的代碼到Visual Studio中, 就解決了這個(gè)問(wèn)題.