-
-
[答题]4_曾定国_
-
发表于:
2008-11-20 14:14
1365
-
第四题
该程序用ddk 编译,步骤如下:
1、编译后在入口点的代码 前加了 5个字节的 call zdgMain ,并将入口点减去5个字节,
2、 将option head 里的 DataDirectory[1](导入表) 的内容 保存到 DataDirectory[13](方便以后使用),再清零(防止在ring3下,windows 加载 ntoskrnl.exe)。
3、所有的 section 改为都可写 ,(省麻烦)
4、计算并写入新的校验码
代码结构如下 :
NTSTATUS DriverEntry(.....)
{
DbgPrintf("hello,world!");
}
__declspec(naked) zdgMain()
{
根据 fs 的内容判断 处在 ring0 还是 ring3
if(ring0)
{
找出 ntoskrnl.exe 的基地址
然后根据 基地址 和 DataDirectory[13] 里的内容,将 IAT 填好,
__asm ret //将跳转到 原来的入口点
}
else
{
__asm pop eax
__asm jmp Main
}
}
int Main()
{//不能包含需要重定向的代码 (不想写太多汇编,最后在 i386mk.inc里 把编译器选项 /GS 去掉)
找出 kernel32 的基地址,
找出 LoadLibrary, GetModuleHandle, MessageBox ,地址
根据 GetModuleHandle(NULL) 是否等于 自身的加载地址就可以判断出是被双击加载,还是被 LoadLibrary
最后 MessageBox 就可以了
}
附件中 MadeByZDG.exe 与 MadeByZDG.dll 完全一致,与 MadeByZDG.sys 仅 subsystem 不同
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课