本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 7449|回复: 15

win7内核反盗版小猫腻一个 [复制链接]

Rank: 5Rank: 5

发表于 2011-9-8 19:17:13 |显示全部楼层
在KiSystemStartup->KiInitializeKernel->InitBootProcessor->ExInitSystem中



char __stdcall ExInitSystem()

{

char result;

if ( InitializationPhase )

{

if ( InitializationPhase != TRUE )

{

KeBugCheck2(UNEXPECTED_INITIALIZATION_CALL, 3, InitializationPhase, 0, 0, 0);

__asm { int 3 ; Trap to Debugger }

}

result = ExpInitSystemPhase1();  //第一阶段的EX系统初始化

}

else {

sub_798CBB();   //<-----猫腻函数

result = ExpInitSystemPhase0();  //第零阶段的EX系统初始化

}

return result;

}



猫腻函数sub_798CBB在Phase0时执行,功能是计算和序列号、产品类型和授权相关的一些注册表键值数据等相关的字符串的CRC32值,然后和预设的对比

如果有某个不匹配,则置一个全局变量KdDumpEnableOffset的值为8(默认是0)



这个KdDumpEnableOffset的名字属于MS常玩的符号猫腻,实际上跟kernel debug和dump没什么关系



这个值实际上是在ExInitSystem->ExpInitSystemPhase1->ExpMutantInitialization这个函数里使用



这个函数也是一个比较迷惑的名字,和一堆EX系统的对象类型创建混在一起,本来是做Mutant对象类型的创建,但里面混了一行代码:



char __stdcall ExpMutantInitialization()
{
  LSA_UNICODE_STRING DestinationString; // [sp+58h] [bp-8h]@1
  int v2; // [sp+8h] [bp-58h]@1
  signed int v3; // [sp+Ch] [bp-54h]@1
  signed int v4; // [sp+10h] [bp-50h]@1
  int v5; // [sp+14h] [bp-4Ch]@1
  int v6; // [sp+18h] [bp-48h]@1
  int v7; // [sp+1Ch] [bp-44h]@1
  int v8; // [sp+20h] [bp-40h]@1
  int v9; // [sp+2Ch] [bp-34h]@1
  signed int v10; // [sp+34h] [bp-2Ch]@1
  signed int v11; // [sp+24h] [bp-3Ch]@1
  int (__stdcall *v12)(int); // [sp+44h] [bp-1Ch]@1

  RtlInitUnicodeString(&DestinationString, &"Mutant");
  memset(&v2, 0, 0x50u);
  memset((void *)(*(_DWORD *)(*MK_FP(__FS__, 0x124u) + 0x50) + 0x18), 0,KdDumpEnableOffset);
LOWORD(v2) = 80;
  v3 = 2;
  v4 = 256;
  v5 = (_DWORD)ExpMutantMapping;
  v6 = ExpMutantMapping[1];
  v7 = ExpMutantMapping[2];
  v8 = ExpMutantMapping[3];
  v9 = 0;
  v10 = 32;
  v11 = 2031617;
  v12 = ExpDeleteMutant;
  return ObCreateObjectTypeEx(&DestinationString, (int)&v2, 0, (int)&ExMutantObjectType) >= 0;
}



第二个MEMSET这行就是猫腻了,也就是phase0置成了8的话,这里就会把kthread->ApcState->Process->DirectoryTableBase和LdtDescriptor这两个域清0 ,

当前进程(SYSTEM进程)在后面的启动过程中就会出现诡异错误退出了



实际上就是起到防止那些注册表路径被修改的作用



最后附上那个计算的反汇编

INIT:00798CBB 8B FF                                   mov     edi, edi
INIT:00798CBD 55                                      push    ebp
INIT:00798CBE 8B EC                                   mov     ebp, esp
INIT:00798CC0 83 EC 6C                                sub     esp, 6Ch
INIT:00798CC3 68 94 F1 62 00                          push    offset aRegistryMac_15 ; "\\Registry\\Machine\\System\\Setup"
INIT:00798CC8 E8 7C 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798CCD 68 80 F1 62 00                          push    offset aSetuptype ; "SetupType"
INIT:00798CD2 89 45 94                                mov     [ebp+var_6C], eax
INIT:00798CD5 E8 6F 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798CDA 68 64 F1 62 00                          push    offset aSystemprefix ; "SystemPrefix"
INIT:00798CDF 89 45 98                                mov     [ebp+var_68], eax
INIT:00798CE2 E8 62 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798CE7 68 E0 F0 62 00                          push    offset aRegistryMach_2 ; "\\Registry\\Machine\\System\\CurrentControl"...
INIT:00798CEC 89 45 9C                                mov     [ebp+var_64], eax
INIT:00798CEF E8 55 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798CF4 68 C4 F0 62 00                          push    offset aProducttype_0 ; "ProductType"
INIT:00798CF9 89 45 A0                                mov     [ebp+var_60], eax
INIT:00798CFC E8 48 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D01 68 B0 F0 62 00                          push    offset aLanman  ; "Lanman"
INIT:00798D06 89 45 A4                                mov     [ebp+var_5C], eax
INIT:00798D09 E8 3B 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D0E 68 9C F0 62 00                          push    offset aServernt ; "ServerNT"
INIT:00798D13 89 45 A8                                mov     [ebp+var_58], eax
INIT:00798D16 E8 2E 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D1B 68 90 F0 62 00                          push    offset aWinnt   ; "WinNT"
INIT:00798D20 89 45 AC                                mov     [ebp+var_54], eax
INIT:00798D23 E8 21 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D28 68 74 F0 62 00                          push    offset aProductsuite_0 ; "ProductSuite"
INIT:00798D2D 89 45 B0                                mov     [ebp+var_50], eax
INIT:00798D30 E8 14 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D35 68 E8 EF 62 00                          push    offset aRegistryMac_16 ; "\\Registry\\Machine\\System\\CurrentControl"...
INIT:00798D3A 89 45 B4                                mov     [ebp+var_4C], eax
INIT:00798D3D E8 07 01 00 00                          call    ComputerCrc32Forwstring
INIT:00798D42 68 C8 EF 62 00                          push    offset aConcurrentlimi ; "ConcurrentLimit"
INIT:00798D47 89 45 B8                                mov     [ebp+var_48], eax
INIT:00798D4A E8 FA 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D4F 68 A8 EF 62 00                          push    offset aSmallBusiness ; "Small Business"
INIT:00798D54 89 45 BC                                mov     [ebp+var_44], eax
INIT:00798D57 E8 ED 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D5C 68 90 EF 62 00                          push    offset aEnterprise ; "Enterprise"
INIT:00798D61 89 45 C0                                mov     [ebp+var_40], eax
INIT:00798D64 E8 E0 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D69 68 68 EF 62 00                          push    offset aCommunications ; "CommunicationServe"
INIT:00798D6E 89 45 C4                                mov     [ebp+var_3C], eax
INIT:00798D71 E8 D3 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D76 68 50 EF 62 00                          push    offset aBackoffice ; "BackOffice"
INIT:00798D7B 89 45 C8                                mov     [ebp+var_38], eax
INIT:00798D7E E8 C6 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D83 68 18 EF 62 00                          push    offset aSmallBusinessR ; "Small Business(Restricte"
INIT:00798D88 89 45 CC                                mov     [ebp+var_34], eax
INIT:00798D8B E8 B9 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D90 68 F8 EE 62 00                          push    offset aTerminalServe ; "Terminal Serve"
INIT:00798D95 89 45 D0                                mov     [ebp+var_30], eax
INIT:00798D98 E8 AC 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798D9D 68 E0 EE 62 00                          push    offset aEmbeddednt ; "EmbeddedNT"
INIT:00798DA2 89 45 D4                                mov     [ebp+var_2C], eax
INIT:00798DA5 E8 9F 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DAA 68 C8 EE 62 00                          push    offset aDatacenter ; "DataCenter"
INIT:00798DAF 89 45 D8                                mov     [ebp+var_28], eax
INIT:00798DB2 E8 92 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DB7 68 B4 EE 62 00                          push    offset aPersonal ; "Personal"
INIT:00798DBC 89 45 DC                                mov     [ebp+var_24], eax
INIT:00798DBF E8 85 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DC4 68 A8 EE 62 00                          push    offset aBlade   ; "Blade"
INIT:00798DC9 89 45 E0                                mov     [ebp+var_20], eax
INIT:00798DCC E8 78 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DD1 68 7C EE 62 00                          push    offset aEmbeddedRestri ; "Embedded(Restricted)"
INIT:00798DD6 89 45 E4                                mov     [ebp+var_1C], eax
INIT:00798DD9 E8 6B 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DDE 68 54 EE 62 00                          push    offset aSecurityApplia ; "Security Appliance"
INIT:00798DE3 89 45 E8                                mov     [ebp+var_18], eax
INIT:00798DE6 E8 5E 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DEB 68 34 EE 62 00                          push    offset aStorageServer ; "Storage Server"
INIT:00798DF0 89 45 EC                                mov     [ebp+var_14], eax
INIT:00798DF3 E8 51 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798DF8 68 14 EE 62 00                          push    offset asc_62EE14 ; "Compute Server"
INIT:00798DFD 89 45 F0                                mov     [ebp+var_10], eax
INIT:00798E00 E8 44 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798E05 68 00 EE 62 00                          push    offset asc_62EE00 ; "WH Server"
INIT:00798E0A 89 45 F4                                mov     [ebp+var_C], eax
INIT:00798E0D E8 37 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798E12 68 D4 ED 62 00                          push    offset asc_62EDD4 ; "SystemSetupInProgress"
INIT:00798E17 89 45 F8                                mov     [ebp+var_8], eax
INIT:00798E1A E8 2A 00 00 00                          call    ComputerCrc32Forwstring
INIT:00798E1F 89 45 FC                                mov     [ebp+var_4], eax
INIT:00798E22 33 C0                                   xor     eax, eax
INIT:00798E24
INIT:00798E24                         loc_798E24:                             ; CODE XREF: sub_798CBB+185j
INIT:00798E24 8B 4C 05 94                             mov     ecx, [ebp+eax+var_6C]
INIT:00798E28 3B 88 A8 56 7B 00                       cmp     ecx, ds:OrgStringHash[eax]
INIT:00798E2E 74 0A                                   jz      short loc_798E3A
INIT:00798E30 C7 05 34 A7 53 00 08 00+                mov     _KdDumpEnableOffset, 8
INIT:00798E3A
INIT:00798E3A                         loc_798E3A:                             ; CODE XREF: sub_798CBB+173j
INIT:00798E3A 83 C0 04                                add     eax, 4
INIT:00798E3D 83 F8 6C                                cmp     eax, 6Ch
INIT:00798E40 7C E2                                   jl      short loc_798E24
INIT:00798E42 C9                                      leave
INIT:00798E43 C3                                      retn

Rank: 9Rank: 9Rank: 9

发表于 2011-9-8 20:30:17 |显示全部楼层
MJ真强悍。。。越玩越细致了。。。
悟空,退下,为师一个人就够了

Rank: 5Rank: 5

发表于 2011-9-8 21:02:01 |显示全部楼层
实验了一下,发现激活的补丁早就已经patch了看不到了~MJ看的是正版的内核吧~

Rank: 1

发表于 2011-9-8 23:52:09 |显示全部楼层
顶一下,学习啦。。。

Rank: 2

发表于 2011-9-9 00:08:04 |显示全部楼层
ms也这么猥琐.

Rank: 1

发表于 2011-9-9 00:56:45 |显示全部楼层
不猥琐的话没法赚钱啊。

Rank: 1

发表于 2011-9-9 03:24:09 |显示全部楼层
wa~~~~围观

Rank: 1

发表于 2011-9-10 02:17:53 |显示全部楼层
不错,有没有搞个注册机?我要2008 server的

Rank: 3Rank: 3

发表于 2011-9-13 02:12:42 |显示全部楼层
来看猥琐的MS。。。

Rank: 1

发表于 2011-9-13 14:43:17 |显示全部楼层
mj围观

Rank: 1

发表于 2011-10-23 01:00:55 |显示全部楼层
看猥琐的MS。。。

Rank: 1

发表于 2011-10-30 21:22:07 |显示全部楼层
拜读,学习,谢谢!

Rank: 1

发表于 2011-11-8 01:13:37 |显示全部楼层
猥琐的MS。。。

Rank: 1

发表于 2011-11-10 14:17:29 |显示全部楼层
nb的mj萎缩的ms

Rank: 1

发表于 2012-2-22 12:16:34 |显示全部楼层
学习。。。。

Rank: 1

发表于 2012-2-22 17:32:05 |显示全部楼层
膜拜大牛下,您博客好久没更新了
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-7-16 15:04 , Processed in 0.037988 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部