帖子地址:http://www.52pojie.cn/thread-349696-1-1.html
看了第一課做的筆記
識別殼版本號
載入OD 來到OEP 直接點jmp 點幾下就看到call 顯示殼的版本
00585509 ? E8 1C000000 call Test_se.0058552A ; PUSH ASCII "Safengine Shielden v2.3.4.0"
ctrl+B搜索字符串
RegQueryValueExA
或者直接搜索2進制
52 65 67 51 75 65 72 79 56 61 6C 75 65 45 78 41 00
搜到的結果有2個 搜索到有call 和jmp的那個
檢索一個已打開的注冊表句柄中,指
定的注冊表鍵的類型和設置值。
返回值
Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一個錯誤代碼
參數表
參數 類型及說明
HKEY hKey,//一個已打開項的句柄,或者指定一個標准項名
LPCTSTR lpValueName,//要獲取值的名字,注冊表鍵的名字
LPDWORD lpReserved,//未用,設為零
LPDWORD lpType,//用於裝載取回數據類型的一個變量
LPBYTE lpData,//用於裝載指定值的一個緩沖區
LPDWORD lpcbData,//用於裝載lpData緩沖區長度的一個變量。 //一旦返回,它會設為實際裝載到緩沖區的字節數
lpValueName 指向要查詢值的名字的字符串(以空字符結束)。
如果lpValueName是NULL或一個空字符串(""),這個函數找回這個鍵的未命名或默認值的類型和數據。 Windows 95和Windows 98: 每個鍵有一個默
認值(最初的不包含數據)。在Windows 95,默認值類型總是REG_SZ。在Windows 98,默認鍵的類型最初是REG_SZ,但可以通過RegSetValueEx指定
一個默認值為不同的類型。 Windows NT: 鍵不能自動擁有一個未命名或默認的值,未命名的值可以是任何類型。
lpReserved 保留,必須是NULL.
一路點jmp 記錄好最后一個jmp 在這個jmp addr上下斷點
004BBE34 . /E9 76010000 jmp Test_se.004BBFAF
單步走幾下來到沒有VM的代碼
運行一次后記錄SystemBiosVersion地址
0012DF40 0012E4EC ASCII "SystemBiosVersion"
SystemBiosVersion地址 0012E4EC
再運行2次
在hex 數據窗口處記錄
00 00 00 00 后的地址
該地址為當前機器的機器碼
SN_addr 0012E520
當前機器碼 hex D7 E2 CA B5 00 08 01 00 C3 06 03 00 00 01 02 03 04 05 06 07 AD 0D 5D 27 54 45 DF FD
然后計算偏移 SystemBiosVersion地址-SN_addr=34
上面數據記錄好后 重新加載軟件 讓軟件斷在jmp那里
然后下一個內存斷點在機器碼的地址,因為我們要找時機把他獲取到本機的機器碼換成原來那個授權機器碼
在機器碼最后一位數上下內存訪問斷點 因為最后一位下斷點可以使機器碼全部獲取出來 然后進行替換
機器碼地址出現自己機器碼的hex數據后,自己單步走幾下 找地址進行patch補丁
補充
剛才看了幾個關於SE的教程 發現了SE殼所調用的api都是自己生成的地址,然后自己調用
證明直接下api斷點是沒用的,就是斷下來 都不是se殼調用的api
例如上面的RegQueryValueExA這個API斷點 他是自己開地址來進行調用的
上面的圖片注意看地址,都是同一個api,但是一個是系統領空的,一個是程序領空
