这是linhanshi兄放在他的网站上的,我觉得不错就翻译了下,水平很烂,多多包涵!
The other ways to detect OllyDbg 检测OllyDbg的另类方法
Pumqara作/RoBa[TT]译
前言
现在是2004年了,RING-3级调试器被越来越多地使用,因为它们有图形界面并且比RING-0级调试器(比如SOFTICE)更加方便。在这篇文章中我将讲述如何检测最好的RING-3调试器之一――OllyDbg。许多人都听说过IsDebugerPresent和fs:[20]检测手段,但是有没有其他的新方法呢?下面我向你介绍我自己的一些检测手段。我会给出详细的解释,因此你可以用你自己的想象力来完善它们。
方法一:FindWindow
这个方法是基于FindWindow函数。像所有的对话框一样,OllyDbg的主对话框(窗口?)也有它的标题和类名。使用这个API函数我们可以判断OllyDbg的主窗口是否打开。Microsoft这样写道:
------------------------------------------------------------------------------------------------
FindWindow函数能够获得窗口类名或标题为特定字符串的顶层窗口的句柄。该函数不搜索子窗口。
HWND FindWindow(
LPCTSTR lpClassName, //窗口类名的地址
LPCTSTR lpWindowName //窗口标题的地址
);
参数说明
lpClassName
指向一个以NULL结尾的表示窗口类名的字符串的指针,或者是一个标识窗口类名字符串的atom。如果该参数是一个atom,它必须是被函数GlobalAddAtom预先建立的一个全局atom。这个16位的atom必须放在lpClassName的低8位,lpClassName的高8位必须为0。
lpWindowName
指向一个以NULL结尾的表示窗口名称(即标题)的字符串的指针。如果这个参数为NULL,所有的窗口都被认为是符合条件的。
返回值
如果搜索成功,返回找到的符合条件的窗口句柄。
如果搜索失败,返回值为NULL。要得到详细的错误信息可以调用GetLastError。
------------------------------------------------------------------------------------------------
我的程序片断:
.data
strOllyClsName db "OLLYDBG",0
.code
invoke FindWindow, ADDR strOllyClsName, NULL
cmp eax, 00000000h
jne Olly_Detected/
.586
.model flat, stdcall
option casemap:none
include d:\masm32\INCLUDE\Windows.inc
include d:\masm32\INCLUDE\user32.inc
include d:\masm32\INCLUDE\kernel32.inc
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
.data
strCaption db "OllyDbg Detector!",0
strFound db "OllyDbg found!",0
strNotFound db "OllyDbg NOT found!",0
strOllyDbg db "OLLYDBG.EXE",0h
valCurrentPiD dd 0
valParentPiD dd 0
hSnapShot dd 0
.data?
proces PROCESSENTRY32 <>
.code
start:
; 建立快照
invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS,NULL
mov hSnapShot,eax
; 得到当前进程ID
invoke GetCurrentProcessId
mov valCurrentPiD,eax
lea esi,offset proces
assume esi:ptr PROCESSENTRY32
mov [esi].dwSize,sizeof PROCESSENTRY32
; 开始第一轮搜索
; 用valCurrentPiD查找当前进程
invoke Process32First,hSnapShot,addr proces
lea esi,offset proces
assume esi:ptr PROCESSENTRY32
mov ebx,valCurrentPiD
cmp ebx,[esi].th32ProcessID
jne nope1
nope1:
invoke Process32Next,hSnapShot,addr proces
lea esi,offset proces
assume esi:ptr PROCESSENTRY32
mov ebx,valCurrentPiD
cmp ebx,[esi].th32ProcessID
jne nope1
push [esi].th32ParentProcessID
pop valParentPiD
invoke CloseHandle,hSnapShot
; 再次建立快照
invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS,NULL
mov hSnapShot,eax
mov [esi].dwSize,sizeof PROCESSENTRY32
; 开始第二轮搜索
; 使用valParentPiD查找当前进程的父进程
invoke Process32First,hSnapShot,addr proces
lea esi,offset proces
assume esi:ptr PROCESSENTRY32
mov ebx,valParentPiD
cmp ebx,[esi].th32ProcessID
jne nope2
nope2:
invoke Process32Next,hSnapShot,addr proces
lea esi,offset proces
assume esi:ptr PROCESSENTRY32
mov ebx,valParentPiD
cmp ebx,[esi].th32ProcessID
jne nope2
; 从完整路径中提取出文件名
lea eax, [esi].szExeFile
push eax
invoke lstrlen,eax
sub eax,11
pop ebx
add ebx,eax
; 把文件名变成大写,与"OLLYDBG.EXE"比较
invoke CharUpper,ebx
invoke lstrcmp,ebx,addr strOllyDbg
.IF eax==0
invoke MessageBox,0,addr strFound,addr strCaption,0
.ELSE
invoke MessageBox,0,addr strNotFound,addr strCaption,0
.ENDIF
invoke CloseHandle,hSnapShot
invoke ExitProcess,0
end start
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!