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
 
大大好亂喔,可以排版一下嗎= =
回覆刪除已排版
刪除