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附件.rar (0, 444 次下載)

 附件: http://www.2cto.com/uploadfile/2012/0221/20120221112624706.rar

留言

張貼留言

本月最夯

偷用電腦,怎知?事件檢視器全記錄!(開機時間、啟動項時間...)