首页
社区
课程
招聘
[原创]利用OD逻辑进行反调试
发表于: 2014-10-6 03:10 20797

[原创]利用OD逻辑进行反调试

2014-10-6 03:10
20797

这几天忽然发现在部分进程的GetMessageA下硬件断点,然后删除断点后再执行,进程抛出STATUS_SINGLE_STEP错误.然后仔细研究下发现这涉及一个OD逻辑问题,可以做为攻击点.

首先是代码

VOID WINAPI CheckThread(LPVOID lp)
{
	while (TRUE){
		Sleep(3 * 1000);
		DWORD dwPorcet;
		VirtualProtect((PVOID)0x401000, 5, PAGE_EXECUTE_READWRITE, &dwPorcet);
		DWORD dwAdder = *(DWORD*)0x401000;  ///保护这个地址
		PostMessageA(NULL, NULL, NULL, NULL);     ///保护这个函数执行过程
	}
}

HANDLE  hThread[25];
int _tmain(int argc, _TCHAR* argv[])
{
	for (int i = 0; i < 25; i++)
	{
		Sleep(10);
		hThread[i] = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)CheckThread, NULL, NULL, NULL);

	}
	system("pause");
	return 0;
}



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (31)
雪    币: 1088
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
明天就会有DLL出现修补了:)
2014-10-6 03:41
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
这个和攻击点有什么关系?lz可以细说一下吗。不是很懂。。
2014-10-6 06:52
0
雪    币: 8188
活跃值: (2686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,od不怎么会用。
2014-10-6 08:05
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5

这是要逼大家转 x64_DBG的节奏,

来来来,看看这个 http://x64dbg.com/#credits
2014-10-6 08:54
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
说实在的 我遇到过好多次这种情况  常见函数sendmessage  postmessage  其实没有什么怕的 先用ida看一下函数 如果无关精要的  加在函数下面下一个断点  就ok 接着分析
感觉od对MFC界面消息方面处理 貌似有点问题
2014-10-6 09:22
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
硬件断点没有删除成功,又是多线程调用访问,这下OD被坑了
2014-10-6 11:46
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
不只消息方面任何函数地址都可以这么搞,只要是会被执行到的地方下硬断都会造成这个问题,地址函数,只要需要都可以用这个逻辑问题来坑OD
2014-10-6 13:48
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
这个估计要在MFC中触发,我用控制台测试了一下,貌似不存在这个问题,建议弄个demo上去吧
2014-10-6 20:23
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
已经增加了 可以试下!控制台依然有效哦!而且也是一样崩溃...
2014-10-7 00:54
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
xp 我测试了 在main函数里面下线程的硬件断点断不下来,在线程里下F2断点,进入线程函数里面,再下硬件断点 貌似没有任何问题
建议你在xp下看看,要不我弄个视频?肯能是操作不当,程序不崩溃
由于是xp 所以我重新编译了一个 TestEnc.rar
上传的附件:
2014-10-7 07:35
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=elianmeng;1321792]xp 我测试了 在main函数里面下线程的硬件断点断不下来,在线程里下F2断点,进入线程函数里面,再下硬件断点 貌似没有任何问题
建议你在xp下看看,要不我弄个视频?肯能是操作不当,程序不崩溃
由于是xp 所以我重新编译了一个 TestEnc.rar[/QUOTE]

是保护地址跟函数  也就是地址0x401000 跟函数PostMessageA  你在这两地方下硬件断点.然后断下后 去掉硬件断点. 然后再运行.XP下会持续断下,然后最终进程崩溃!
2014-10-7 15:55
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
弄了一个视频,我测试没有任何崩溃
录像3.part1.rar
录像3.part2.rar
上传的附件:
2014-10-7 21:07
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=elianmeng;1321961]弄了一个视频,我测试没有任何崩溃
录像3.part1.rar
录像3.part2.rar[/QUOTE]
硬件读断点

执行断点
上传的附件:
2014-10-7 22:07
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
按照你这样 我还是测试过一次 貌似也不好使
还有我仔细测试了  
在user32dll内存里面 会退出
如果让PostMessageA函数返回主内存没有任何问题

总结:在多线程切换的时候和当前的环境相关而已
2014-10-8 08:37
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
反回以后你可有取消断点继续让进程运行?????如果代码段是被VM了,你怎么反回呢?这只是一个简单的模型,而且跟环境无关系,OD逻辑问题导致的调试寄存器没有重置!!!!!!!
2014-10-8 13:22
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
那个CheckThread 只是为了删除硬件断点后, 断点位置仍然执行。那其实一个线程就可以了吧?
2014-10-9 10:29
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
大致原因是OD在删除硬件断点的时候并没检测是否设置成功.导致OD已经确定删除断点,断点位置OD已经不再处理,但是线程的调试寄存器依然有效,结果存在无人管理的调试寄存器,最后触发STATUS_SINGLE_STEP异常时OD不进行处理而把异常抛给系统,系统又抛给程序,程序拒绝处理,最后导致进程崩溃!

为什么删除硬件断点后,线程的调试寄存器仍然有效,是什么原因造成的呢?
2014-10-9 10:32
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
调试了下,只要超过两个线程,就会挂掉。 删除硬件断点,只对单线程有效?
2014-10-9 11:15
0
雪    币: 246
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不错,不错,谢谢!
2014-10-9 11:46
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
不是说OD删除硬件断点对单线程有效果,而是OD逻辑只是调用下设置线程上下文的函数,并没检测设置是否成功!有存在失败的可能.
2014-10-9 12:15
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
这个失败的可能性是?
2014-10-9 14:06
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
xp下测试你的附件程序, CC 和硬断  GetMessageA均无任何异常
2014-10-9 14:22
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
24
对照我的下断点 按照正常的调试过程 下断后,执行等待断下后删除硬断.然后继续执行!即可知道结果...
我在笔记本XP下测试依然有效果的.
2014-10-9 14:24
0
雪    币: 81
活跃值: (100)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
我记得硬件断点是线程相关的吧?
2014-10-10 13:44
0
游客
登录 | 注册 方可回帖
返回
//