列宿乃施于上榮兮 日月才經于柍桭

          ………… 白駒過隙 歲月如斯 夢縈回繞 心靈之聲
          posts - 57, comments - 8, trackbacks - 0, articles - 41
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          暴力破解常見技巧

          Posted on 2009-10-11 20:40 默認為零 閱讀(268) 評論(0)  編輯  收藏 所屬分類: 技術轉帖

          暴力破解的一般流程
          1、有殼者自然得先脫殼
          2、試注冊看看有何提示,讓我們抓抓小尾巴
          3、若有提示,用OD動態調試器或者是W32靜態調試器查找錯誤提示
          4、來到錯誤提示處分析代碼找關鍵CALL、關鍵跳!
          5、修改代碼
          6、復制保存!

          如果沒有提示,我們可以使用很多斷點來完成這些操作
          現今軟件的保護方式有
          1、序列號保護方式(注冊碼=f(機器碼/序列號))
          2、警告(NAG)窗口
          3、時間限制/次數限制。。
          4、菜單功能限制
          5、Key File保護
          6、CD-Check
          7、只運行一個實例

          一些軟件通過把注冊碼保存在.ini文件、注冊表、.dat文件等等方式進行注冊驗證

          常見斷點設置

          字符串
          bp GetDlgItemTextA(W) ****
          bp GetDlgItemInt
          bp GetWindowTextA(W) ****
          bp GetWindowWord
          bmsg XXXX wm_gettext

          對話框
          bp MessageBeep
          bp MessageBoxA(W) ****
          bp MessageBoxExA(W)
          bp DialogBoxParamA(W)
          bp GreateWindowExA(W)
          bp ShowWindow
          bp UpdateWindow
          bmsg XXXX wm_command

          對于VB的程序用bp MessageBoxA是無法斷下來的,bp rtcMsgBox

          注冊表相關
          bp RegCreateKeyA(W)
          bp RegDeleteKeyA(W)
          bp RegQueryValueA(W)
          bp RegCloseKey
          bp RegOpenKeyA(W) ****

          時間相關
          bp GetLocalTime
          bp GetFileTime
          bp GetSystemtime

          CD-ROM或磁盤相關
          bp GetFileAttributesA(W)
          bp GetFileSize
          bp GetDriveType
          bp GetLastError
          bp ReadFile
          bpio -h (CD-ROM端口地址) R

          軟件狗
          bpio -h 278R
          bpio -h 378R

          INI初始化文件相關
          bp GetPrivateProfileStringA ****
          bp GetPrivateProfileInt
          bp WritePrivateProfileString
          bp WritePrivateProfileInt

          文件訪問相關
          bp ReadFile
          bp WriteFile
          bp CreateFileA ****
          bp SetFilePointer
          bp GetSystemDirectory

          另外還有一類軟件通過網絡驗證、重啟驗證來判斷程序是否注冊
          當然前者一般應用于外掛程序上較多,一般是改網絡驗證為本地驗證達到欺騙遠程網絡主機的目的達到通過驗證!
          后者也是很常見的,他一般把用戶輸入的注冊碼直接或者是通過加密運算后得到的數值保存到文件、注冊表中,然后提示用戶重啟驗證是否注冊,當然當你重新打開程序的時候他會從文件或者是注冊表中讀取用戶輸入的注冊碼,再通過程序注冊算法來進行比照,正確者當然就成為正版,錯誤的自然就88了,另外以重啟驗證的軟件一般是把注冊碼保存在注冊表或文件中!

          下面來說說解決這類軟件的一般方法!

          重啟驗證類軟件大致的驗證過程。
          1、運行軟件輸入注冊信息,點注冊后。一般軟件會提示你重新運行軟件,以便驗證注冊信息的正確性(如FlashGet);
          也有的只在你輸入正確的注冊信息時才有這個提示,不然會告訴你輸入的注冊信息有問題(此軟件就屬這類)

          2、要破解這種軟件,首先是判斷一下她把注冊信息存在哪里(因為她重啟驗證時要用)。大致有兩種存放方式,第一種是放在注冊表里;第二種是放在文件里。(我們可以在輸入注冊信息,點擊確定前,利用監視類軟件來查看一下,如FileMon和RegShot等)

          3、知道她的注冊信息的存放地點后,就可以選則相應的API斷點,來調試了

          訪問注冊表類常用API
          bp RegOpenKeyA 打開一個現有的注冊表項 ****
          bp RegOpenKeyExA 打開一個現有的注冊表項 ****
          bp RegCreateKeyA 在指定的項下創建或打開一個項
          bp RegCreateKeyExA 在指定項下創建新項的更復雜的方式
          bp RegDeleteKeyA 刪除現有項下方一個指定的子項
          bp RegDeleteValueA 刪除指定項下方的一個值
          bp RegQueryValueA 獲取一個項的設置值
          bp RegQueryValueExA 獲取一個項的設置值
          bp RegSetValueA 設置指定項或子項的值
          bp RegSetValueExA 設置指定項的值
          bp RegCloseKey 關閉系統注冊表中的一個項(或鍵)

          訪問文件類常用API
          bp CreateFileA 打開和創建文件、管道、郵槽、通信服務、設備以及控制臺 ****
          bp OpenFile 這個函數能執行大量不同的文件操作
          bp ReadFile 從文件中讀出數據
          bp ReadFileEx 與ReadFile相似,只是它只能用于異步讀操作,并包含了一個完整的回調
          ....................................................................................................................................................

          常見脫殼方法

          預備知識

          1.PUSHAD (壓棧) 代表程序的入口點,
          2.POPAD (出棧) 代表程序的出口點,與PUSHAD想對應,一般找到這個OEP就在附近
          3.OEP:程序的入口點,軟件加殼就是隱藏了OEP(或者用了假的OEP/FOEP),只要我們找到程序真正的OEP,就可以立刻脫殼。

          方法一:單步跟蹤法
          1.用OD載入,點“不分析代碼!”
          2.單步向下跟蹤F8,實現向下的跳。也就是說向上的跳不讓其實現!(通過F4)
          3.遇到程序往回跳的(包括循環),我們在下一句代碼處按F4(或者右健單擊代碼,選擇斷點——>運行到所選)
          4.綠色線條表示跳轉沒實現,不用理會,紅色線條表示跳轉已經實現!
          5.如果剛載入程序,在附近就有一個CALL的,我們就F7跟進去,不然程序很容易跑飛,這樣很快就能到程序的OEP
          6.在跟蹤的時候,如果運行到某個CALL程序就運行的,就在這個CALL中F7進入
          7.一般有很大的跳轉(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就會到程序的OEP。

          Btw:在有些殼無法向下跟蹤的時候,我們可以在附近找到沒有實現的大跳轉,右鍵-->“跟隨”,然后F2下斷,Shift+F9運行停在“跟隨”的位置,再取消斷點,繼續F8單步跟蹤。一般情況下可以輕松到達OEP!

          方法二:ESP定律法
          ESP定理脫殼(ESP在OD的寄存器中,我們只要在命令行下ESP的硬件訪問斷點,就會一下來到程序的OEP了!)
          1.開始就點F8,注意觀察OD右上角的寄存器中ESP有沒突現(變成紅色)。(這只是一般情況下,更確切的說我們選擇的ESP值是關鍵句之后的第一個ESP值)
          2.在命令行下:dd XXXXXXXX(指在當前代碼中的ESP地址,或者是hr XXXXXXXX),按回車!
          3.選中下斷的地址,斷點--->硬件訪--->WORD斷點。
          4.按一下F9運行程序,直接來到了跳轉處,按下F8,到達程序OEP。

          方法三:內存鏡像法
          1:用OD打開軟件!
          2:點擊選項——調試選項——異常,把里面的忽略全部√上!CTRL+F2重載下程序!
          3:按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.按F2下斷點,然后按SHIFT+F9運行到斷點,接著再按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.上面的.CODE(也就是00401000處),按F2下斷點!然后按SHIFT+F9(或者是在沒異常情況下按F9),直接到達程序OEP!


          方法四:一步到達OEP
          1.開始按Ctrl+F,輸入:popad(只適合少數殼,包括UPX,ASPACK殼),然后按下F2,F9運行到此處
          2.來到大跳轉處,點下F8,到達OEP!

          方法五:最后一次異常法
          1:用OD打開軟件
          2:點擊選項——調試選項——異常,把里面的√全部去掉!CTRL+F2重載下程序
          3:一開始程序就是一個跳轉,在這里我們按SHIFT+F9,直到程序運行,記下從開始按SHIFT+F9到程序運行的次數m!
          4:CTRL+F2重載程序,按SHIFT+F9(這次按的次數為程序運行的次數m-1次)
          5:在OD的右下角我們看見有一個"SE 句柄",這時我們按CTRL+G,輸入SE 句柄前的地址!
          6:按F2下斷點!然后按SHIFT+F9來到斷點處!
          7:去掉斷點,按F8慢慢向下走!
          8:到達程序的OEP!

          方法六:模擬跟蹤法
          1:先試運行,跟蹤一下程序,看有沒有SEH暗樁之類
          2:ALT+M打開內存鏡像,找到(包含=SFX,imports,relocations)

          內存鏡像,項目 30
          地址=0054B000
          大小=00002000 (8192.)
          Owner=check    00400000
          區段=.aspack
          包含=SFX,imports,relocations
          類型=Imag 01001002
          訪問=R
          初始訪問=RWE

          3:地址為0054B000,如是我們在命令行輸入tc eip<0054B000,回車,正在跟蹤ing。。

          Btw:大家在使用這個方法的時候,要理解他是要在怎么樣的情況下才可以使用

          方法七:“SFX”法
          1:設置OD,忽略所有異常,也就是說異常選項卡里面都打上勾。
          2:切換到SFX選項卡,選擇“字節模式跟蹤實際入口(速度非常慢)”,確定。
          3:重載程序(如果跳出是否“壓縮代碼?”選擇“否”,OD直接到達OEP)

          主站蜘蛛池模板: 大邑县| 双辽市| 梁河县| 富宁县| 五莲县| 绿春县| 海口市| 阿坝| 阳春市| 丹巴县| 咸宁市| 沧州市| 台湾省| 南康市| 通河县| 镇沅| 福州市| 永登县| 景德镇市| 宁化县| 定西市| 哈尔滨市| 旺苍县| 阿拉善左旗| 连南| 津南区| 赤峰市| 石台县| 县级市| 灌南县| 郴州市| 邛崃市| 华坪县| 定边县| 博湖县| 横山县| 贺州市| 广德县| 北辰区| 雷波县| 三明市|