检测手段
这个帖子拖这么长 代码估计是不发了 来更新上一些理论知识
我的帖子怎么沉这么深了 给我起来!!^_^
加点东西
跳过了N多的指令 一下的所有记录都将是跳跃式的 一切初始化、计算、移动等无聊部分都被略过 当然如果关键操作 而我也没有看到的也将被跳过 将就着看吧VM_MOVdw_[EBP]_EBP+4这是一条跨堆栈的指令,他可以把数据随意的存到其他地方,VM就是用这条指令把下面的DLL的名字存入到EBPSTACK下面的堆栈中,下面的堆栈空间被当做是一个字符串存储的数据空间
CPU Stack
Locked Value ASCII Comments
0013F790 7C80B741 A| ; kernel32.GetModuleHandleA
0013F794 0013FF8C . ; ASCII "SbieDll.dll"
VM_APIJMP_EBPSTACK
;这个指令首先给ECX放入API参数的个数,循环读取参数,最后跳转进系统空间
;第一个APIJMP检测的是 沙盘(sandboxie) 我没有用沙盘
;跳转地址:004363EA
;解码出第二个要检测的函数kernel32.IsDebuggerPresent
;还有一个地址0013F6C8 004393BC C. ; Entry point of procedure
CPU Stack
Locked Value ASCII Comments
0013F698 7C813133 31| ; kernel32.IsDebuggerPresent
;下一个要检测的是IsDebuggerPresent函数,但是在进入之前,先来一个CC码检测,看看有没有下断
CPU Stack
Locked Value ASCII Comments
0013F790 3133
0013F794 00CC7C81 |.
VM_EBPSTACKw_MEMb
0013F794 00CC0064 d..
;接下来就是一系列的检查和比较跳转 这里不再复述
;我肯定是没有下断点洒 最后计算好、解密完的地址是0043C2D4
VM_JMP ;走起
0013F698 7C813133 31| ; kernel32.IsDebuggerPresent
VM_APIJMP_EBPSTACK
;这里就直接该返回值了,返回值肯定是1洒,毫不犹豫的改为0
;接着就是检测返回值了 毫无疑问 VM检测不出来^_^
;最后的比较跳转地址:0043929C
VM_JMP ;走起
0013F794 7C85AAF2 | ; kernel32.CheckRemoteDebuggerPresent
;我们的第三位登场的角色就是它了
VM_JMP ;走起
;CC码检测是必须的
VM_EBPSTACKw_MEMb
0013F794 00CC008B ..
;最后的比较+跳转时刻的堆栈图:
0013F780 FFBF
0013F784 FD6CFFFF l
0013F788 0004FFFF .
0013F78C 0013F790 .
0013F790 7681CB89 v
0013F794 768003D3 v
;我肯定是没有下断点洒 最后计算好、解密完的地址是0043A82B
VM_JMP ;走起
0013F78C 7C85AAF2 | ; kernel32.CheckRemoteDebuggerPresent
0013F790 FFFFFFFF
0013F794 0013FF98 .
VM_APIJMP_EBPSTACK ;执行去了
;返回值修改为0
;接着还是一系列的比较,ZF位检测,最后的跳转地址:00428F50
;我们如果不修改,被查到你开了调试器,跑去了另外一路的结局就是:
0013F794 00423E60 `>B. ; ASCII "A debugger has been found running in your system.
Please, unload it from memory and restart your program."
VM_APIJMP_EBPSTACK
0013F788 7C80B56F o| ; kernel32.GetModuleFileNameA
0013F78C 00400000 ..@. ; OFFSET NOTEPAD
;最后的结局就是消息框里“嘣”的弹出上面的话给你
VM_JMP ;走起
0013F794 7C809BE7 | ; kernel32.CloseHandle
;下一个是这位
0013F784 7C809BE7 | ; kernel32.CloseHandle
0013F788 DEADC0DE ;这叫什么东西!
0013F78C 0013FFE0 . ; Pointer to next SEH record
0013F790 00427A04 zB. ; SE handler
0013F794 0013FF98 .
VM_APIJMP_EBPSTACK ;执行
;返回为0 也不用去异常 这是一个关闭无效句柄的检测 DEADCODE本身就不是什么东西
;跳转地址:0042357C
VM_JMP ;走起
;这次去的地方并不是新的函数,而是释放掉在CloseHandle函数那里构建的SEH
0013F794 7C863FCA ?| ; kernel32.UnhandledExceptionFilter
;首先依然是检测CC码,跳转地址:00422E3E
VM_JMP ;走起
0013F794 7C809BE7 | ; kernel32.CloseHandle
;这个也一起出现,跳转地址:004262DC
VM_JMP ;走起
0013F76C 0013FF8C . ; ASCII "sice.sys"
;这个也出现,跳转地址:00422D4C
VM_JMP ;走起
0013F794 0013FF8C . ; ASCII "siwvid.sys"
;字符串进一步解码为这个
0013F790 00425E64 d^B.
0013F794 0013FF8C . ; ASCII "siwvid.sys"
VM_APIJMP_EBPSTACK
;命名的有点问题,这个handler并不只是可以跳去API,它是有一个分支的,这里它就跳去了一个VM的call里
;SoftIce都停止开发了,我也没有用洒,不怕它检测
0013F634 7C92D92E .| ; ntdll.NtQuerySystemInformation
;呼呼 好绕呀,最后进入的是这个函数
;跳转地址:0042357C
VM_JMP ;走起
;跳转地址:00426071 我晕 我想不起我装了SoftIce的,让我们重新来过,这里过去就灭了
VM_JMP ;走起
