为了顺应当前形势和更好的发展,黑基网已于9月19日正式更名为【安基网】,域名更换为www.safebase.cn,请卸载旧的APP并安装新的APP,给您带来不便,敬请理解!谢谢

黑基Web安全攻防班
安基网 首页 IT技术 安全攻防 查看内容

VB反跟踪技术浅析

2007-11-12 10:54| 投稿: security

摘要:         跟其它语言相比,VB总是被人“鄙视”,其实没有好与不好的语言,正如某程序员说的:没有最好的...
        跟其它语言相比,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机制。

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部