首页
社区
课程
招聘
[求助]一个ANTI-OD的DEMO,可我并不知道其原理,Ollydbg的多线程BUG利用问题
发表于: 2015-7-13 10:20 8371

[求助]一个ANTI-OD的DEMO,可我并不知道其原理,Ollydbg的多线程BUG利用问题

2015-7-13 10:20
8371
记得这个DEMO是最早在调试JFZR网游的时候写的DEMO,应该和JFZR的反硬断稍微有点出入,代码也很简单:
DWORD WINAPI ThreadProc(LPVOID lpParam){
	DWORD dwOldPt = 0;
	while(1){
		VirtualProtect((LPVOID)0x00401000,0x1000,PAGE_EXECUTE_READWRITE,&dwOldPt);
		Sleep(1000);
	};
	return 0;
}

void CAntihdbpDlg::OnProtection() 
{
	DWORD dwThreadId[20];
	for(int i = 0; i < 20; i++)
	{
		CreateThread(NULL,0,ThreadProc,NULL,0,&dwThreadId[i]);
	}
	m_protectionBtn.EnableWindow(FALSE);
}


这个简单的代码曾导致了:
OD可以对VirtualProtect下硬断,并且硬断的响应也正常,但是利用OD清空硬断列表之后,F9时将程序崩溃。

程序默认已启动了一条不停调用VirtualProtect的线程,这个时候he VirtualProtect后,再去清理硬断列表不会崩溃。但是点击ANTI按钮后,再做同样的步骤,就会崩溃了。 想求牛人们给个原理,心中疑惑。。。。

这里是附件:
antihdbp.zip

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
http://bbs.pediy.com/showthread.php?p=1321599
2015-7-13 10:26
0
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢,这个帖子去年已经看过了,但是实际调试中,发现OD清理断点后,清理断点SetContextThread的调用次数与线程的数量不一致。。似乎是少设置了几个线程,不太像是SetContextThread失败了。
2015-7-13 10:30
0
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
4
anti_od,个人觉得还是利用父进程判断是否是explore.exe。。!拙见
2015-7-13 10:51
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看了下原贴,要触发这个bug要多线程访问同一地址,在该地址上设置硬断后,清除硬断,在某些情况下SetContextThread清除硬断有可能会失败,而od没有检查结果,直接认为硬断清除成功,导致硬断清除失败的那个线程里依旧会触发这个断点,而此时系统和od都不处理这个断点,导致异常,按照你描述的,SetContextThread的调用次数与线程的数量不一致,所以有些未调用SetContextThread的线程硬断依旧存在。
2015-7-13 10:51
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你把od的进程名改成explorer.exe呢
2015-7-13 10:52
0
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
7
对的 哦。。。那就利用系统特性进行反调试吧
2015-7-13 10:57
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
好东西,下载下来研究下。
2015-7-13 15:32
0
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
上回一个群里说SetContextThread的工作方式是往目标插入APC。
如果这个成立,那么我的想法是:
当一个进程存在N条线程,且这些线程频繁并且快速的调用同一个API时,利用OD对这个API下断点,那么就会往目标进程插入N个用于设置DRX的APC,而当第一个APC或者第X个小于N的APC完成时,目标进程就已经被API中断下来了,此时还有未完成的APC。这些未完成的APC将由OD恢复(F9)之后继续执行,而OD在F9之前已经清空了硬断列表,认为自己已经没有需要接收的异常了,那么当目标进程继续运行时,未完成的APC将得以继续执行,继续往刚才没有设置DRX的几个线程继续设置API断点。那么将导致目标进程接下来产生的API异常没办法处理。     
当然这种情况的前提条件也是那些导致崩溃的线程一定调用了该API,否则不会产生无法捕获的断点。

(我对APC并不怎么了解,甚至不了解APC是什么东西,所以这里也是凭空想象,希望知道其ANTI原理的大牛们可以指点一二)
2015-7-13 15:38
0
雪    币: 36207
活跃值: (7170)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
一个铁子  一个故事  比听相声实惠。
2015-7-13 15:48
0
雪    币: 6641
活跃值: (4491)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
11
OD 2.01也有这问题.windbg不会有事.
hook一下NtSetContextThread..按windbg的方法设置.
2015-7-13 17:19
0
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
是SetContextThread参数的问题吗
2015-7-13 17:39
0
雪    币: 6641
活跃值: (4491)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
13
明显不是参数问题,x64dbg也能断,运行不崩(提示错误:EXCEPTION_SINGLE_STEP).
2015-7-13 17:51
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
因为线程APC可以插入,才能SET~(OD会先Get,如果Get成功了,才能Set,但是Get不成set也不成)。
Windbg的方式太高大上了~
2015-7-13 17:53
0
雪    币: 101
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
围观。。。
2015-7-13 18:31
0
雪    币: 101
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
硬断之后有个 EXCEPTION_SINGLE_STEP 单步是 x64dbg 的问题...
作者说可能是使用的 TitanEngine 调试引擎有问题
2015-7-24 15:49
0
游客
登录 | 注册 方可回帖
返回
//