关于Win7 的开机画面 移植到Vista的看法
Vista 启动的时候要验证 文件的版本号如果引导时加载文件版本号不正确就会无法启动
Vista SP1的版本信息是
"6.0.6001.18000 (longhorn_rtm.080118-1840)"
Win7 M1 的版本信息是
"6.1.6519.1 (winmain.071220-1525)"
比如修改WMP界面
原界面
原文件
替换文件
直接替换
修改替换文件
替换后
但开机画面的文件ntkrnlpa.exe和ntoskrnl.exe
如果直接用Win7 M1的替换因为版本号不对所以无法启动,但ExE文件需要数字签名
更改版本号后数字签名失效,启动时提示无法验证数字签名也无法引导
修改前
修改后
电脑在引导的时候.首先mbr里面的代码会加载vista安装盘下面的bootmgr这个文件到内存.然后把执行权交给bootmgr.然后bootmgr会加载system32\winload.exe.然后winload.exe会加载ntoskrnl.exe.
这个加载过程一步一步都有签名判断.
1.mbr加载bootmgr这一步可以不管他.我的系统比较多.我用了grub作为引导程序.而没有使用vista的.
2.bootmgr加载winload.exe.这个地方要求winload.exe是签过名的.
3.winload.exe负责加载ntoskrnl.exe,hal.exe还有全部的boot start的驱动.当然还有这些驱动以及内核需要使用的一些dll.还有一些数据文件.这些文件也都是要求签名的.签名判断是由winload.exe来完成的.
4.ntoskrnl会加载剩下的system start,auto start的这些驱动.以及以后的manual start的驱动,用户层的dll.exe等等.这些文件的签名判断是由ntoskrnl通过一个ci.dll来完成的.ci.dll是ntoskrnl.exe的一个import
bootmgr是一个16位的com程序跟一个32位的pe文件拼接起来的.用个hex编辑工具搜索一下"MZ"也就是dos文件头就能看到一个很明显的标记.把从MZ的地方开始一直到bootmgr的结尾的数据保存下来成一个新文件起名叫bootmgr.dll.用ida打开.ida提示他有调试符号文件.问你要不要加载.你就加载吧..微软很厚道.提供了这个文件的pdb的..哈哈....
16位的那个com不用管他..着重看这个32位的dll吧
BmMain是他的入口函数..这个函数里面一直往下..有个调用BlImgQueryCodeIntegrityBootOptions的调用.根据这个调用的结果来确定是否执行BmFwVerifySelfIntegrity函数.好.把这个地方的代码改成jmp吧.跳过这个BmFwVerifySelfIntegrity函数的调用.
接着到BlImgLoadBootApplication这个函数里面.同样这个地方有个BlImgQueryCodeIntegrityBootOptions函数调用.调用完了就是ImgArchPcatLoadBootApplication.进入这个ArchPcat这个函数可以看到他是通过BlImgLoadPEImageEx函数来加载的.同时能看到签名判断也是这LoadPEimageEx这个函数里面完成的.当BlImgLoadPEImageEx的第6个参数arg6 & 0x10的结果不是0的时候就会进行签名判断.否则跳过这个签名判断.只是判断pe头的checksum.所以如果这调用这个函数的时候不要设置第6个参数的第4位就行了.回到ImgArchPcatLoadBootApplication函数.可以看到他使用进入时候的eax值加上自己的一些判断来生成BlImgLoadPEImageEx第6个参数.再仔细看看就可以发现只是需要清掉BlImgLoadBootApplication调用ImgArchPcatLoadBootApplication之前的eax的第4位就行了.因为ImgArchPcatLoadBootApplication并不去修改这个第4位.所以简单了..清除掉原来设置eax的代码.直接放一个xor eax,eax就行了..
保存一下这个dll,给他checksum一下..然后copy /b + /b一下跟刚刚剥离出来的16位com程序合并起来.命名成bootmgr2.这个bootmgr就算是破解完了.
你要么替换掉原来的bootmgr.要么使用个别的比如grub一类的引导工具试试看.你的系统应该能正常引导起来.接下来破解winload.exe
一样的ida打开winload.exe.加载他的pdb(有了pdb确实省心省力).顺便说一句.从winload开始就支持kernel debug了..你可以用windbg来调试winload了.
winload.exe更简单了.你稍微看看就知道他重用了很多bootmgr的代码.比如是否进行签名判断的地方也是看那第7个参数arg7 & 0x10的值.然后一路track back就能看到如果LoadIntegrityCheckPolicy是0的话.就整个的关掉了winload的签名判断了.所以找到初始化LoadIntegrityCheckPolicy的地方.把他设置层0,这个在OsInitializeCodeIntegrity函数里面.整个函数里面的东西都是不需要的.你直接在函数的开头把LoadIntegrityCheckPolicy设置成0然后ret就行了..
保存这个winload2.exe.checksum一下..
然后用bcdedit添加一个新的{boot loader}.使用这个新的winload2.exe试试看..你的系统应该能引导起来.
到此你的boot start的驱动就能顺利加载了(32位下面当然本来就可以加载).如果你用64位的话.你可以在这里放一个boot start的驱动.然后干掉patch guard.
希望高手能破解下
bootmgr 和winload.exe
附件: 您所在的用户组无法下载或查看附件