星期三, 8月 27, 2008

組語基礎篇-Lea與Mov

這兩天為了替同事上課,整理一些基礎的組合語言資料,本來想說用google大神剪剪貼貼就搞定,但發現一件十分有趣的事,就是這lea與mov兩個指令,似乎都說是「近似」的指令,讓人非常傻眼,還很少人更正,是這種低級語言....不不低階語言已經乏人問津了還是忽視,反正我也在整理資料,順便寫一下,這兩個天壤之別的指令到底差在哪裡。

  • Lea傳遞變數位置
  • Mov傳遞變數數值

學過C++的,應該很容易了解吧~~就是指指標的 *X1 語 &X1。我也很納悶為什麼那麼多人會說兩者差不多,我想,可能為誤會的原因應該是組語「字串」傳遞所害的,舉例來講:

lpCaption="Caption"
lpText="Hello World!"

_asm
{
push MB_OK
lea eax,lpCaption
push eax
lea eax,lpText
push eax
push NULL
call dword ptr [MessageBoxA]
}

假定我有兩個字串lpCaption與lpText,要傳遞給MessageBoxA來彈出一個視窗,我必須將MessageBoxA所需的三個變數MB_OK、lpCaption、lpText三個參數依序push入堆疊再call MessageBoxA,此時再傳遞lpCation會用到 lea eax,lpText,不懂原由的人就會以為mov和lea是差距不大,但事實上換用mov一定是出現亂碼,因為傳遞字串與陣列是必須傳遞字串或陣列的起始位置。

星期二, 8月 26, 2008

強大的反組譯軟體 PE Explorer

系統開發最長遇到的、也是最賭濫的事,就是明明很簡單的程式,卻怎麼執行IO就是一動也不動,怎麼看都可能是與Driver連動出問題卻無處著手,唯一除此bug方法就是將編譯好的程式碼反組譯,直接看裡面在搞些什麼。
PE Explorer 是我目前用過最為強大的反組譯的軟體,可以分析EXE執行檔、DLL程式庫以及ActiveX等元件,可以分析其資源以及程式中使用的外部函數,十分方便。

執行畫面如下: