首页
社区
课程
招聘
[答题]4_曾定国_
发表于: 2008-11-20 14:14 1365

[答题]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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
100分=====
2008-11-21 13:41
0
游客
登录 | 注册 方可回帖
返回