没有合适的资源?快使用搜索试试~ 我知道了~
各种反调试技术原理与实例VC版.pdf
4星 · 超过85%的资源 需积分: 9 18 下载量 128 浏览量
2010-12-15
19:13:10
上传
评论
收藏 405KB PDF 举报
温馨提示
试读
36页
本书讲解了调试技术及一些技巧,最重要的是根据例子来讲解,对编程调试、逆向的学习也有帮助,喜欢的下载吧
资源推荐
资源详情
资源评论
http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
反调试技术...............................................................................................................................2
发现 OD 的处理...............................................................................................................2
1. 窗口类名、窗口名...................................................................................................3
2. 检测调试器进程.......................................................................................................4
3. 父进程是否是 Explorer............................................................................................5
4. RDTSC/ GetTickCount 时间敏感程序段 ................................................................6
5. StartupInfo 结构........................................................................................................7
6. BeingDebugged.........................................................................................................8
7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags..........................................9
8. DebugPort: CheckRemoteDebuggerPresent()/NtQueryInformationProcess()........12
9. SetUnhandledExceptionFilter/ Debugger Interrupts...............................................14
10. Trap Flag 单步标志异常 ....................................................................................16
11. SeDebugPrivilege 进程权限..............................................................................16
12. DebugObject: NtQueryObject()..........................................................................17
13. OllyDbg:Guard Pages ......................................................................................20
14. Software Breakpoint Detection...........................................................................22
15. Hardware Breakpoints Detection ........................................................................24
16. PatchingDetection CodeChecksumCalculation 补丁检测,代码检验和..........25
17. block input 封锁键盘、鼠标输入......................................................................26
18. EnableWindow 禁用窗口 ...................................................................................27
19. ThreadHideFromDebugger .................................................................................27
20. Disabling Breakpoints 禁用硬件断点 ................................................................29
21. OllyDbg:OutputDebugString() Format String Bug.............................................30
22. TLS Callbacks.....................................................................................................30
反反调试技术.................................................................................................................35
http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
反调试技术
反调试技术反调试技术
反调试技术 VC 版
版版
版
唐久涛
看雪 ID:tangjiutao
本人空间:http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
声明:这篇文章是本人学习的总结,理论部分参考了《脱壳的艺术》、《加密与解密》以及本人从网络上收
集的资料,在此向原作者致敬。本人的贡献在于根据个人理解对各种反调试技术进行了汇总和高度归纳,
并提供了本人创作的各种反调试实例及源代码。本人于 09 年 9 月份开始学习软件逆向工程的相关知识,在
学习过程中得到大量网友的热心帮助,在此向各位致以诚挚谢意。希望本人的这些工作能够对各位有所帮
助,浅陋之处,莫要见笑。各种形式的转载都必须保留作者信息及本声明。
由于本人入门较晚、能力有限,部分方法尚未实现,望高手不吝赐教。实现了的方法大都附有实例程序。
很多方法对于修改版的 OD 已经失效,请用原版 OD 进行测试。
发现
发现发现
发现 OD 的处理
的处理的处理
的处理
一、如何获取 OD 窗口的句柄
1.已经获取了窗口类名或标题:FindWindow 函数
2.没有获取窗口类名或标题
没有获取窗口类名或标题没有获取窗口类名或标题
没有获取窗口类名或标题:
::
:GetForeGroundWindow 返回前台窗口
返回前台窗口返回前台窗口
返回前台窗口,
,,
,这里就是
这里就是这里就是
这里就是 OD 的窗口
的窗口的窗口
的窗口
句柄
句柄句柄
句柄了
了了
了。
。。
。注意这种方法更为重要
注意这种方法更为重要注意这种方法更为重要
注意这种方法更为重要,
,,
,因为大多数情况下不会知道
因为大多数情况下不会知道因为大多数情况下不会知道
因为大多数情况下不会知道 OD 的窗口类名
的窗口类名的窗口类名
的窗口类名。
。。
。
invoke IsDebuggerPresent
.if eax
invoke GetForegroundWindow ;获得的是 OD 的窗口句柄
invoke SendMessage,eax,WM_CLOSE,NULL,NULL
.endif
二、获取 OD 窗口句柄后的处理
(1)向窗口发送 WM_CLOSE 消息
void CDetectODDlg::OnWndcls()
{
// TODO: Add your control notification handler code here
HWND hWnd;
if(hWnd=::FindWindow("OllyDbg",NULL))
{
MessageBox("发现 OD");
::SendMessage(hWnd,WM_CLOSE,NULL,NULL);
}else{
MessageBox("没发现 OD");
}
}
(2)使 OD 窗口不可用
HWND hd_od=FindWindow("ollydbg",NULL);
SetWindowLong(hd_od,GWL_STYLE,WS_DISABLED);
(3)终止相关进程,根据窗口句柄获取进程 ID,根据进程 ID 获取进程句柄,
HWND hWnd;
HANDLE hProc;
DWORD pId;
http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
if(hWnd=::FindWindow("OllyDbg",NULL)) //获取窗口句柄
{
MessageBox("发现 OD");
GetWindowThreadProcessId(hWnd,&pId); //获取进程 ID
hProc=OpenProcess(PROCESS_TERMINATE,TRUE,pId); //获取进程句柄
TerminateProcess(hProc,200); //终止进程
CloseHandle(hProc);
}else{
MessageBox("没发现 OD");
}
(2)程序自身直接退出
1. 窗口类名
窗口类名窗口类名
窗口类名、
、、
、窗口名
窗口名窗口名
窗口名
(1) FindWindow
(2) EnumWindow 函数调用后,系统枚举所有顶级窗口,为每个窗口调用一次回调函数。
在回调函数中用 GetWindowText 得到窗口标题,用 strstr 等函数查找有无 Ollydbg 字
符串。StrStr(大小写敏感,对应的 StrStrI 大小写不敏感)函数返回 str2 第一次出现在
str1 中的位置,如果没有找到,返回 NULL。
(3) GetForeGroundWindow 返回前台窗口(用户当前工作的窗口)。当程序被调试时,调
用这个函数将获得 Ollydbg 的窗口句柄,这样就可以向其发送 WM_CLOSE 消息将
其关闭了。
(1)FindWindow
void CDetectODDlg::OnWndcls()
{
// TODO: Add your control notification handler code here
HWND hWnd;
if(hWnd=::FindWindow("OllyDbg",NULL))
{
MessageBox("发现 OD");
::SendMessage(hWnd,WM_CLOSE,NULL,NULL);
}else{
MessageBox("没发现 OD");
}
}
(2)EnumWindow
包含头文件:#include "Shlwapi.h"
BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
)
{
http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
char ch[100];
CString str="Ollydbg";
if(IsWindowVisible(hwnd))
{
::GetWindowText(hwnd,ch,100);
//AfxMessageBox(ch);
if(::StrStrI(ch,str))
{
AfxMessageBox("发现 OD");
return FALSE;
}
}
return TRUE;
}
void CDetectODDlg::OnEnumwindow()
{
// TODO: Add your control notification handler code here
EnumWindows(EnumWindowsProc,NULL);
AfxMessageBox("枚举窗口结束,未提示发现 OD,则没有 OD");
}
2. 检测调试器进程
枚举进程列表,看是否有调试器进程(OLLYDBG.EXE,windbg.exe 等)。
利用 kernel32!ReadProcessMemory()读取进程内存,然后寻找调试器相关的字符串(如”
OLLYDBG”)以防止逆向分析人员修改调试器的可执行文件名。
需要头文件:#include "tlhelp32.h"
void CDetectODDlg::OnEnumProcess()
{
// TODO: Add your control notification handler code here
HANDLE hwnd;
PROCESSENTRY32 tp32; //结构体
CString str="OLLYDBG.EXE";
BOOL bFindOD=FALSE;
hwnd=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
if(INVALID_HANDLE_VALUE!=hwnd)
{
Process32First(hwnd,&tp32);
do{
if(0==lstrcmp(str,tp32.szExeFile))
{
AfxMessageBox("发现 OD");
http://ucooper.com
写意互联网,关注搜索引擎技术,涉猎搜索引擎优化、软件破解、PHP 网站建设、Wordpress 应用等
bFindOD=TRUE;
break;
}
}while(Process32Next(hwnd,&tp32));
if(!bFindOD)
AfxMessageBox("没有 OD");
}
CloseHandle(hwnd);
}
3. 父进程是否是
父进程是否是父进程是否是
父进程是否是 Explorer
原理:通常进程的父进程是 explorer.exe(双击执行的情况下),否则可能程序被调试。
下面是实现这种检查的一种方法:
1.通过 TEB(TEB.ClientId)或者使用 GetCurrentProcessId()来检索当前进程的 PID
2 . 用 Process32First/Next() 得 到 所 有 进 程 的 列 表 , 注 意 explorer.exe 的 PID ( 通 过
PROCESSENTRY32.szExeFile)和通过 PROCESSENTRY32.th32ParentProcessID 获得的当前
进程的父进程 PID。Explorer 进程 ID 也可以通过桌面窗口类和名称获得。
3.如果父进程的 PID 不是 explorer.exe,cmd.exe,Services.exe 的 PID,则目标进程很可能
被调试
对策:Olly Advanced 提供的方法是让 Process32Next()总是返回 fail,使进程枚举失效,PID
检查将会被跳过。这些是通过补丁 kernel32!Process32NextW()的入口代码(将 EAX 值设为
0 然后直接返回)实现的。
(1)通过桌面类和名称获得 Explorer 的 PID 源码见附件
DWORD ExplorerID;
::GetWindowThreadProcessId(::FindWindow("Progman",NULL),&ExplorerID);
(2)通过进程列表快照获得 Explorer 的 PID 源码见附件
void CDetectODDlg::OnExplorer()
{
// TODO: Add your control notification handler code here
HANDLE hwnd;
PROCESSENTRY32 tp32; //结构体
CString str="Explorer.EXE";
DWORD ExplorerID;
DWORD SelfID;
DWORD SelfParentID;
SelfID=GetCurrentProcessId();
::GetWindowThreadProcessId(::FindWindow("Progman",NULL),&ExplorerID);
hwnd=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
if(INVALID_HANDLE_VALUE!=hwnd)
{
Process32First(hwnd,&tp32);
do{
剩余35页未读,继续阅读
资源评论
- zhangsan_123_abc2013-02-21呵呵....看着好像挺牛似的!
- imliuxin22014-09-27好全啊!几乎包括ring3所有的方面
nono507
- 粉丝: 10
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功