首页
论坛
课程
招聘
[原创]腾讯2010竞赛第三阶段题目思路+代码
2010-11-19 17:24 17595

[原创]腾讯2010竞赛第三阶段题目思路+代码

2010-11-19 17:24
17595
竞赛应该以技术交流为目的,我放出这题自己做的答案和思路

这题我感觉,没有完美的答案,就像杀软一样,没有哪个能事先彻底防御最新出来的病毒木马

这题可以用以下几种方式来解决
1,debug方式
2,hook方式
3,虚拟执行的方式
4,以上几种综合

虚拟执行方式太慢了,而且环境虚拟不真实很容易被anti,我首先放弃了
hook方式要避免被检查hook
debug方式,要避免被anti

我的思路是debug方式,利用CPU的Last Branch Record,来记录程序执行的流程,用这个方式,判断出程序跳出自己镜像的地址,通过地址来找出dll的导出函数

流程大致是这样的

加载驱动,创建进程(暂停模式),把进程主线程设置单步,尝试找出进程的主模块地址和模块大小,以及第一个api的地址,然后把它们传给驱动,驱动hook int1,更改DEBUGCTLA MSR,将单步指令改成单步分支,监控程序分支流程。驱动int1捕获单步后,将From和To进行过滤,从程序主模块跳出去的才发给ring3,ring3去判断第一次api还是第二次,如果是第二次,通过api地址,找到dll模块,以及导出函数名,打印出来

优点:
1,用ring0 hook int1的方式来调试,没有使用windows的调试机制,全部自己通信,检测调试模式 无效
2,利用CPU的功能将单步指令改成了单步分支,降低调试部分代码执行次数
3,ring0过滤EIP,减少ring0 ring3通信次数
4,没用调试寄存器,检查dr0 - dr7 无效
5,ring3无任何hook,检查hook 无效
6,没有使用int3或int1断点,api代码检查 无效
6,兼容win2000 - win7(只需要cpu支持即可)

缺点:
1,无法避免单步状态检测
2,多核情况下,int1处理得不好,会出现异常(代码设置了亲和性,避免了这个问题)

[公告]请完善个人简历信息,好工作来找你!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (32)
雪    币: 1718
活跃值: 活跃值 (135)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
小菜鸟一 活跃值 2010-11-19 17:28
2
0
沙发学习123
雪    币: 159
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
SJQIANG 活跃值 2 2010-11-19 17:29
3
0
学习了
雪    币: 272
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Esper 活跃值 2010-11-19 17:37
4
0
CPU的Last Branch Record, 头次听说, 只能膜拜
雪    币: 37
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wead 活跃值 2010-11-19 17:42
5
0
1,无法避免单步状态检测
.................
这题还是押宝啊。。。。幸亏没单步检测。。。。
雪    币: 2076
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
exile 活跃值 1 2010-11-19 17:53
6
0
只能膜拜 无法学习  驱动太强了
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-19 18:16
7
0
楼主押宝太准了,学习了。
1.假设测试程序只调用系统自带dll,并且是标准调用
2.假设测试程序是单线程
3.假设外部F函数和目标函数都是由exe主程序调用
4.假设测试程序不处理单步异常
5.假设测试程序的循环量和Sleep很小
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-19 18:39
8
0
楼主源代码里面有这么一句: by shoooo  ,难道也是马甲
雪    币: 8653
活跃值: 活跃值 (214)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2010-11-19 18:41
9
0
对于楼主的高科技的方法,我等只能膜拜
雪    币: 765
活跃值: 活跃值 (59)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2010-11-19 18:45
10
0
1,非系统的dll一样可以检测,不信,你可以试试,api获取失败,会进入SearchAll的状态,每次都去尝试搜索第一个api的
2,多线程懒得搞了
3,题目说明里面写了, 都是由exe主程序调用的
4,这个机制问题,没法解决
5,再大也可以处理,除非程序本身运行就会超时

我只赌了2点,1,单线程,2,不检查单步

多线程可以解决的,只是懒得弄了,我觉得,测试用例有多线程会更复杂,时间误差更大(线程切换是需要时间的)
单步无法解决,所以不解决了
雪    币: 643
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
StudyRush 活跃值 3 2010-11-19 18:53
11
0
学习为主要目的。
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-19 19:15
12
0
1.
我的测试程序是这样的:(tmp.dll  和 dll.dll 是同一个文件的2个复制)
               
        LoadLibrary("tmp.dll");
        HMODULE hmod = LoadLibrary("dll.dll");
        f1 = GetProcAddress(hmod, "f1");
        f2 = GetProcAddress(hmod, "f2");

        f1();
        f2();
因为dll重定位的问题,所以程序没法检测

2.题目原话是“任意给定一个可执行程序A.exe,已知A.exe运行时会调用某外部函数F”,是说A.EXE进程在运行期间会调用到外部函数,其实并没有说明是由EXE模块来调用F函数,可能是任意一个模块或内存区域调用F函数

3.如果遇到了大规模的循环,动态运行等待目标函数的执行显然不行了

如果再赌上5个测试程序未加壳,那用静态检测就是最好的方法了。
雪    币: 8653
活跃值: 活跃值 (214)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2010-11-19 19:48
13
0
如果代码量不多,一个反汇编引擎就差不多了吧~
雪    币: 100
活跃值: 活跃值 (18)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 活跃值 24 2010-11-19 20:15
14
0
摸顶一下    ~
雪    币: 765
活跃值: 活跃值 (59)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2010-11-19 20:24
15
0
1,2 算我题目理解错了吧
1,我理解成测试程序只有一个bin,所以两个文件,要释放tmp.dll dll.dll,这样,我的程序是无法事先获取f1的地址,没有这个api地址,走的是SearchAll流程

3,你写一个试一试呢?
雪    币: 525
活跃值: 活跃值 (37)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
Mx¢Xgt 活跃值 7 2010-11-19 20:31
16
0
我的比较简单,就是对系统领域的所有可执行段下断,第一次执行在系统领域就说明被调用了API
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-19 20:48
17
0
不需要释放dll的。
CopyFile("c:\\windows\\system32\\kernel32.dll", "c:\\tmp.dll", 0);
这样的话事先取得的f1地址是不正确的,所以无法输出正确的结果。f1和f2函数其实应该在模块加载的时候动态取得,但是那5个测试程序都是简单的不能再简单的程序了,所以这些情况都不用考虑,考虑的人反而倒霉。
雪    币: 765
活跃值: 活跃值 (59)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2010-11-19 20:51
18
0
你的f1是kernel32.dll里面的还是tmp.dll里面的?
如果是tmp.dll里面我是获取不到的
如果是kernel32.dll,你先把kernel32.dll卸载掉,然后在load进来?
雪    币: 765
活跃值: 活跃值 (59)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2010-11-19 20:58
19
0
1,大家都知道这个是赌博题,大家的答案都不是完美的,只是缺陷不一样而已
2,代码发出来是以技术交流为目的的,难道大家喜欢某数字公司的竞赛,src也归主办方所有?
3,如果觉得代码有用,就学习一下,如果觉得没用,shift+del删除即可
4,如果觉得自己的答案也很不错,可以发出来,让大家学习一下
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-19 21:19
20
0
我是在纳闷为什么这么好的题目配以这么烂的测试程序,题目写的神乎其神,让人有无数的想像空间,而5个测试程序却全是单一简单的程序,其中前2个程序的运行时间居然只有荒唐的10-20ms,导致产生巨大的误差。出题者到底是在考察参赛者的什么能力呢?
我个人认为这道题目的真正难点应该是考察2进制代码检测能力,即当循环时间巨大的时候,应该能够正确控制程序,分析循环内外的代码,结束循环,输出正确的结果。
例如下面的循环:
Beep();
for(__int64 i=0; i<0x1111111111111111; i++)
{
        d=c+i+b+c*234;
        e=d/4323434;
        f=e*2434232;   
}
GetTickCount();
如果不小心运行到了里面,应该及时跳出来。更复杂的情况是循环的结果影响目标函数,那就需要分析代码的功能了

Beep();
for(__int64 i=0; i<0x1111111111111111; i++)
{
        d=c+i+b+c*234;
        e=d/4323434;
        f=e*2434232;   
}
if(f%2)
GetTickCount();
else
GetCurrentProcessId();
雪    币: 765
活跃值: 活跃值 (59)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 17 2010-11-19 21:27
21
0
我的想象力比较丰富,我把这段代码想象成被VM掉了
雪    币: 1073
活跃值: 活跃值 (82)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
zhujian 活跃值 2 2010-11-20 13:41
22
0
只能膜拜,无法学习。
雪    币: 33
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PEBOSS 活跃值 2010-11-20 15:38
23
0
膜拜啊,都是些没听说过的技术
雪    币: 1066
活跃值: 活跃值 (27)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
zhuliang 活跃值 5 2010-11-20 21:55
24
0
呵呵。不是的出题的人的水平有你和海风那么高的,或者不是出题人愿意投入的精力有你和海风那么多的。
雪    币: 284
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrynpc 活跃值 2010-11-21 08:00
25
0
ReadMSR(MSR_DEBUGCTLA, &DbgCtlA);
                DbgCtlA.Lo &= ~3;
                WriteMSR(MSR_DEBUGCTLA, &DbgCtlA);
intel cpu才能用吧? ╮(╯▽╰)╭
雪    币: 8066
活跃值: 活跃值 (143)
能力值: ( LV15,RANK:1844 )
在线值:
发帖
回帖
粉丝
ccfer 活跃值 15 2010-11-21 10:07
26
0
我的是intel cpu,结果蓝屏
雪    币: 1075
活跃值: 活跃值 (15)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
accessd 活跃值 2 2010-11-21 10:28
27
0
虚拟机下不能用
雪    币: 1681
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
itf 活跃值 2010-11-22 01:41
28
0
楼主很厉害了 要先想想了
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
凌晨五点 活跃值 2010-11-22 07:27
29
0
几年后来回再看雪,发现真的不一样了。
雪    币: 1912
活跃值: 活跃值 (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
boyving 活跃值 2010-11-22 08:05
30
0
学习来了。好东西
雪    币: 3433
活跃值: 活跃值 (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
djxh 活跃值 2010-11-23 11:39
31
0
下代码,膜拜+学习
雪    币: 175
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
imbadyc 活跃值 2010-11-23 19:08
32
0
只能膜拜,不能学习
雪    币: 63
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cfo 活跃值 2010-11-24 00:18
33
0
我是来学习的。
游客
登录 | 注册 方可回帖
返回