能力值:
(RANK:1130 )
2 楼
文件太多,我只看最后的成品
sys加载直接蓝屏
exe通过
dll用到了40xxxx的未重定位的数据,不通过
40分
能力值:
( LV2,RANK:10 )
3 楼
我在虚拟机和物理机器上都成功了,是不是加载错文件了?
成品是final目录里面的成品.exe啊
能力值:
( LV2,RANK:10 )
4 楼
可能是我文件太多了,评委老师注意到哪个是成品吧.我直接传单独的成品吧.
上传的附件:
能力值:
( LV2,RANK:10 )
5 楼
003C071D . 8D0D 05104000 lea ecx, dword ptr [401005]
003C0723 . 8D1D C0114000 lea ebx, dword ptr [4011C0]
003C0729 . 2BD9 sub ebx, ecx
003C072B . 03D8 add ebx, eax
003C072D . 53 push ebx
003C072E . 8D1D 94104000 lea ebx, dword ptr [401094]
您说的40XXXX的数据不是用,您注意看,两个LEA后面是一个SUB,是用来算偏移量的,加上上面CALL获得的真实地址用于重定位字符串的.如果说DLL中这么引用是有问题的,那么我在EXE中也这么用了,是不是也有问题?我不太会用MASM直接写汇编源代码,所以只有用这种笨办法了.请评委老师再看看啊!
能力值:
(RANK:1130 )
6 楼
dll我看错了,算通过
sys虚拟机下蓝屏了,xp sp3
蓝屏在
000104C1 . F3:A6 repe cmps byte ptr es:[edi], byte ptr [esi]
访问异常
70分
能力值:
( LV2,RANK:10 )
7 楼
谢谢评委!
驱动我也不知道怎么回事,我的就正常.
也许是我们的考虑不全吧.
我的是XP SP3,物理机器是CPU T2080双核的.
物理和虚拟机(虚拟单核CPU一个)都没蓝.都是正常显示一句
"Hi! I am xsjs, now you are running my program as a driver"
能力值:
( LV12,RANK:420 )
8 楼
while(addr>0x7fffffff){
char *MZ=(char *)addr;
if(MZ[0]=='M'&&MZ[1]=='Z'){
//DbgPrint("ntoskrnl.exe or ntkrnlpa.exe is based at %x",addr);
break;
}
addr=addr-0x1000;
}
这个算法碰到无效页就会蓝屏
搜索函数算法貌似也有问题~
能力值:
( LV2,RANK:10 )
9 楼
是这样的,因为addr起始处为int 2eh对应的地址,从这里到ntoskrnl.exe的空间都是已经分配的,都属于ntoskrnl.exe.
如果出现页被置换出内存的话,我是这样考虑的:
当属于ntoskrnl.exe的某个页被置换出内存,而又需要执行这个页上的代码时,实际情况是不可能蓝屏的.也就是说此时产生缺页中断,中断例程会将页读入内存.
基于这样的考虑,我觉得在访问属于ntoskrnl.exe的空间时都不会出现蓝屏,因为这些内存都是分配过的,要么在物理内存中,要么在硬盘上.
我的实际测试过程也没有出现错误.
能力值:
( LV2,RANK:10 )
10 楼
如果一定要判断,除了IsMmvalable()我不知道其他的函数.但是我不能在PE文件头中引入这个函数,因为如果引入,就会导致程序作为exe执行时初始化失败.
能力值:
( LV12,RANK:420 )
11 楼
是这样的,因为addr起始处为int 2eh对应的地址,从这里到ntoskrnl.exe的空间都是已经分配的,都属于ntoskrnl.exe.
如果出现页被置换出内存的话,我是这样考虑的:
当属于ntoskrnl.exe的某个页被置换出内存,而又需要执行这个页上的代码时,实际情况是不可能蓝屏的.也就是说此时产生缺页中断,中断例程会将页读入内存.
基于这样的考虑,我觉得在访问属于ntoskrnl.exe的空间时都不会出现蓝屏,因为这些内存都是分配过的,要么在物理内存中,要么在硬盘上.
我的实际测试过程也没有出现错误.
====
某些版本的ntoskrnl体内会有多块无效内存,例如某些PAE版本的ntkrnlpa.exe
能力值:
(RANK:1130 )
12 楼
这个题目不需要内存搜'MZ'的
能力值:
( LV2,RANK:10 )
13 楼
确实不知道会有这样的ntkrnlpa.exe,我也只是知道分舵处理机和单处理机的........谢谢Q评委!又学到一点!呵呵!
我搜索MZ是找ntoskrnl.exe的文件头,然后定位DbgPrint().
不知道其他选手怎么做的,在我的机器上,对应用程序引入ntorkrnl.exe就会初始化失败,具体是在加载hal.dll的时候,因为其DllMain()访问了"不该在ring3下访问的"数据.如果不引入ntorkrnl.exe,我就得手动定位ntoskrnl.exe并查找其中函数.
我是这么想的.无论如何,驱动我写得不多,了解得也不多,驱动挂了就挂了吧.全当是学习吧.
这次比赛确实是让我逼着自己学了很多东西,以前从来不直接用MASM写代码,这次写了;以前从没手动用代码处理过PE文件头,这次做了;以前很少关心ring0下的一些实现细节,这次也逼着自己去学了......
但是这样的比赛不要太多了,做这个比赛可落了好多课程!......
whatever,这样的比赛很吸引人!
能力值:
( LV2,RANK:10 )
14 楼
懂为什么不用搜索ntoskrnl.exe的加载基址了,今天发现ntdll.dll里面导出了DbgPrint();也就是说可以用int 2eh来调用DbgPrint ()的