一碗酸梅湯 作品

第284章 江寒的操作

    “crackme”是很多逆向論壇裡十分流行的玩法。

    一些人為了測試自己的軟件保護技術,就會製作一些crackme程序,讓別人來嘗試破解。

    網上也經常會有一些cm(crackme)競賽,一些安全軟件公司,偶爾會在這種比賽中,選拔可用的員工。

    根據設計者的意圖和加密技術水平,不同的crackme,破解難度天差地遠。

    江寒點擊了一下鏈接,很快就把題目給出的crackme,下載了下來。

    然後運行起來,先觀察一下程序的外在表現。

    這是個windowspe文件,界面十分樸素,只提供了兩個輸入框。

    一個用來輸入username(用戶名),另一個用來輸入sn(serialnumber,序列號),下面還有個【login】按鈕,用來檢測username和sn是否匹配。

    看完了這些內容,對程序的結構心裡有數之後,江寒就將窗口關掉了。

    隨後,他就打開了著名的調試工具ollyice,加載了crackme.exe。

    開始調試之前,先設置個斷點。

    斷點是調試器的一種功能,可以讓程序中斷在需要的地方,以方便分析。

    常用的斷點有int3斷點、硬件斷點、內存斷點、消息斷點、條件斷點等。

    例如lbutton_up,就是很常用的消息斷點,功能是當鼠標左鍵抬起時,中斷程序運行。

    又如getdlgitemtext斷點,當程序試圖調用windows的對應api,獲取輸入框裡的文本內容時,就會被攔下。

    江寒先試著設置了getdlgitemtext和getdlgitemtexta斷點,然後按了下f9,讓程序跑了起來。

    crackme的窗口出現後,先隨便輸入一組username和sn,然後用鼠標點擊了一下【login】按鈕。

    結果……

    程序直接彈出了一個msgbox(消息框),提示【用戶名和序列號不匹配】。

    很遺憾,在這次嘗試中,斷點並沒有發揮作用。

    這說明在這個crackme裡,並沒有使用getdlgitemtext或者getdlgitemtexta來讀取字符串。

    否則的話,就會被調試器攔截下來,而不會執行關鍵call了。

    所謂關鍵call,是指程序中用來計算用戶名和序列號的函數,通常執行完關鍵call,很快就能找到一個條件跳轉語句。

    如果序列號與用戶名匹配,就會繼續往下執行,否則就彈出出錯提示……

    接下來,江寒又試了一下lbutton_up斷點。

    這次終於成功斷了下來。

    接下來就很簡單了,交替使用f7(步入)、f8(步過)兩個快捷鍵,單步跟蹤即可。

    這個程序是那種很老實的程序。

    意思就是沒有什麼亂七八糟的,迷惑人的東西,也沒有刻意為難挑戰者。