VB反跟蹤技術點滴
- 標 題: VB反跟蹤技術點滴
作 者: laomms
時 間: 2006-05-24,20:05:09
鏈 接: http://bbs.pediy.com/showthread.php?t=26213
跟其它語言相比,VB總是被人「鄙視」,其實沒有好與不好的語言,正如某程序員說的:沒有最好的語言,只有最好的程序員。VB也有它自己的特點,簡單、方便、可視化強、利於快速開發,6M的迷你版更是讓人在不釋手。而且容易入門,也是通往其它語言最好的一個奠基。可惜關於VB方面的保護技術的文章很少,軟件加密技術裡面有涉及VB的保護內容,但是源碼太少了,大部分是C和MASM源碼,這裡我們也粗略的講講VB的一些保護技術,如果你還有更好的方法希望在下面補充。
一、檢測父進程反RING3調試器,我們知道WIN32系統一般軟件的父進程都是EXPLORE,而OD等RING3調試器對軟件進行調試時都是將它們的線程設為它的子線程,我們只要讓程序檢查父進程是否為EXPLORE就行,看附件裡的Anti-Debug,如果發現父進程不是EXPLORE.EXE就自動退出,源碼如下:
'相關的API自己查查
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '建立進程快照
If hSnapShot Then
Process.dwSize = 1060
If (Process32First(hSnapShot, Process)) Then '遍歷第一個進程,獲得PROCESSENTRY32結構
Do
i = InStr(1, Process.szExeFile, Chr(0)) '獲得映像名稱
mName = LCase(Left(Process.szExeFile, i - 1)) '並轉換成小寫
If mName = "explorer.exe" Then '是不是explorer.exe
explorer = Process.th32ProcessID '獲得進程ID
ElseIf Process.th32ProcessID = GetCurrentProcessId() Then '是不是自己
pid = Process.th32ParentProcessID '獲得自己父進程ID
Else
flag = False
End If
Loop Until (Process32Next(hSnapShot, Process) < 1) '遍歷所有進程直到返回值為False
End If
l1 = CloseHandle(hSnapShot)
End If
If pid <> explorer Then
TerminateProcess hprocess, 0
Else
MsgBox "ok"
On Error Resume Next
End If
End Sub
當然這個方法也不是萬能的,在Process32First下斷,更改跳轉輕易躲過。
二、反SMARTCHECK加載,SMARTCHECK是調試VB的利器,有必要對其進行防範。小樓前輩在軟件加密技術內幕中提到兩種檢測方法:
利用VB的AppActivate函數激活SMARTCHECK窗口,然後發送ALT+F4進行關閉該窗口和利用FindWindow發現SMARTCHECK窗口直接將其關閉,其代碼基本上是這樣:
winHwnd = FindWindow(vbNullString, "Numega SmartCheck")
If winHwnd <> 0 Then
AppActivate "Numega SmartCheck"
sendkey "%{f4}", True
sendkey "%y", True
其實,我覺得直接檢測進程SMARTCHK.EXE是否存在也可以,方法跟上面類似,你還可以檢測其它比如W32DASM等進程,附件中的Anti-Load就是實例,發現SMARTCHK調用,自動退出:
…..
If InStr(LCase(Process.szExeFile), "smartchk.exe") > 0 Then
smart = Process.th32ProcessID
TerminateProcess hprocess, 0
Unload Me
Exit Do
End If
…….
三、檢測SOFTICE,附件裡的Anti-ice就是Aming前輩的代碼,在內存中直接檢測SOFTICE。
四、利用IsDebuggerPresent檢測調試器,這個對於OD來說已經一點用都沒有了。具體看附件中的IsDebuggerPresent。
Private Declare Function IsDebuggerPresent Lib "kernel32" () As Long
Private Sub Command1_Click()
If IsDebuggerPresent Then
End
Else
MsgBox "沒有被調試"
End If
End Sub
五、加密字符串。
比如Text1.text=」恭喜」,我們可以這樣寫:Text1.text=Chr(-18009) & Chr(-12366) & Chr(33),另外一種就是寫算法將字符串進行加密,實例Encodestring裡你將找不到字符串信息,找到的是亂碼。
六、實現軟件代碼校檢防止被修改,比如用CRC或者MD5進行自身代碼完整性檢測,實現方法:
先寫一個用於增加CRC特徵碼的軟件,假設定義為結尾部分:
Const CRC_HEAD = &H761226 '用於判斷是否添加了CRC校驗
Private Type stCRC
lHead As Long '驗證是否進行CRC校驗的標識
lCRC As Long 'CRC校驗值
End Type
Private Sub Command1_Click()
CRC_Exe App.Path & "\工程1.Exe"
End Sub
Private Function CRC_Exe(ByVal strExe As String) As Boolean
Dim hFile As Long
Dim lFileLen As Long
Dim sCRC As stCRC
Dim btExe() As Byte
On Error GoTo Err_CRC_Exe
lFileLen = FileLen(strExe)
hFile = FreeFile
Open strExe For Binary As #hFile '打開加密文件
Seek hFile, lFileLen - LenB(sCRC) + 1 '定位CRC標識域,位於Exe文件尾部文件
Get hFile, , sCRC
If sCRC.lHead = CRC_HEAD Then '如果已經添加了CRC校驗則退出,反之添加CRC校驗
MsgBox "已CRC驗證!"
Close #hFile
Exit Function
Else
Seek hFile, 1 '定位到文件首部
ReDim btExe(lFileLen - 1)
Get hFile, , btExe '按字節方式將Exe數據讀入數組
sCRC.lHead = CRC_HEAD '添加CRC驗證標識
sCRC.lCRC = Get_CRC(VarPtr(btExe(0)), lFileLen) '獲取Exe內容CRC值
Put hFile, , sCRC '將CRC校驗寫入Exe文件尾部
End If
Close #hFile
MsgBox "CRC校驗完成!"
CRC_Exe = True
Exit Function
Err_CRC_Exe:
If hFile <> 0 Then Close #hFile
CRC_Exe = False
MsgBox Err.Description
End Function
為程序本身增加CRC校檢代碼:
Const CRC_HEAD = &H761226 '用於判斷是否添加了CRC校驗
Private Type stCRC
lHead As Long '驗證是否進行CRC校驗的標識
lCRC As Long 'CRC校驗值
End Type
Private Sub Form_Load()
Dim hFile As Long
Dim sCRC As stCRC
Dim strExe As String
Dim lFileLen As Long
Dim btExe() As Byte
strExe = App.Path & "\" & App.EXEName & ".exe"
lFileLen = FileLen(strExe)
ReDim btExe(lFileLen - LenB(sCRC) - 1) As Byte '定義Exe字節緩存數組
hFile = FreeFile
Open strExe For Binary As #hFile '讀取Exe數據到數組
Get #hFile, , btExe
Get #hFile, , sCRC
Close #hFile
If sCRC.lHead = CRC_HEAD Then '如果程序添加了CRC驗證則驗證CRC值
If Get_CRC(VarPtr(btExe(0)), UBound(btExe) + 1) = lCRC Then '驗證Exe數據CRC和保存的CRC值是否相同
MsgBox "文件未修改!".
Else
MsgBox "文件被非法修改!"
End If
Else
MsgBox "文件尚未進行CRC驗證!" '檢查尾部是否已已經增加CRC校檢
End If
End Sub
其中的CRC模塊網上很多。附件中的CRC32就是實例,修改任何一處軟件都提示被修改。增加自校檢後建議再隨便加個殼,否則用UltraEdit直接就可以對比原文件查出CRC校驗值位置。
七、利用SEH進行反跟蹤,附件裡的SHE如果用SMARTCHECK調試的話就合自動退出,附上小樓的源碼:
Option Explicit
Private Declare Sub DebugBreak Lib "kernel32" ()
Private Sub Command1_Click()
On Error GoTo ERR_RaiseException
DebugBreak
DebugBreak
Exit Sub
ERR_RaiseException:
MsgBox "沒有發現調試器!"
End Sub
Sub SetHandler()
SetUnhandledExceptionFilter AddressOf NewExceptionHandler
End Sub
Sub RestoreHandler()
SetUnhandledExceptionFilter 0
End Sub
Private Sub Form_Load()
SetHandler
End Sub
Private Sub Form_Unload(Cancel As Integer)
RestoreHandler
End Sub
'SHE模塊略過。 除了上面的一些方法外,你還可以用一些密碼學知識增加難度,如果技術夠強,還可以借用內嵌彙編弄一些花指令和反調試SEH機制。
附件.rar (0, 444 次下載)
附件: http://www.2cto.com/uploadfile/2012/0221/20120221112624706.rar
大大好亂喔,可以排版一下嗎= =
回覆刪除已排版
刪除