聖天諾的虛擬機器保護方式:關於那個巨大的二叉樹。。。。。 (5千字)
聖天諾的虛擬機器保護方式:關於那個巨大的二叉樹。。。。。
先說明一個結構:
CallStruct
{ WORD
key1;
WORD key2;
DWORD code;
};
這個結構共 8 個位元組長,程式開始部分即取自該結構中的資料進行分析,從而進入不同的模組部分。
程式碼如下:
:004119A6 A194754000
mov eax, dword ptr [00407594] <---注:地址
00407594 中儲存的就是 CallStruct 結構的指標
:004119AB 8B0D94754000
mov ecx, dword ptr [00407594]
:004119B1 668B00
mov ax, word ptr [eax]
<---取 key1
:004119B4
66A3A0754000 mov word ptr [004075A0],
ax
:004119BA 668B5102
mov dx, word ptr [ecx+02] <---取
key2
:004119BE 668915A4754000 mov word
ptr [004075A4], dx
:004119C5 8B4104
mov eax, dword ptr [ecx+04] <---取
code
:004119C8 A398754000
mov dword ptr [00407598], eax
:004119CD 011D94754000
add dword ptr [00407594], ebx
:004119D3 33C0
xor eax, eax
:004119D5
66A1A0754000 mov ax, word ptr [004075A0]
:004119DB 3D42030000 cmp
eax, 00000342
<---判斷 key1 從而進入不同的模組部分
:004119E0 7F13
jg 004119F5
:004119E2 0F84C6010000
je 00411BAE
:004119E8 3DE4000000
cmp eax, 000000E4
:004119ED 0F8481010000
je 00411B74
:004119F3 EBB1
jmp 004119A6
從以上可以看到 key1 用作代表不同的模組。進一步分析程式,可以分析得出其使用 00407590 、00407594 、00407598 這三個地址來用作資料傳遞的地址。以後我將其簡稱為
A 、B 、C 。
key1 的作用知道了,那麼來了解一下 key2 的作用。分析可以發現 key2 是在某些模組內部(也就是說並非所有模組)用作取值方式的。
下面以分析 004116D0 處的模組為例:
其呼叫形式為: CALL_004116D0(var1,var2)
當 key2 = 68 時,程式實現功能為: 返回 [var1] 的 Byte 位元組。(注: [var1] 表示取 var1 地址中的值,以下類同)
當 key2 = D4 時,程式實現功能為: 返回 [[407590] + 4*var1] 的 DWORD 位元組。
(注:即 取407590地址中的值,然後加上4乘以var1的和,再取以"和"為地址的值,返回)
下面列舉幾個模組和 key2 的組合及相應實現的功能:
key2 模組名1
模組名2
模組名3
4116D0
411670
411E1D
功能:返回 eax
功能:賦值
功能:判斷某些位是否不為0
68
byte [var1]
[var1] <= byte var3
if( [[407590]] & 0x000000FF
<> 0 ) ok!
D4 dword [var1 * 4 + [407590]]
[var1 * 4 + [407590]] <= var3
if( [[407590]] <>
0 ) ok!
234 dword [var1]
[var1] <=
dword var3 if(
[[407590]] <> 0 ) ok!
28E word [var1]
[var1] <=
word var3 if(
[[407590]] & 0x0000FFFF <> 0 ) ok!
3D5
var1
直接返回
if( [[407590]] <>
0 ) ok!
下面再來具體分析一下各個模組的功能及作用,列舉如下:
為簡化表達,把 4116D0 、411670
、411E1D 分別命名為 f1( ) 、f2( ) 、f3( )
key1 模組起始地址
模組功能
0611 411BCA
類似 411E1D 模組,也會根據key2的值實現判斷功能。只是 <> 變為 == 判斷即可。
0704
411C1B f2([407598],key2,f1([407598],key2))
1092 411C4F
[[407590]] += f1([407598],key2)
1109 411C72
[[407590]+4] = call_407598([[407590]+4],[[407590]])
, [407590] += 4
1992 411C9B
f2([407598],key2,[[407590]]) , [407590] += 4
1A44 411CC4
[407590] -= 4, [[407590]] =
call_407598()
22B7 411D00
[[407590]] -= f1([407598],key2)
3345 411D23
[[407590]] &= f1([407598],key2)
5910 411FBA
[407594] <= [407598]
654D 411D9D
[[407590]] |= f1([407598],key2)
698A
411E00 f2([407598],key2,0)
7123 411E1D
判斷
74BB 411E6E
[[407590]] ^= f1([407598],key2)
9104
411ED1 [[407590]]
*= f1([407598],key2)
AA61 411F2D
[[407590]+C] = call_407598([[407590]+C],[[407590]+8],[[407590]+4],[[407590]]),
[407590] += 0xC
B323 411F5F
[[407590]+8] = call_407598([[407590]+8],[[407590]+4],[[407590]]),
[407590] += 8 還原演算法
BA51 411F8C
[[407590]] = call_407598([407590])
CDD3 411FC9
[[407590]+edi] = [407598] = f1([407598],key2)
歸納可以發現如下:
1、判斷模組,分別實現不等跳轉和相等跳轉。
0611 411BCA
類似 411E1D 模組,也會根據key2的值實現判斷功能。只是 <> 變為 == 判斷即可。
7123 411E1D
判斷
2、四則運算模組,分別實現加、減、乘、等運算。
74BB 411E6E
[[407590]] ^= f1([407598],key2)
9104 411ED1
[[407590]] *= f1([407598],key2)
1092 411C4F
[[407590]] += f1([407598],key2)
22B7 411D00
[[407590]] -= f1([407598],key2)
3345 411D23
[[407590]] &= f1([407598],key2)
654D 411D9D
[[407590]] |= f1([407598],key2)
3、賦值模組,分別實現不同方式的賦值。
698A 411E00 f2([407598],key2,0)
0704 411C1B
f2([407598],key2,f1([407598],key2))
1992 411C9B
f2([407598],key2,[[407590]])
, [407590] += esi
4、呼叫函式模組,分別實現不同引數方式函式呼叫。
1A44 411CC4
[407590] += edi, [[407590]]
= call_407598()
BA51 411F8C
[[407590]] = call_407598([407590])
1109 411C72
[[407590]+4] = call_407598([[407590]+4],[[407590]])
, [407590] += esi
AA61 411F2D
[[407590]+C] = call_407598([[407590]+C],[[407590]+8],[[407590]+4],[[407590]]),
[407590] += 0xC
B323 411F5F
[[407590]+8] = call_407598([[407590]+8],[[407590]+4],[[407590]]),
[407590] += ebx 還原演算法
5、其他,實現資料的傳遞和控制程式流程。
CDD3
411FC9 [[407590]+edi]
= [407598] = f1([407598],key2)
5910 411FBA
[407594] <= [407598]
最後說明一下:
這是以前自己分析聖天諾外殼時整理的一些記錄。那個二叉樹的各個分支就是用於識別各個偽機器碼的。上面分析的就是各個偽機器碼的作用,以及偽機器碼的格式的。這個偽處理機只使用在聖天諾的最外層結構上,而進入核心部分還是和我們常見的程式沒有什麼區別。
如果你不瞭解聖天諾的這個偽處理機,那麼從某些方面來說防止了暴破,因為我們常常會從彈出的對話方塊入手來找到程式的關鍵暴破點,但是這個殼中使用的偽處理機的判斷部分是在偽處理機的一個用於進行"判斷"的模組(實際上就是一條偽機器碼)中,如果你不明白這其中的道理,把這個"判斷"模組中的"JZ"語句修改了,就相當於把整個偽處理機中的"判斷"模組修改了一樣,想象一下如果我們把程式中所有的"JZ"指令改成"JNZ"的後果,這有些類似這個道理。
當然,也有有趣的地方,在其中一個早期版本的聖天諾外殼中,倒是程式中只使用了"JZ"判斷模組,如果你把這個"判斷"模組修改一下,會出現什麼後果?這樣偽處理機反而使暴破省事了。
相關文章
- 關於虛擬機器的使用2024-07-07虛擬機
- 聖天諾LDK加密鎖(加密狗)如何保護Linux系統下的軟體2024-03-19加密Linux
- 關於虛擬機器聯網的幾個問題2014-12-30虛擬機
- 如何用 OllyDbg 的跟蹤功能分析虛擬機器保護2017-01-14虛擬機
- 逆向被虛擬機器所保護的二進位制檔案2020-08-19虛擬機
- 關於幾個簡單遊戲的CD保護破解。 (3千字)2001-01-05遊戲
- 關於VMware Workstation CentOS虛擬機器聯網遇到的幾個問題2017-06-18CentOS虛擬機
- 配置虛擬機器網路的三種方式2014-09-20虛擬機
- VMware vSphere Replication 9.0 - 虛擬機器複製和資料保護2024-03-20虛擬機
- 關於VMware虛擬機器磁碟收縮的幾種方法2016-12-25虛擬機
- 關於虛擬機器VM聯網問題2020-11-30虛擬機
- 主機和虛擬機器的三種通訊方式2014-08-15虛擬機
- 關於vm虛擬機器 不能上網的解決辦法2020-11-25虛擬機
- 關於解決主機和虛擬機器ping不通的問題2020-12-03虛擬機
- 虛擬化環境下的資料保護方案2011-03-18
- 關於二叉樹2024-08-19二叉樹
- Dalvik虛擬機器、Java虛擬機器與ART虛擬機器2018-08-22虛擬機Java
- 虛擬機器的概念2018-11-03虛擬機
- 虛擬機器的克隆2018-06-08虛擬機
- 虛擬機器的搭建2024-08-21虛擬機
- Nginx 虛擬主機配置的三種方式(基於域名)2018-12-19Nginx
- 關於二叉樹的幾個必須掌握的實現2019-03-06二叉樹
- pxe基於虛擬機器的自啟動2017-07-29虛擬機
- 關於共享資源保護的思考2022-12-17
- 關於pl/sql的程式碼保護2015-01-16SQL
- 中關於虛擬機器複製與遷移(中)2014-07-24虛擬機
- 維護SQL Server虛擬機器的高可用性NJ2022-03-22SQLServer虛擬機
- 保護雲端資料的5個技巧2021-03-05
- iOS隱私保護時代,CEO關心的5個問題2021-08-18iOS
- 虛擬機器網路的2個問題2014-01-23虛擬機
- KVM虛擬機器的管理2020-10-21虛擬機
- 建立新的虛擬機器2020-12-30虛擬機
- 【虛擬機器的瞭解】2017-03-26虛擬機
- 關於Java虛擬機器執行時資料區域的總結2019-08-13Java虛擬機
- 關於kangle虛擬主機系統與N點虛擬主機系統的比較2016-05-12
- VMware虛擬機器直連物理網路的兩種方式2017-02-21虛擬機
- java虛擬機器和Dalvik虛擬機器2020-04-04Java虛擬機
- Android 虛擬機器 Vs Java 虛擬機器2018-12-30Android虛擬機Java