首页
论坛
专栏
课程

VB反跟踪技术点滴

2006-5-24 20:05 18410

VB反跟踪技术点滴

2006-5-24 20:05
18410
    跟其它语言相比,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机制。

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (38)
小剑 2006-5-24 20:16
2
0
还在用 6.0 ,支持大虾的好文章。。。。。。。。
FFPDI 2006-5-24 20:58
3
0
收藏学习。
hrbx 8 2006-5-24 22:16
4
0
好文,支持一下
wenglingok 26 2006-5-24 22:31
5
0
虽然不大用 VB ,软件反调试的原理都差不多。LZ 归纳的太有用了。
playx 1 2006-5-25 00:26
6
0
经典
cyto 31 2006-5-25 06:44
7
0
收下,谢谢!
紫色缘 7 2006-5-25 07:54
8
0
收藏学习~谢谢
jfaumt 2006-5-25 08:14
9
0
好文章啊,已收藏。
wujingyi 2006-5-25 08:37
10
0
支持,不错
kakamo 2006-5-25 21:12
11
0
楼主好样的!非常感谢……
drwch 3 2006-5-25 23:22
12
0
支持,不过有一个基于堆栈检测的楼主没写,呵呵
cnnets 2006-5-26 10:26
13
0
最初由 drwch 发布
支持,不过有一个基于堆栈检测的楼主没写,呵呵


能否贴上来看看。

呵呵,LZ的文章不错耶。
moodsky 8 2006-5-26 11:01
14
0
CZCracker 2006-5-26 17:51
15
0
我以前也一直用VB,我最喜欢楼主那句,没有最好的语言,只有最好的程序员这句话,非常支持,呵呵,我收藏起楼主的文章 ,谢谢。
wanghuhong 2006-6-2 22:45
16
0
谢谢
老祁 2006-6-9 16:38
17
0
学习中.....................
月中人 18 2006-6-10 17:52
18
0
支持并学习ing
hhxx26 2006-6-10 21:19
19
0
不错,vb这方面的研究太少了
jiandan 2006-6-11 00:11
20
0
支持一下!看了楼主的文章,增加不少知识
温柔刀 2006-6-11 12:23
21
0
收藏学习一下
fixcool 2006-6-11 12:29
22
0
看起来不错!不过vb不怎么懂!
skyege 2 2006-6-11 16:59
23
0
个人觉得,语言并不是问题,重要是方法。虽然说具体的例子不多,但不同语言之间其实可以“翻译”的(起码我是这么干),只是在编写上会因语言而不同,难易度也不同。也许根据语言特点专门编写的东西会无法转换吧。
tsfrzjq 2006-6-11 19:54
24
0
好文要支持的!
pentacleNC 4 2006-6-17 15:02
25
0
好贴收藏
KrisCn 2006-6-17 16:06
26
0
好东西。。。。
fishabc 2006-6-18 10:34
27
0
good!!
lsm 2006-6-22 14:12
28
0
好 , 看 看
小叉 2006-6-22 15:53
29
0
目前还看不明白. 
fishabc 2006-6-22 19:23
30
0
支持! 希望多些类似文章
alexplus 2006-6-22 20:49
31
0
感谢LZ。的确是好东西。
小耗子 2006-6-23 13:13
32
0
不错,收下了啊,
wanghuhong 2006-9-15 20:59
33
0
收了,谢谢
wangwei 2006-9-16 01:47
34
0
我也觉得是没有最好的编程工具,但人的意识悟性却要很重要.
发烧cyrix 2006-9-17 12:03
35
0
好东西,有刺激!我都一一做了测试,对于检测OD的那个我还真没有什么办法对付!
zyhxhw 2006-9-17 19:11
36
0
学习了,谢谢!
剑次狼 2006-9-18 09:02
37
0
收藏学习~非常感谢~
cg001 2006-11-7 17:00
38
0
vb的破解真的不好搞啊
fans 2006-11-29 21:31
39
0
游客
登录 | 注册 方可回帖
返回