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

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

2015-7-13 10:20
7932
记得这个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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是用户 2015-7-13 10:26
2
0
http://bbs.pediy.com/showthread.php?p=1321599
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Dormi 2015-7-13 10:30
3
0
谢谢,这个帖子去年已经看过了,但是实际调试中,发现OD清理断点后,清理断点SetContextThread的调用次数与线程的数量不一致。。似乎是少设置了几个线程,不太像是SetContextThread失败了。
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
我是谁! 2015-7-13 10:51
4
0
anti_od,个人觉得还是利用父进程判断是否是explore.exe。。!拙见
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是用户 2015-7-13 10:51
5
0
看了下原贴,要触发这个bug要多线程访问同一地址,在该地址上设置硬断后,清除硬断,在某些情况下SetContextThread清除硬断有可能会失败,而od没有检查结果,直接认为硬断清除成功,导致硬断清除失败的那个线程里依旧会触发这个断点,而此时系统和od都不处理这个断点,导致异常,按照你描述的,SetContextThread的调用次数与线程的数量不一致,所以有些未调用SetContextThread的线程硬断依旧存在。
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是用户 2015-7-13 10:52
6
0
你把od的进程名改成explorer.exe呢
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
我是谁! 2015-7-13 10:57
7
0
对的 哦。。。那就利用系统特性进行反调试吧
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xiaohouhui 1 2015-7-13 15:32
8
0
好东西,下载下来研究下。
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Dormi 2015-7-13 15:38
9
0
上回一个群里说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原理的大牛们可以指点一二)
雪    币: 32497
活跃值: (7105)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ninebell 2015-7-13 15:48
10
0
一个铁子  一个故事  比听相声实惠。
雪    币: 5972
活跃值: (3770)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
yimingqpa 1 2015-7-13 17:19
11
0
OD 2.01也有这问题.windbg不会有事.
hook一下NtSetContextThread..按windbg的方法设置.
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Dormi 2015-7-13 17:39
12
0
是SetContextThread参数的问题吗
雪    币: 5972
活跃值: (3770)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
yimingqpa 1 2015-7-13 17:51
13
0
明显不是参数问题,x64dbg也能断,运行不崩(提示错误:EXCEPTION_SINGLE_STEP).
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2015-7-13 17:53
14
0
因为线程APC可以插入,才能SET~(OD会先Get,如果Get成功了,才能Set,但是Get不成set也不成)。
Windbg的方式太高大上了~
雪    币: 101
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
h辉 2015-7-13 18:31
15
0
围观。。。
雪    币: 101
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
h辉 2015-7-24 15:49
16
0
硬断之后有个 EXCEPTION_SINGLE_STEP 单步是 x64dbg 的问题...
作者说可能是使用的 TitanEngine 调试引擎有问题
游客
登录 | 注册 方可回帖
返回