bootloader_v2 [译文]

来源:互联网 发布:取得软件著作权 编辑:程序博客网 时间:2024/05/17 06:10

/*
Fyyre
http://fyyre.l2-fashion.de/
http://twitter.com/Fyyre/
*/

修改日志:
// zzz …
// Win 8 RC0: // 06/09/2012,小更新
// Windows 10 // 08/18/2015,小更新
// 该文件是一个混乱的笔记,抱歉!

本文档的目的是:
为读者提供一个 “内核补丁保护”(PG) 在 Windows 7,8,10 环境下的总体概貌。

Windows 8:
在 INIT 部分(section),RC0它似乎一直以来就没有什么改变。
这意味着我们仍然可以使用字节的签名:

/*
8B FA FA 33 C0, which next instruction is mov edi, edx near start of PgInitialize inside ntoskrnl INIT section.
*/
这一句不是很好翻译,于是意译了

    译者附注:    8BFA          mov     edi,edx    FA            cli    33C0          xor     eax,eax

在 ntoskrnl 的 INIT 区段(section) 里面的 PgInitialize 函数 的开始部分的附近能找到特征码,
8B FA FA 33 C0,它的起始指令是 mov edi,edx。

从这个函数 (agan yields function,不知道怎么译) 开始位置减去 0x2B,就能得到需要我们覆写的地址,使用 mov al, 1 覆盖掉 mov rax, rsp。

    译者附注:    B0 01         mov     al,1    ------------------------------    89E0          mov     eax,esp   < mov rax,rsp>

Windows 10:

48 8B C4 4C 89 48 20 44 89 40 18 89 50 10 89 48
// ntoskrnl.exe 10.0.10240.16430 x64

– PgInitialize signature, only some slight changes! (不太好译)

– PgInitialize 签名(特征码),只有一些轻微的变化!
可以假设 我的 “3字节补丁” 一直安全且仍然工作稳定。
SepInitializeCodeIntegrity(代码完整性效验) 看来是依旧存在,并没有什么新的发现。
// 最后更新于 08/2015


INIT:00000001406C5A04 PgInitialize

8B FA FA 33 C0 // 二进制签名(特征码标识)
特征码的开始地址 - 0x2B == PgInitialize 函数开始地址
替换为 0xb0 0x01 0xc3 (如果需要的话 加上一些 nop).

笔者说他并没有验证这些,只是通过观察得出的结论。

INIT:00000001406744C0INIT:00000001406744C0 ; <"PREFETCHWLIST", "\ObjectTypes\">INIT:00000001406744C0INIT:00000001406744C0 KiInitializePatchGuard proc near        ; CODE XREF: KiFilterFiberContext+1E2INIT:00000001406744C0                                         ; KiFilterFiberContext+29E 

其他的特征码:
“\x48\x8B\xC4\x44\x89\x48\x20\x44\x89\x40\x18\x89\x50\x10\x89\x48”
或者
“\x48\x81\xEC\xD0\x17\x00\x00” - 0x1C
我们同样可以找到 .
位于内核的 INIT 区段的 PG 初始化函数的起始地址。

浅显的看,我们可以看出这个在细节的实现上比 Win7的方式要好一些,留以备用。
去禁用它,我们可以通过覆盖起始字节“\ xB0 \ x01 \ xC3” 让它只返回true。

继续,我没有完全修复 SeInitializeCodeIntegrity(EP_X0FF did, see his dsefix at kernelmode.info 简译为:看看 EP_X0FF 他是如何实现的
我并没有改变SeValidateImageHeader…
搜索 “\x74\x27\x48\x8B\x84\x24\x80\x00” ,将 0x74 改为 0x84。
同样的,我们修复这个函数返回。

mov eax, 0C0000428h <<-- I replace 0x28 0x04 with 0x00 0x00

– mov eax, STATUS_SUCCESS; // 替换 0x28 0x04 为 0x00 0x00

保存修改。当然还需要 修复 ntoskrnl.exe 文件的 效验和信息(checksum),并且重命名它。

接下来就轮到 winload.exe
ImgpValidateImageHash……使用调试符号找到他,并改变函数开头使其直接返回STATUS_SUCCESS - - > > 0x33 0xC0 0xC3
同样,保存文件和更新PE文件校验和。

自己 重命名winload.exe - - > > osloader.exe和ntoskrnl.exe - - > > ntkrnlmp.exe

接着使用批处理来 创建添加 bcd entry(不好翻译这个)

    ECHO.    ECHO Creating BCD Entry...    ECHO.    set ENTRY_GUID={46595952-454E-4F50-4747-554944FEEEEE}    bcdedit -create %ENTRY_GUID% -d "PatchGuard Disabled" -application OSLOADER    bcdedit -set %ENTRY_GUID% device partition=%SYSTEMDRIVE%    bcdedit -set %ENTRY_GUID% osdevice partition=%SYSTEMDRIVE%    bcdedit -set %ENTRY_GUID% systemroot \Windows    bcdedit -set %ENTRY_GUID% path \Windows\system32\osloader.exe    bcdedit -set %ENTRY_GUID% kernel ntkrnlmp.exe    bcdedit -set %ENTRY_GUID% recoveryenabled 0 ; optional, i just dislike the recovery ...    bcdedit -set %ENTRY_GUID% nx OptIn    bcdedit -set %ENTRY_GUID% nointegritychecks 1    bcdedit -set %ENTRY_GUID% inherit {bootloadersettings}    bcdedit -set %ENTRY_GUID% testsigning 1    bcdedit -displayorder %ENTRY_GUID% -addlast    bcdedit -timeout 10    ECHO.    ECHO Setting PEAUTH service to manual... (avoid BSOD at login screen)    ECHO.    sc config peauth start= demand    ECHO.    ECHO Step One Complete!

——现在,有一些注册表设置可能是需要修改的…

    \Registry\MACHINE\System\CurrentControlSet\Control\CI

AllowTestCode REG_DWORD <<– 0 or 1
IntegrityLevelPolicy REG_DWORD <<– 不确定 :) <<– 这个卖萌的笑脸是笔者的与我无关 :)

Driver requires test signing, atm – but PG is now gone (again).

驱动依旧需要签名 和 atm(啥?) – 但是 PG 已经滚蛋了~~~

If you receive BSOD (often after Windows Update) .. simply start
system not selecting “Disable PatchGuard” from boot loader menu…
Have fun =)

如果你收到了蓝脸(BSOD) (通常在 Wiondos 更新之后)… 在系统引导时选择 不禁止 “PatchGurad” 一般是可以解决这个问题的
祝你好运

-Fyyre


由于译者暂时未学习 x64 内核知识,如果有翻译错误,还请多多谅解,如有不妥之处,请批评指正。

0 0
原创粉丝点击