关于作者

姓名:

性别:男

出生日期:--

地区:

联系电话:

QQ:270082018婚否:保密
用户名:janxin
笔名:janxin
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



最新评论

访问统计:
文章个数:9
评论个数:1
留言条数:3




Powered by BlogDriver 2.1

janxin的博客

 

欢迎访问janxin的博客

文章

终于实现技术博客与个人博客的分离了  (作者置顶)
摘要:技术博客 个人博客 查看全文

- 作者: janxin 2006年09月21日, 星期四 21:14  回复(0) |  引用(0) 加入博采

janxin的个人简介  (作者置顶)

      janxin,男,汉族,未婚,学生兼自由撰稿人。出生于墨子故里,是一个上课想睡觉的奇怪男生。与几个志同道合的朋友创建了网络安全/逆向工程/病毒研究小组[Crackidz Group],先后加入[OCN][CZG][BCG],现在是[Crackidz Group],[BCG]挂名成员。擅长软件加密解密,对系统漏洞分析小有研究.

       终于在经历了高考的洗礼之后进入了大学的校门。虽然成绩并不理想,但是我希望可以通过努力可以实现自己最终的梦想。

- 作者: janxin 2005年12月24日, 星期六 11:22  回复(0) |  引用(0) 加入博采

Xp SP2 保护
文章提交:funnywei (funnywei_at_163.com)
作者:funnywei & jerry
引用自:http://www.xfocus.net/articles/200412/762.html
我们知道在我们对溢出漏洞进行exp的时候,经常要利用全局性的指针,利用异常处理。那么XP的sp2对此作了处理。使得我们无法运用以前的技巧来完成我们的工作。例如,对全局性的指针都作了编码处理。
那么具体来讲,本文主要谈到以下
1、映射给PEB管理结构的起始地址做了随机处理。后面我们会看到这种随机是很弱的,但已经足够让exp无法完成或者说是稳定的工作。
2、对TOP SEH的保护
3、VEH链表指针_RtlpCalloutEntryList的保护
4、堆块结构的cookie保护
不涉及内容:
1、如何绕过保护机制
2、堆管理的细节,其实没有太大的变化
主题开始:
1、PEB的地址的随机
xp系统下,创建进程使用的是_NtCreateProcessEx函数,而不是_NtCreateProcess函数。_NtCreateProcessEx主要调用_PspCreateProcess@36函数来完成进程的创建工作
PAGE:004B4649                 call    _PspCreateProcess@36 ; PspCreateProcess(x,x,x,x,x,x,x,x,x)
进程的创建主要包括设置EPROCESS,创建初始进程地址空间等。这里就不罗嗦了。PEB的设置通过调用_MmCreatePeb.

PAGE:004B428E                 push    eax
PAGE:004B428F                 push    ebx
PAGE:004B4290                 push    dword ptr [ebp-60h]
PAGE:004B4293                 call    _MmCreateProcessAddressSpace@12 ; MmCreateProcessAddressSpace(x,x,x)

PAGE:004B43E5                 lea     eax, [ebx+1B0h]
PAGE:004B43EB                 push    eax
PAGE:004B43EC                 lea     eax, [ebp-40h]
PAGE:004B43EF                 push    eax
PAGE:004B43F0                 push    ebx
PAGE:004B43F1                 call    _MmCreatePeb@12 ; MmCreatePeb(x,x,x)
而MmCreatePeb又主要通过调用_MiCreatePebOrTeb
PAGE:004B4A61 ; __stdcall MmCreatePeb(x,x,x)
PAGE:004B4A61 _MmCreatePeb@12 proc near               ; CODE XREF: PspCreateProcess(x,x,x,x,x,x,x,x,x)+303p
PAGE:004B4A61
PAGE:004B4A61 ; FUNCTION CHUNK AT PAGE:005267FF SIZE 000000DC BYTES
PAGE:004B4A61
PAGE:004B4A61                 push    3Ch
PAGE:004B4A63                 push    offset dword_42DAA8
PAGE:004B4A68                 call    __SEH_prolog
PAGE:004B4A6D                 xor     ebx, ebx
PAGE:004B4A6F                 mov     [ebp-20h], ebx
PAGE:004B4A72                 mov     [ebp-4Ch], ebx
PAGE:004B4A75                 mov     [ebp-48h], ebx
PAGE:004B4A78                 mov     [ebp-2Ch], ebx
PAGE:004B4A7B                 mov     esi, [ebp+8]
PAGE:004B4A7E                 push    esi
PAGE:004B4A7F                 call    _KeAttachProcess@4 ; KeAttachProcess(x)
PAGE:004B4A84                 push    2
PAGE:004B4A86                 pop     edi
PAGE:004B4A87                 push    edi
PAGE:004B4A88                 push    (offset loc_4FFFFE+2)
PAGE:004B4A8D                 push    1
PAGE:004B4A8F                 lea     eax, [ebp-2Ch]
PAGE:004B4A92                 push    eax
PAGE:004B4A93                 lea     eax, [ebp-4Ch]
PAGE:004B4A96                 push    eax
PAGE:004B4A97                 push    ebx
PAGE:004B4A98                 push    ebx
PAGE:004B4A99                 lea     eax, [ebp-20h]
PAGE:004B4A9C                 push    eax
PAGE:004B4A9D                 push    esi
PAGE:004B4A9E                 push    ds:_InitNlsSectionPointer
PAGE:004B4AA4                 call    _MmMapViewOfSection@40 ; MmMapViewOfSection(x,x,x,x,x,x,x,x,x,x)
PAGE:004B4AA9                 mov     [ebp-24h], eax
PAGE:004B4AAC                 cmp     eax, ebx
PAGE:004B4AAE                 jl      loc_5267FF
PAGE:004B4AB4                 lea     eax, [ebp-1Ch]
注意下面这个210参数,类似一个Flag。在后面你会发现,如果该参数不等于210,那么映射的PEB地址将不会产生随机值,而是会跟以前的一样,始终在7FFDF000位置。
PAGE:004B4AB7                 push    eax
PAGE:004B4AB8                 push    210h
;注意这个参数!
PAGE:004B4ABD                 push    esi
PAGE:004B4ABE                 call    _MiCreatePebOrTeb@12 ; MiCreatePebOrTeb(x,x,x)
真正完成工作
_MiCreatePebOrTeb@12 函数
PAGE:004B01AE                 call    _ExAllocatePoolWithTag@12 ; ExAllocatePoolWithTag(x,x,x)
PAGE:004B01B3                 mov     esi, eax
PAGE:004B01B5                 test    esi, esi
PAGE:004B01B7                 jz      loc_52678E
PAGE:004B01BD                 mov     eax, [ebp+arg_8]
PAGE:004B01C0                 mov     ecx, [ebp+arg_8]
PAGE:004B01C3                 and     eax, 0FFFh
PAGE:004B01C8                 neg     eax
PAGE:004B01CA                 sbb     eax, eax
PAGE:004B01CC                 neg     eax
PAGE:004B01CE                 shr     ecx, 0Ch
PAGE:004B01FB                 cmp     [ebp+arg_8], 210h
PAGE:004B0202                 jz      loc_4B4A0A
;这里将210与压栈的参数比较,如果压入栈的不是210呢

PAGE:004B0208 loc_4B0208:                             ; CODE XREF: MiCreatePebOrTeb(x,x,x)+48ADj
PAGE:004B0208                 mov     edi, [ebp+arg_C]
PAGE:004B020B                 mov     eax, _MmHighestUserAddress
PAGE:004B0210                 push    edi
PAGE:004B0211                 push    dword ptr [ebx+11Ch]
PAGE:004B0217                 add     eax, 0FFFF0001h
PAGE:004B021C                 push    1000h
PAGE:004B0221                 push    eax
PAGE:004B0222                 mov     eax, [ebp+arg_8]
PAGE:004B0225                 add     eax, 0FFFh
PAGE:004B022A                 and     eax, 0FFFFF000h
PAGE:004B022F                 push    eax
PAGE:004B0230                 call    _MiFindEmptyAddressRangeDownTree@20 ; MiFindEmptyAddressRangeDownTree(x,x,x,x,x)
PAGE:004B0235                 test    eax, eax
PAGE:004B0237                 mov     [ebp+arg_C], eax
PAGE:004B023A                 jl      loc_5267A5
 
关键是这里
PAGE:004B4A0A loc_4B4A0A:                             ; CODE XREF: MiCreatePebOrTeb(x,x,x)+66j
PAGE:004B4A0A                 mov     edi, _MmHighestUserAddress
;总是7FFEFFFF
PAGE:004B4A10                 lea     eax, [ebp+var_C]
PAGE:004B4A13                 push    eax
PAGE:004B4A14                 add     edi, 0FFFF0001h
;此时edi为7FFE0000
PAGE:004B4A1A                 call    _KeQueryTickCount@4 ; KeQueryTickCount(x)
PAGE:004B4A1F                 mov     eax, [ebp+var_C]
PAGE:004B4A22                 and     eax, 0Fh
;只取最后一个字节的值,比如此时为0C
PAGE:004B4A25                 cmp     eax, 1
;看eax此时是不是为01
PAGE:004B4A28                 mov     [ebp+var_C], eax
PAGE:004B4A2B                 jbe     loc_4B4928
;如果是就跳到去处理
PAGE:004B4A31 loc_4B4A31:                             ; CODE XREF: MiCreatePebOrTeb(x,x,x)+4792j
PAGE:004B4A31                 shl     eax, 0Ch
PAGE:004B4A34                 sub     edi, eax
PAGE:004B4A36                 lea     eax, [edi+0FFFh]
PAGE:004B4A3C                 push    eax
PAGE:004B4A3D                 push    edi
PAGE:004B4A3E                 push    ebx
PAGE:004B4A3F                 mov     [ebp+var_4], edi
PAGE:004B4928 loc_4B4928:                             ; CODE XREF: MiCreatePebOrTeb(x,x,x)+488Fj
如果eax为1,那么就更改为2.这样避免最后计算出来为7FFDF000.而是为7FFDE000
PAGE:004B4928                 push    2
PAGE:004B492A                 pop     eax
PAGE:004B492B                 mov     [ebp+var_C], eax
PAGE:004B492E                 jmp     loc_4B4A31
 
因为KeTickCount是进程的一个时间计数,所以无法预测。
.text:0041CAA8                 mov     edi, edi
.text:0041CAAA                 push    ebp
.text:0041CAAB                 mov     ebp, esp
.text:0041CAAD                 mov     ecx, _KeTickCount.High1Time
.text:0041CAB3                 mov     eax, [ebp+arg_4]
.text:0041CAB6                 mov     [eax+4], ecx
.text:0041CAB9                 mov     edx, _KeTickCount.LowPart
.text:0041CABF                 mov     [eax], edx

经过上面的分析我们知道,如果如果eax随机出来是1,2,那么最后分配的PEB的地址都是7FFDE000,这是为了避免以前的
7FFDF000地址的出现,使得以前的堆利用代码都失效。:)
1,2    7FFDE000
3    7FFDD000
4    7FFDC000
5    7FFDB000
6    7FFDA000
7    7FFD9000
8    7FFD8000
9    7FFD7000
A    7FFD6000
B    7FFD5000
C    7FFD4000
D    7FFD3000
E    7FFD2000
F    7FFD1000
0    7FFDE000
上面列出了可以看到PEB的所有可能值,可以看到7FFDE000的概率最高,1/8,其他都是1/16。:),但即使这样,也没法稳定利用了。
2、对TOP SEH的保护
微软对函数SetUnhandledExceptionFilter的代码进行了重大的调整。SetUnhandledExceptionFilter是kernel32.dll中导出的一个函数,用来设置一个筛选器异常处理回掉函数,这个回掉函数不替换系统默认的异常处理程序,而只是在它前面进行了一些预处理,操作的结果还是会送到系统默认的异常处理程序中去,这个过程就相当于对异常进行了一次筛选。
函数的SetUnhandledExceptionFilter调用方式为:
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
这个函数唯一的一个参数就是需要设置的回调函数的地址,返回值为上一次设置的回掉函数的地址。该函数不是在原来的回掉函数前再挂一个回掉函数,而是用这个新的回掉函数替换原来的那个回掉函数。如果地址参数被指定为NULL,那么系统将去掉这个“筛子”而直接将异常送往默认的异常处理程序。winxp sp2对这个函数做了重大的改变,在替换原来的回掉函数之前,首先会先对新的回掉函数的地址进行加密,而后再替换原来的回掉函数。在返回原回掉函数地址之前,会对其进行解密。该函数比较简单:
.text:7C810386 SetUnhandledExceptionFilter proc near
.text:7C810386 lpTopLevelExceptionFilter = dword ptr  8
.text:7C810386
.text:7C810386                 mov     edi, edi
.text:7C810388                 push     ebp
.text:7C810389                 mov     ebp, esp
;这里先对地址lpTopLevelExceptionFilter进行加密
.text:7C81038B                 push     [ebp+ lpTopLevelExceptionFilter]
.text:7C81038E                 call      RtlEncodePointer
;而后将加密之后的地址和原回掉函数地址进行交换,也就是将加密之后的地址写入到
;一个全局变量中,同时将该全局变量中的原回掉函数地址返回
.text:7C810393                 push     eax             ; Value
.text:7C810394                 push     offset Target      ; Target
.text:7C810399                 call      InterlockedExchange
;在返回原回掉函数地址之前先进行解密,因为原回掉函数地址也进行了加密
.text:7C81039E                 push     eax
.text:7C81039F                 call      RtlDecodePointer
.text:7C8103A4                 pop     ebp
.text:7C8103A5                 retn    4
.text:7C8103A5 SetUnhandledExceptionFilter endp ; sp = -8
.text:7C8103A5
而以前都是直接将回掉函数的地址写入到全局变量中,没有经过任何的处理。可见,我们再也无法像以前一样通过覆盖该函数指针来利用堆溢出了。而且经过分析发现,winxp sp2对所有的全局指针都进行了这样的加密处理。接着往下看它是怎么对地址进行加密的。
RtlEncodePointer和RtlDecodePointer都是ntdll.dll导出的函数,RtlEncodePointer用来对一个指针进行加密,RtlDecodePointer用来对一个指针进行解密。其实整个个加密解密过程都很简单,加密时直接将指针和一个的随机数进行异或,解密时再和该随机数进行异或。
加密:point = point ^ rand
解密:point = point ^ rand
rand是一个跟进程相关的随机数,通过调用函数ZwQueryInformationProcess得到,每个进程该随机数都不一样。
为了避免你再次进行反汇编,这里贴出这两个函数的代码。
RtlEncodePointer函数的代码如下:
.text:7C933917 RtlEncodePointer proc near
.text:7C933917 var_4           = dword ptr -4
.text:7C933917 arg_4           = dword ptr  8
.text:7C933917
.text:7C933917                 mov     edi, edi
.text:7C933919                 push    ebp
.text:7C93391A                 mov     ebp, esp
;调用函数ZwQueryInformationProcess得到一个跟进程相关的随机数
.text:7C93391C                 push    ecx
.text:7C93391D                 push    0
.text:7C93391F                 push    4
;这里得到堆栈中的一个临时变量的地址,最后得到的随机数将保存在这个临时变量中。
.text:7C933921                 lea     eax, [ebp+var_4]
.text:7C933924                 push    eax
.text:7C933925                 push    24h ;子功能代码为0x24
.text:7C933927                 push    0FFFFFFFFh
.text:7C933929                 call    ZwQueryInformationProcess
;将得到的随机数和指针进行异或,这样就完成了加密。
;解密的过程和加密的过程相同
.text:7C93392E                 mov     eax, [ebp+var_4]
.text:7C933931                 xor     eax, [ebp+arg_4]
.text:7C933934                 leave
.text:7C933935                 retn    4
.text:7C933935 RtlEncodePointer endp ; sp =  4
函数RtlDecodePointer更简单,只是直接转到RtlEncodePointer执行,因为解密的过程和加密的过程完全相同。
.text:7C93393D RtlDecodePointer proc near            
;下面这四跳语句没有任何的作用
.text:7C93393D                 mov     edi, edi
.text:7C93393F                 push    ebp
.text:7C933940                 mov     ebp, esp
.text:7C933942                 pop     ebp
;下面这条语句转到RtlEncodePointer执行,其实就相当于直接调用了函数
;RtlEncodePointer
.text:7C933943                 jmp     short RtlEncodePointer
.text:7C933943 RtlDecodePointer endp
ZwQueryInformationProcess最后会调用一个系统调用,转到内核运行,最后会调用内核中的函数NtQueryInformationProcess,并且调用该函数的子功能代码为0x24。该子功能直接取出保存在进程中的一个随机数,并将其拷贝到用户堆栈中的一个临时变量中。如果该随机数为0,则还要根据系统时间重新生成该随机数,一般在进程刚开始创建的时候,这个随机数为0,从而会重新生成该随机数。由于该随机数跟进程创建的时间有关,所以这个随机数是无法猜测的。该函数在ntoskrnl.exe中导出,跟这个功能相关的函数代码为:
PAGE:004970CC loc_4970CC:                           
;下面的代码得到一个进程唯一的随机数,子功能代码为0x24
PAGE:004970CC                 cmp     edi, edx        ; case 0x24
PAGE:004970CE                 jnz     loc_497349
PAGE:004970D4                 cmp     dword ptr [ebp+8], 0FFFFFFFFh
PAGE:004970D8                 jnz     loc_4977B8
;下面的代码得到保存随机数的地址
PAGE:004970DE                 mov     eax, large fs:124h
PAGE:004970E4                 mov     eax, [eax+44h]
PAGE:004970E7                 mov     [ebp-34h], eax
PAGE:004970EA
PAGE:004970EA loc_4970EA:                            
PAGE:004970EA                 mov     edi, [ebp-34h]
PAGE:004970ED                 add     edi, 258h
;edi地址中保存的是一个跟进程相关的随机数,这里取出这个随机数
PAGE:004970F3                 mov     eax, [edi]
PAGE:004970F5                 test    eax, eax
PAGE:004970F7                 jz      loc_4B2379
{
    ;如果得到的随机数为0,则重新得到随机数,得到随机数的过程如下:
    ;1、先得到系统的时间,
    ;2、而后将这个时间和系统内核中的一个值进行不断的异或操作,
;就产生了一个随机数
    PAGE:004B2379
    PAGE:004B2379 loc_4B2379:                                
   ;得到系统时间
PAGE:004B2379                 lea     eax, [ebp-3Ch]
    PAGE:004B237C                 push    eax
    PAGE:004B237D                 call    KeQuerySystemTime
    PAGE:004B2382                 db      3Eh
   ;得到系统内核中的一个全局变量,该全局变量估计也是一个随机数
    PAGE:004B2382                 mov     eax, ds:0FFDFF020h
    PAGE:004B2388                 mov     ecx, [eax+518h]
    PAGE:004B238E                 xor     ecx, [eax+4B8h]
   ;将得到的随机数和得到系统时间进行异或
    PAGE:004B2394                 xor     ecx, [ebp-38h]
    PAGE:004B2397                 xor     ecx, [ebp-3Ch]
    ;将计算得到的随机数保存在上面的跟进程相关的全局变量中,edi中保存的就是
;这个地址。
    PAGE:004B239A                 mov     [ebp-0CCh], ecx
    PAGE:004B23A0                 mov     [ebp-0D4h], edi
    PAGE:004B23A6                 mov     eax, 0
    PAGE:004B23AB                 mov     ecx, [ebp-0D4h]
    PAGE:004B23B1                 mov     edx, [ebp-0CCh]
    PAGE:004B23B7                 cmpxchg [ecx], edx
    PAGE:004B23BA                 push    4
    PAGE:004B23BC                 pop     edx
    ;重新转到loc_4970EA,再一次得到刚才生成的随机数,如果该生成的随机数为
;0,则还会重新生成。
    PAGE:004B23BD                 jmp     loc_4970EA
}
;得到随机数之后,将其拷贝到用户栈中的一个临时变量中,esi保存的就是这个临时
;变量的地址。至此,就得到了一个跟进程相关的随机数,该随机数跟进程的创建时间
;相关。
PAGE:004970FD                 mov     dword ptr [ebp-4], 15h
PAGE:00497104                 mov     [esi], eax
PAGE:00497106                 test    ebx, ebx
PAGE:00497108                 jnz     loc_497AA5
PAGE:0049710E                 jmp     loc_4955F5
到这里我们已经完全清楚了整个随机数的获取过程。该随机数跟进程的创建时间相关,可见我们是无法猜得该随机数的。不过这个随机数只是再进程创建的时候产生,并且直到进程结束,该随机数都不会改变。所以,如果我们可以得到该随机数,在进程结束之前还是可以利用的。比如我们可以将其和我们的跳转地址进行异或,通过溢出将其写入到最高溢出处理地址,就可以像以前一样利用了。
不过这种方法对于远程溢出是无法利用的。但是如果能够覆盖程序的导入表或者静态数据段,那就是最理想的情况了。不过系统DLL的导入表不能够修改,但是一般程序的导入表还都是可以改的,所以还是有利用的可能性的。如果在静态数据段中存在某些函数的指针,则可以进行覆盖,从而加以利用,如果存在这种情况的话,要做到利用的通用还是有可能的。
3、VEH链表指针_RtlpCalloutEntryList的保护
我们知道堆溢出经常用的一个技巧就是修改VEH的链表指针。这在xp sp0和sp1的环境下都好使。但是sp2同样堵住了这条路。
xp_sp2下
异常处理过程
KiUserExceptionDispatcher
|
________RtlDispatchException
        |
        ___________RtlCallVectoredExceptionHandlers
 
sp2中,该指针位于
.data:7C99C320 _RtlpCalloutEntryList dd 0              ; DATA XREF: LdrpInitializeProcess(x,x,x,x,x)+2EFo
.data:7C99C320                                         ; LdrpInitializeProcess(x,x,x,x,x)+2F9w ...
我们就直接看看RtlCallVectoredExceptionHandlers函数
.text:7C95779C ; __stdcall RtlCallVectoredExceptionHandlers(x,x)
.text:7C95779C _RtlCallVectoredExceptionHandlers@8 proc near
.text:7C95779C                                         ; CODE XREF: RtlDispatchException(x,x)+14p
.text:7C95779C                 mov     edi, edi
.text:7C95779E                 push    ebp
.text:7C95779F                 mov     ebp, esp
.text:7C9577A1                 push    ecx
.text:7C9577A2                 push    ecx
.text:7C9577A3                 push    edi
这里就比较VEH的链表是不是空的,也就是看自己是否指向自己。如果是空的就不用说了,非空就转向该指针的调用
.text:7C9577A4                 mov     edi, offset _RtlpCalloutEntryList
.text:7C9577A9                 cmp     _RtlpCalloutEntryList, edi
.text:7C9577AF                 jnz     loc_7C962DA0

.text:7C962DA0 loc_7C962DA0:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+13j
.text:7C962DA0                 mov     eax, [ebp+arg_4]
.text:7C962DA3                 push    ebx
.text:7C962DA4                 push    esi
.text:7C962DA5                 mov     [ebp+var_8], eax
.text:7C962DA8                 mov     eax, [ebp+arg_8]
.text:7C962DAB                 mov     ebx, offset _RtlpCalloutEntryLock
.text:7C962DB0                 push    ebx
.text:7C962DB1                 mov     [ebp+var_4], eax
.text:7C962DB4                 call    _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x)
.text:7C962DB9                 mov     esi, _RtlpCalloutEntryList
.text:7C962DBF                 jmp     short loc_7C962DD6
.text:7C962DC1 loc_7C962DC1:                           ; CODE XREF: RtlInitializeResource(x)+21C3Dj
.text:7C962DC1                 push    dword ptr [esi+8]
代码就不解释那么多了,可以看到指针在使用前必须先解码,这个函数前面已经讲解过了。
.text:7C962DC4                 call    _RtlDecodePointer@4 ; RtlDecodePointer(x)
.text:7C962DC9                 lea     ecx, [ebp+var_8]
.text:7C962DCC                 push    ecx
.text:7C962DCD                 call    eax
.text:7C962DCF                 cmp     eax, 0FFFFFFFFh
.text:7C962DD2                 jz      short loc_7C962DEE
.text:7C962DD4                 mov     esi, [esi]
所以可以看到在sp2下无法利用这个覆盖VEH链表指针的技巧了。
给出xp sp1下通用的指针
xp sp1下
.text:77F60C26 ; __stdcall RtlCallVectoredExceptionHandlers(x,x)
.text:77F60C26 _RtlCallVectoredExceptionHandlers@8 proc near
.text:77F60C26                                         ; CODE XREF: RtlDispatchException(x,x)+Ep
.text:77F60C26                 push    ebp
.text:77F60C27                 mov     ebp, esp
.text:77F60C29                 push    ecx
.text:77F60C2A                 push    ecx
.text:77F60C2B                 push    edi
.text:77F60C2C                 mov     edi, offset _RtlpCalloutEntryList
.text:77F60C31                 cmp     _RtlpCalloutEntryList, edi
;这里我们可以看到将77FC3210的值放入edi,然后和该地址的内容相比较,如果没有安装VEH,那么该地址
;的内容也是77FC3210,就不会跳转到77F7F485。如果用户安装了VEH,那么就会跳到77F7F485
.text:77F60C37                 jnz     loc_77F7F485
.text:77F60C3D                 xor     al, al
.text:77F60C3F
.text:77F60C3F loc_77F60C3F:                           ; CODE XREF: RtlInitializeResource(x)+1B6CDj
.text:77F60C3F                 pop     edi
.text:77F60C40                 leave
.text:77F60C41                 retn    8
.text:77F7F485 loc_77F7F485:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+11j
.text:77F7F485                 mov     eax, [ebp+8]
.text:77F7F488                 push    ebx
.text:77F7F489                 push    esi
.text:77F7F48A                 mov     [ebp-8], eax
.text:77F7F48D                 mov     eax, [ebp+0Ch]
.text:77F7F490                 mov     ebx, offset _RtlpCalloutEntryLock
.text:77F7F495                 push    ebx
.text:77F7F496                 mov     [ebp-4], eax
.text:77F7F499                 call    _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x)
关键的下面这个部分,从77FC3210里面取出安装的处理函数地址
.text:77F7F49E                 mov     esi, _RtlpCalloutEntryList
.text:77F7F4A4                 jmp     short loc_77F7F4B4
.text:77F7F4A6 loc_77F7F4A6:                           ; CODE XREF: RtlInitializeResource(x)+1B6BCj
.text:77F7F4A6                 lea     eax, [ebp-8]
.text:77F7F4A9                 push    eax
.text:77F7F4AA                 call    dword ptr [esi+8]
;这里esi指向struct _VECTORED_EXCEPTION_NODE结构,其0x08处为m_pfnVectoredHandler
;看到这里我们也就明白了,如果我们可以控制该指针,那么我们就可以控制程序的流程了!
.text:77F7F4AD                 cmp     eax, 0FFFFFFFFh

.text:77F7F4B4 loc_77F7F4B4:                           ; CODE XREF: RtlInitializeResource(x)+1B6AAj
.text:77F7F4B4                 cmp     esi, edi
.text:77F7F4B6                 jnz     short loc_77F7F4A6
xp_sp0下
_RtlpCalloutEntryList 位于77FC5BD0
.data:77FC5BD0 _RtlpCalloutEntryList dd 0              ; DATA XREF: RtlCallVectoredExceptionHandlers(x,x)+6o
.data:77FC5BD0                                         ; RtlCallVectoredExceptionHandlers(x,x)+Br ...
4、堆块的cookie保护
现在堆块的结构
HEAP_ENTRY      struc ; (sizeof=0X8)
Size            dw ?
PrevSize        dw ?
Cookie          db ?
Flags           db ?
UnusedBytes     db ?
Index           db ?
HEAP_ENTRY      ends
空闲块管理结构
_RTL_HEAP_FREE_BLOCK struc ; (sizeof=0X10)
Entry           _RTL_HEAP_ENTRY ?
List            LIST_ENTRY ?
_RTL_HEAP_FREE_BLOCK ends
对比一下以前的堆块结构
typedef struct _HEAP_ENTRY {
/*0x00*/    USHORT Size;
/*0x02*/    USHORT PreviousSize;
/*0x04*/    UCHAR SegmentIndex;
/*0x05*/    UCHAR Flags;
/*0x06*/    UCHAR UnusedBytes;
/*0x07*/    UCHAR SmallTagIndex;
} HEAP_ENTRY, *PHEAP_ENTRY;
可以看到SmallTagIndex被舍弃了,SegmentIndex挪动到后面,而第5个字节更改为cookie。
Cookie的计算公式:
堆块头部地址除以8,然后跟Heap的总体管理结构中的cookie来异或就得到了cookie的值。
代码如下
.text:7C931487                 mov     edx, esi             ;ESI指向HEAP_ENTRY
.text:7C931489                 shr     edx, 3
.text:7C93148C                 xor     eax, eax
.text:7C93148E                 mov     al, [edi+4]     ; 进行Cookie处理,此时edi指向堆管理结构分配头部
.text:7C931491                 xor     eax, edx
.text:7C931493                 mov     [esi+4], al
那么我们可以看到cookie有256个可能的值,所以你也就不用费尽心思来想怎么覆盖cookie而不出错了。当然有很多办法绕过cookie的检测。
xp sp2对于堆的管理并没有太大的变化,但是堆的管理结构,堆块,还有Lookaside表的某些字段发生了变化,比如说有的字段从dd变成了dw,因此加了几个字段。这些细节就不在这里罗嗦了。

- 作者: janxin 2006年12月12日, 星期二 16:55  回复(0) |  引用(0) 加入博采

上海堡垒(续)--zz小说


十一


  “你说Huge的Deep Red好还是Gucci的Envy Me好?”

  “什……什么?”

  “什么什么啊?香水!香水啊!我娘要过生日了,我想买一瓶香水送给她。”

  “拜托你说中文好不好?我难道没有告诉过你我四级过了两次才过去?”

  “好吧好吧,‘深红’好还是‘羡慕’好?”

  我站住了仰头望天,沉默了一会儿,再低头去看路依依:“其实有些中文和英文差别不大……”

  路依依不管我,跑过去趴在卡地亚的橱窗前伸长脖子去看那块万字花纹的纯金链坠:“其实我娘一般只用Hermes的Caleche,我想送一瓶显得年轻点的。”

  “你抹的是什么?”

  “Giorgio Armani,男士香水,闻闻?”

  我很配合地接过路依依伸来的衣袖把鼻子凑上去摇了摇,像是一条小狗。“前香是豆蔻和海藻,中香是茉莉花,风信子啥的,后香是麝香。”

  “劳动人民觉得自卑,你说的这些我都不懂——海藻也是香的么?”

  路依依翻翻白眼:“那就继续自卑吧。”

  我们两个甩着步子走在中信泰富广场下面的商厦里,这不是一个逛商场的好时候。

  战争开始的时候市委领导做了振奋人心的动员报告,表示即使外星文明压境,上海作为国际化的大都市,依然能够心不惊肉不跳,面不改色微微一笑,毙强虏于泡防御圈之外。所以南京西路依旧繁华,各种奢侈品店灯火辉煌,红男绿女川流不息,光流轰击在泡防御圈上溅起耀眼紫光的夜晚,还有街舞团队在恒隆广场前的露天舞台上随着音乐欢蹦,伴着围观人群轰天的喝彩。

  不过这毕竟不是《太空堡垒》,德尔塔文明也不是天顶星人,那些东西一不怕音乐二不怕舞蹈,而且耐性超人,今天炸不穿明天继续来炸,空袭警报声最终取代音乐成了这个城市的主旋律。奢侈品店的库存在日益减少,粮食配给也在逐渐收缩,新鲜的肉类换成了冷冻的,蔬菜变成了压缩的,破损的橱窗没有人修补,压抑得受不了的年轻人在一夜之间把南京西路上所有汽车的前窗敲碎了。

  战争胜利是一件遥遥无期的事,微微一笑唱歌跳舞战胜外星人也成了一个笑话,而强撑着继续开放的奢侈品店门可罗雀,时尚男女们如今缩在家里脸色像是秋霜打过的茄子。唯一不担心的似乎就是我们这些军人,也许是因为距离死亡太近了,近得令人麻木起来。

  当然,还有路依依,我不能不说这个丫头很神奇。

  自动扶梯静静的停在那里,阳光大厅正中的巨大花球零落了一大半,看着萧索。

  玻璃顶棚原来是一周清理一次,现在那上面满是灰尘,残缺不全。KENZO的门口,女营业员一身黑色的西装套裙,外面却罩着军大衣,一种历经沧桑的眼神看着放眼所及的唯二两个顾客。

  就在这样的环境里,路依依一蹦一蹦的跑在扶梯上,发梢起落,高跟靴子踏着铁板叮叮作响,她窜到二楼按着膝盖对我喊:“来啊来啊!”

  午后的阳光不错,从破了无数洞的阳光天棚里上下来,路依依站在光影分界线上,未染过的头发被光照得透明起来,跳荡着阳光特有的金色。她对我伸着手,就像是要拉我。“什么东西?”我被她扯到橱窗边。

  那是一双Prada的靴子,白色的,绒面,7、8厘米的高跟,看着很精致合脚的样子,在靴子口上有一圈可爱的白毛。路依依接着膝盖盯着它看,眼睛里光彩流溢,她转过来问我:“怎么样?”

  “蛮好……就是……”我抓了抓头。“什么就是?”

  “我怎么记得有一张Playmate的图上,就是这样一双靴子……?”

  “对阿对阿!”路依依露着白净的牙齿笑,”我也是一看到就想起那张Playmate了!”

  Prade的门店里一个店员探了探头:“5700,就这一双了,合脚就拿走好了,八折。”

  “多少码的?”路依依问。“36。”

  “正好正好,我就是36的。”路依依点了点头,拉我,”走吧。”

  我愣了一下:“不买了?你不是很喜欢么?喜欢就买吧啊。”

  “我不要。”路依依摇摇头。“喜欢又不要?”

  “我小时候就是这样,逛店的时候我最喜欢的那个东西我就指给带我逛店的人,可是他们要给我买,我就是不要。我等着他们记下来,悄悄去买了等我过生日或者过圣诞的时候包在礼物盒里面送给我。”路依依轻轻地说,她把整个脸贴在玻璃上,去看那双靴子。她的鼻子被压得圆圆的,脸蛋因为受了玻璃的寒气,泛起额外的粉色来。

  我忽然想她的脸捏起来想必很有趣。“太拽了吧?”我说。“东西再贵也没什么了不起啊,记住不记住才是关键的。”

  她忽然扭过头来盯着我,非常用力地瞪大眼睛。

  我往后小蹦一步:“哇,依依你这个暗示真是太强了,远比孙悟空的老师在他后脑勺上连敲三下要好理解!”

  “没办法啊没办法啊!”路依依跟着蹦过来拽着我的胳膊,眉开眼笑:“你没有孙悟空聪明啊。”

  “哇噻,五千多的靴子?就当我没听见好不好?”

  “喂,大家出来混迟早都要还的,你吃了我好多顿饭的。”

  “早说是高利贷我就不吃了,老话说啊,拿了我的送回来,吃了我的吐出来……”

  “那边那边!”

  我还没有说完,路依依一溜小跑,扯得我一个趔趄。

  一个没有人看管的领带专柜,木格子里一卷一卷地放着几十条各种领带,色彩斑斓像是抽象派的画儿。“喂,你有几条领带?”路依依在那些领带中间翻检。“一条,上大学前我老娘买给我的,用来配我那身阿玛尼的西装,不过是冒牌的。”

  “不会吧?什么颜色的?你多大了,才一条领带?”

  “压在箱子底下呢,颜色记不太清楚,反正是个海豚图案的。我又不穿西装,要那么多领带干什么?”

  路依依翻翻白眼,很是蔑视:“拜托,你不看杂志的啊?男人的领带数目代表他的成熟度!你可以只有两身正装四五件衬衣,不过领带可是要天天换的。”

  “这个倒是听说了,据说辛德勒出来混世界只有两件衬衣倒有十几条领带。”

  “嗯,记得不错,表扬一下——里面有哪条你觉得喜欢?”

  我的目光扫过,最后拣了一条起来,是一条银色锻面的。“嗯,这次还有店眼光!这条好,衬黑色最合适。”路依依拍拍巴掌,笑眯眯的。”

  “我那身Armani是棕色格子的。”

  “好啦好啦,都上大学前买的衣服了,扔掉好了。我是说比较衬军礼服,军礼服不是黑色的么?”

  “预备役中尉,没有军礼服的。”

  “等你升成将军再穿,配这条领带。”

  “你这么说真让人不由自主地悲凉,你难道是说等我混成老头了,就可以戴这条领带了?”

  “走吧走吧。”路依依扯我。“啊?我还以为你要买了送给我的。”我说。“拿靴子来换!”路依依对我比了一个鬼脸。“哼哼!领带便宜!赔本生意不做!”

  我们两个重复着这样没内涵的对话,走在阳光下的商场里,路依依拎着几个纸袋子,我也拎着几个。周围空荡荡的无人,她在阳光投下的窗格子的阴影间蹦格子,长发发梢缀着银的米老鼠坠子,一起一落。

  手机短信声从我口袋里传来,这一切的美好忽然都中断了,我懒洋洋笑着的表情难看地凝在脸上,去口袋里摸手机,看着路依依蹦得越来越远,嘴里”一”,”二”,”一”,”二”地念着 。“934。”

  我几乎是蹦了起来,把提袋往路依依胳膊上一挂,拔腿向着门口飞奔而去。“怎么啦?”路依依在我背后大喊。“紧急集力狂奔。

  路依依应该是愣了一下,然后她叮叮咚咚的高跟鞋声音跟在我背后追了过来。

  我一头冲出大门,看见斜刺里一辆装备了防弹庄稼的重型军吉普带着刺耳的噪音刹在我面前。一个人推开车门对我大喊:“上车!”是大猪。“上什么车?”

  “南浦大桥!南浦大桥!老大派我们小队支援南浦大桥!”二猪从中信泰富办公楼入口那边冲出来,全身野战装束,边跑边喊,”光纤中继站被摧毁了,那边情况顶不住了!”

  我根本没有思考的余地,被二猪一把推进车里,随后野战军服盖在我脸上。

  野战吉普野马嘶鸣一般发动着,路依依从商场门口跑出来,拎着大大小小的购物袋跑到我们的车边:“喂,江洋!今晚还吃不吃饭啦?”

  大猪已经升起了全部的窗玻璃,我只能挥挥手,知道喊什么路依依也听不见。路依依拍打着我们的窗户,嘟着嘴还在说着什么,车已经发动了。她跟车跑了几步,终于被抛下。

  我从后窗看出去,空阔无人的南京西路上,一个女孩提着购物袋,孤零零地站在那里。

  我们还没赶到江边,远远的就被那景象震撼了。

  一只足有三层楼高的捕食者,正站在和平饭店的前门处,和平饭店半边塌着,不知道是不是这东西着陆的时候撞的。无数的子弹混杂着轻型反坦克炮的炮弹倾泄在它身上,阵阵硝烟里,那个巨大的东西收拢蟑螂背壳似的两片东西防御身体两侧,岿然不动。这是我第一次那么逼近地看见捕食者,它拥有无数肉质的触须、蟑螂背壳般的翼,花岗岩一样的皮肤,一张海葵那样的”嘴”。

  即使地狱的老大撒旦也不会容忍这样丑陋的东西生活在自己的地盘上。“我靠我真的没看错么?”二猪喃喃。“技术部呼叫宪兵部,我们即将赶到江边。怎么回事?到底怎么回事?为什么会有一只捕食者降落下来了?”大猪一手打着方向盘,一手持着对讲机狂吼。“这是你们技术部的事,我们宪兵部怎么知道?”宪兵部的兄弟也够横的,”你们有没有带重型武器?把这个东西敲掉再说。”

  “那是你们宪兵部的事,我们技术部不管!我们是来维修泡防御发生器的光纤中继站的,光纤中继站和备用通路全部都被破坏了!找熟悉地形的人过来,要一个班,带我们去找断点。”

  “一个班?我哪有一个班?我已经动员全部人手带重武器往那边集中了。你也不用找什么断点,断点就在那个大东西下面,它正坐在上面呢!”

  “我靠!!!”大猪把对讲机往旁边的座椅上一扔,野战吉普骤然加速。“泡防御出现过孔洞,否则这东西进不来。”我说。

  这是以前从来没有发生过的事情,不过理论上来说,当泡防御的能源供给出现问题,或者能量密度严重失衡的时候,某些区域可能出现孔洞。这个东西应该就是在光流轰炸造成孔洞的一瞬间钻了进来,即便这个瞬间可能只有零点几秒,不过以它的速度,已经足够了。

  它钻进来直接扑向了光纤中继站……这些东西的智慧开始令我觉得后脊发凉。

  一个又大又沉的铁东西砸在我怀里,我差点翻到座位下去。“你搞什么?”我瞪着二猪。“肩扛式导弹,你拿着!”二猪含含糊糊地说着,把一件四联装反坦克火箭扔到了前座去,大猪一把捞住背带,头也不回。“多亏是特备车辆,我们还真带了重武器。”二猪还是含含糊糊的。这是因为他手操一件M4,嘴里正叼着黑色帆布的枪榴弹子弹带。这个清秀的家伙脸上横生一股杀气,还在一件一件地从座椅后面抄出我叫不出名字的铁家伙来。“早知道你们是玩真的,我就不签军事服务协议了!”

  我话刚出口,大猪就强行刹车,车门也被震开了,我抱着肩扛式导弹一骨碌滚了下去,等我爬起来,大猪二猪已经扛着重武器向捕食者那边跑过去了。

  “隐蔽!隐蔽!”有人在外面高声大喊。

  我紧紧贴在墙后,空气里无处不是酸雾的刺鼻气味。我把最后一枚巡热导弹滑进弹槽,解开了保险栓,紧紧地把发射器抱在怀里。脸皮好象都被这些酸雾腐蚀得发软了,一阵阵地刺痛。

  伴随着”嘶”的巨响,更浓烈的酸气扑面而来,空气中弥漫着芥子气似的黄绿色。我看见墙外的街道上同色的高压液柱横过,那些液体像是粘稠的,留在红砖墙上缓缓地滑下,墙壁的颜色变浅了。

  这是那个大东西的武器之一,像是它的口水,不过喷到人身上就不是受点侮辱那么简单了。“攻击!”还是刚才那个人大哈。

  我跳出去单膝跪下,在护目镜中迅速地寻找目标,又迅速地扣动发射擎,狼狈地闪了回来。这个时候隐藏在墙后和门洞中以及其他掩体里的宪兵们也纷纷跳出来,避开地上一滩一滩的黄色酸液,对准那个四不像大家伙开火。二猪距离它已经是最近了,只有不到二十米的距离,他的枪榴弹也已经打空,拿着M4无奈地扫射了几下。那些子弹打在捕食者身上全无效果,即使我那枚可以让一辆豹式坦克瘫痪的肩扛式导弹,也不过是在它身上炸开了一朵梢显耀眼的火花。

  不过它似乎也受了一点小伤,花岗石一样的皮肤裂开了四道口子,露出里面腮一样深红的东西。它像是吸入大量空气以求自我修复,尽管我不清楚那是什么原理,不过从一张一合的裂口和它涨大复又收缩的躯干来看,这东西是在大喘气。

  又是高压水龙一样的酸液柱横扫过街道,我抛下发射器,疲惫地坐下,和对面那具整个面部都已经融化的尸体相对。他身上还穿着宪兵的制服,脖子上挂着微型冲锋枪,黄绿色的酸液从他惨白的下巴往下滴落。

  我从未想过自己能够那么安静地面对一具只该出现在恐怖片里的尸体。看着第一个宪兵被杀的时候我惊恐得忘记了躲闪,大猪一脚把我飞踹到工商银行的门洞里,才躲过了随即袭来的酸液。确实是可怖的场景,那东西的触须忽然绞住了宪兵的胸口,而后收紧,所有肋骨一瞬间被压碎,一个成年男人的胸口被勒得像是二八少女的细腰,鲜血和脏器都从嘴里涌出来。但是我现在已经不怕了,看得已经很多了,酸液……触须……一个接一个人倒下,我活到现在只是我运气太好,有种从胸口里横生的勇气让我觉得我本该和那些已经倒下的兄弟一样。既然我赚了,就不吝把赚来的这条命再押上赌桌。

  我手脚并用地爬过去,想去摘他脖子上的微冲。这时候我的手机响了起来。“谁?忙着呢!”我大吼。“我,就在你对面!”

  “喂!这个时候你打什么电话?”

  “不打电话你听得清么?”

  我一扭头,大猪正遥遥跟我招手。大猪跟我距离只有二十米,他躲在和平饭店侧门的门洞里,一边打电话一边招手,还一边跳着跳着把沾上酸液的裤子脱下来。我确实不可能直接听见他的叫喊,酸液喷射停止的瞬间,宪兵门(此是错字,应为”们”)又冲出去抓紧短暂的间隙扫射,枪声震耳。“什么事?快说!”

  “要赶快想办法!刚才电话过来,总部那边收不到信号,不能做平衡,坐标(231,16,149,38),就要撑不住了,能量流动很混乱!”

  “(231,16,149,38),那……不是我们头顶么?”我脑袋发懵,最近我总是出现在光流轰击的焦点下。

  我拼着危险探头出去,抬眼看向空中,灿烂的紫色光流接二连三地轰击在南浦大桥上法规的泡防御界面上。我看不见发射光流的次级母舰,也许都悬停在高空的平流层里,不过这点距离不会影响它们的准头,而且按照这个攻击频率来看,至少有30艘次级母舰发动了。还好没有那天那种巨无霸级别的。“这次它们可能是冲着上海大炮!它们察觉了!”

  “你说快,怎么快?”我瞪着眼睛,”我现在导弹也用完了,剩下的武器只有牙齿了!”

  “不过上海大炮……无论如何是不能失守的!”

  “犯不着我们担心。”我的心里微微动了一下,一瞬间像是有点幸灾乐祸的欣喜,”杨建南够牛,他搞得定!我们搞定这东西就得了。”

  熟悉的风吼声忽然席卷了整个区域,我愣了一下,狂喜地指着天空:“好了!搞定了!”

  三架鹞式以三角队形低空逼近,我根本不怀疑那是我熟悉的灰鹰小队,坐在里面的肯定是老路和他的僚机飞行员。

  鹞的机翼下忽然出现了盘旋的白色烟迹,它们开始是六道集中,随即像是马戏团的焰火那样分散了。响尾蛇导弹在空中高速转折,带着刁钻的弧度从六个方向上调整着攻击角度。最后几乎是同一个时刻,六枚导弹冲向了静止在路面上的捕食者,它全速的时候可以轻易超过鹞,而这时候这个大东西采取了奇怪的防御措施。它挥舞的触手忽然都收了回去,紧紧地纠缠起来围绕那个看似头部的突起部位。这样子它好象一个要挨打了抱着脑袋的小孩。

  震耳欲聋的爆炸,滚滚而来的热风瞬间摧散了那令人恐惧的酸气,带来了可以呛死人的低氧气氛。我猛扑在地下,碎裂的玻璃铁片砖屑以及捕食者的碎片像是一场暴风那样扫过外面的街道,鹞们并为停留,直接离去。

  最先冲出来的是大猪二猪和我。对于宪兵们现在工作已经结束,对于我们这只是开始。

  捕食者三分之一的躯体完全被粉碎了,像是一些被鱼炮炸开的海蛰。黄绿色酸性的体液流得满地都是,还好这些酸并不对我们军靴的材质起作用,我们只需要小心不要把酸液踩得溅起来溅到同伴的脸上。那些碎块不知道能否称为”肉”,踩起来像是老化的橡胶,有几块大的还在缓缓地蠕动。

  好在那个包括了头部突起的大块儿——我是说那玩意儿最大块的”遗体”——似乎已经绝尽了生机,无声地躺在一边。我想复旦或者上海交大生物系的教授们应该激动得停止呼吸了——这是人类迄今为止获得的最完整的捕食者标本。“这是什么东西?”二猪踩了踩地下的玩意儿。

  那是半截牙状的东西,灰白色,钻透地面直插下去,就在刚才捕食者的”脚下。”它已经断了,不过看截面大小少说有两三米长,这么一个东西切入地下,可以想象整个光纤立刻被切断,中继站也一起被破坏掉了,难怪中信泰富的总部收不到浦东几个泡防御发生器的信号了。

  这东西隔着一层地面准确地测算了光纤的位置。“它的脚趾甲!”大猪说,扔给我和二猪一人一把铁锹,”来!沿着这根脚趾甲挖开,我们要找到光纤的断点接上它。”

  光纤是战争预备时期铺下的,不算深,我们下完了一米,找到了断口和还在冒着电火花的中继站系统。车后面带有备用的中继站系统,我和二猪忙着做光纤断口的修复,大猪调试中继站那个不大的黑色盒子。我和二猪的作战笔记本已经接上光纤信号了,现在是浦东金茂大厦那边的第三指挥部在平衡浦东区域,包括了南浦这边的高危区域,而浦西的第一指挥部和第二指挥部没有信号,只能闲着面对平安无事的浦西泡界面区。“好了么?”我问大猪,擦了一把额头的汗。

  这一擦擦下一层薄薄的皮来,一阵火辣辣的头疼,看样子皮肤是被那酸雾彻底给毁了,只希望它里面不要有毒。不过没有时间顾这个,我看了一眼屏幕上1号破损——也就是我们头顶的这个——的各项指数,很明显,第三指挥部的技术员们无力去应付那些紊乱的能量流,而新的光流还在不住轰下。

  手机不合时宜地叮叮咚咚想了起来,王心凌的《第一次爱的人》,在这样一个场面下响这个音乐实在太不合时宜了。“喂?老大?我们还在赶工!”我对着手机喊。“别接光纤了!出了什么事?”将军的声音炸得我耳朵发麻,简直像是发疯了,”那边到底出什么事?!”

  “还能有什么事?就是轰炸啊轰炸啊轰……”

  说到这里我忽然说不下去了,半句话合着一股寒气被我硬生生地吞了回去。我无意中又扫了一眼屏幕,刚才那些参数现在完全变化了。这并不市说那一块泡泡的能量分布更加混乱了,而是所有区域的能量都在雪崩一样下降!换而言之,似乎整个泡防御界面的能量都被吸走了!按照这个速度只需要五分钟整个泡防御界面就会失去能源,像是雪融冰消那样没影儿了,整个上海将暴露在光流的直接轰击下。“怎……”大猪看我脸如死灰扑上来看了一眼,呆呆地张大嘴巴。“我靠!难道是……停电了?”二猪喃喃地说。“去死吧!这东西不使用电能!”大猪呸了他一口,也束手无策。“我们这边监测到的所有数据都在疯狂下降,迅速查实!迅速查实!”将军还在电话里吼叫,外面传来了宪兵们骚动的声音。

  我把手机扔给了大猪,从坑里跳上地面,看见那些本该在周围警卫的宪兵们都已经跑到江边去了,正在指着江面讨论着什么。我愣了一下,大步跑过去,看见森严冷调的铁护壁正从水底缓缓上升,江流激动水花跳跃,有如摩西开辟红海的宏大。“上海大炮!”

  足有四十米的炮口对着天空,钢铁的表面像是升温那样发出暗紫色的光,周围的水全部被蒸发了,袅袅地升腾,空气中有一种极细的声音在震荡,像是无数细针针锋相对的刺击。

  大猪也冲了过来,拿着我的手机,他完全呆住了,任手机里将军还在”喂喂”地狂喊,只是呆呆地看着水中雾里的巨型炮口。“上海大炮……要发射……”大猪拿起手机,有气无力地说了一句,结束了通话。“你说得对,杨建南够牛,他搞得定。这下子他要把我们全部人都搞死了……”他转过头,喃喃地对我说。

  上海大炮抽提了泡防御界面的能量,我不知道这到底是怎么回事,但是它确实发生了。而且最可怕的还不是这个……

  所有人都捂上了耳朵,那些细针碰撞的声音现在变得粗砺起来,像是有沙子在耳朵里滚动。我感觉难以忍受的眩晕,像是大脑失血,有种空气中所有粒子都在发疯般跳跃的幻觉。

  钢铁的颜色渐渐变成明亮的紫色,紫得发白,最后它像是被投入了绝对高温的一块铁。“受不了了!”我对着大猪大吼。

  宪兵们都趴下了,这个举动说不上原因,但是每个人都不由自主地想这样做。因为此刻的上海大炮在我们的眼里如同一颗即将爆炸的超级。

  “我要看着它发射!”大猪咬着牙齿,”可不是所有人都有机会看着约束场炮火发射的!”

  我瞪着他的眼睛,他眼睛里有股可怕的坚忍和……绝望。

  “没办法可想么?”

  “那东西不能发射的,我们都知道!”

  空气噪音忽然停止了,这一刻整个黄浦江江面上寂静如死,我的心脏仿佛也停止了跳动。

  悄无声息地,笔直的光柱以大约60度角直刺天空,像是一个巨大的探照灯。它亮起来的时候如同无数个太阳同时升起,我及时闭上了眼睛,依然能够感觉到面前那片绚烂的灼热的光,脸像是靠近火炉那样发烫。

  我再次睁开眼睛的时候,面对着天空,想要看清那里一个40米直径的巨大孔洞。

  其实我知道我不能,泡防御界面本身是透明的,但是我也知道它一定在那里。天堂的门已经开了,地狱之虫会不顾一切地涌进来。

  我看着周围,同样刚刚睁开眼睛的宪兵们脸上都有振奋的神情。这也是他们第一次看见上海大炮发射,我想他们正在猜想刚才那一炮是否命中了敌人的次级母舰。对此我倒是并不怀疑,以上海大炮这样的武器,足以瞬间击毁一艘次级母舰,即便上次那种巨无霸。

  不过,它也瞬间洞穿了泡防御界面……

  所谓上海大炮纽约大炮,都是一种来自阿尔法文明、被称为”约束场炮火”的重型地基武器。而迄今我们所知的唯一一种可以击穿泡防御界面的,就是约束场炮火。它的能量密度远远高于泡防御界面,而且不会被泡防御界面阻挡。当两者接触的时候,会自然而然的融合、穿透,但是,它也搅乱了泡防御界面的能量流,在那层界面上留下了一个直径40米的巨大孔洞,这个孔洞30秒钟内不可能复原。

  30秒钟……那个时间也许不够人类抽一根烟,但是足够那些东西毁掉上海!

  大猪拿出他的中南海,分给我一根,给我们两个一一点上火。二猪报起他的M4,换上了一个新的弹匣。周围的宪兵们不再是一个劲儿地欢欣鼓舞,有的已经惊叫起来,更多的人目瞪口呆,我喷了一口烟,猛地抬起头。

  肉眼分辨不清的黑云正在汇聚,目测大约有三千米的高度,还有新的在不断加入,其中大个儿的看起来像是急速游泳的蝌蚪。黑云快速地旋转着,让人想起你挑了一个蜂巢后,成千上万只兵蜂被激怒了,它们飞出来盘旋着集合,发出可怕的嗡嗡声。不过我们耳边的并不是嗡嗡声,而是人的叹息一样的”嘻哈”、”嘻哈”的叠声,千千万万个重叠在一起。

  全都是捕食者!我可以肯定世界上没有人看见过那么多的捕食者聚集在一起的样子。“嘻哈嘻哈嘻哈嘻哈嘻哈嘻哈嘻哈……”

  这个声音像是以天空和大地作为墙壁不断地回荡叠加,让人想起某种古老的召唤。“没想到会是这样的景象。”大猪摘下嘴边的烟。“我也想来一根。”二猪说。“来什么来?你又不抽烟。”大猪看都买看他。

  我悄无声息地去摸口袋里的手机,手机不在,哦,是在大猪那里。不过我想也是来不及了……其实我只是想说……嗯,我在键盘上打字终究是太慢了……所以就算了吧……

  一瞬间它们俯冲而下,像是坠空的火流星,千千万万个火流星在一起。它们长长的触须被空气扯得笔直,速度高得惊人,以一种撞击地面的勇气直冲而下,直指上海大炮的炮口。它们迅速突破了1500米的高度线,那层原本固若金汤的壁垒不复存在,这些东西想必是在狂喜吧,因为我们的愚蠢和冒进,它们获得了一次完整的进攻机会。

  人类不得不面对自己的虚弱了,没有了阿尔法文明提供的庇护,在这样铺天盖地的攻势下,我们没有机会。它们像是秘鲁寒流中高速游动的鲭鱼群,可是它们不是鲭鱼,它们每一个都比鲨鱼可怕得多!“你在想什么?”大猪说,”我总在猜自己死前会想什么,现在我知道了。”

  “你知道我在想什么?”我说。“嗯。”

  我忽然感觉到难以忍受的眩晕,这个眩晕袭来的剧烈让我几乎叼不住嘴里的烟。我的眼前尽是复杂凌乱的花纹。空气里像是有沙子在滚动……不!所有的沙子都在疯狂地跳跃!“这是?!”我大声喊。

  我拼命瞪大眼睛去看江面。江面上一块紫得发白的铁!“杨建南真是一个地道的疯子!”大猪喃喃地说。

  空气躁动停息,紫色的巨大光柱横贯天空,距离上海大炮只剩下300米不到的捕食者群像是被死神抚摩了。一股压倒性的摧毁力量逆着它们前进的方向推来,完全不容反抗。光柱以同样的角度切入天空,所有捕食者——也许有数百只,也许上千,也许几千,我根本无法计算——像是暴露在阳光下的吸血鬼一般,它们的躯体形状在紫光中仅仅保持了不到一秒钟,而后彻底化为灰烬。

  这些灰烬细得甚至无法收集,我们做过实验,接触到泡防御圈的物质和这些捕食者一样,无论是几克的样品还是像这样几万几十万吨的物质,都仿佛被扫进了另外一个空间,它们的痕迹完全消失在这个世界上了。那些质量小得可以忽略的灰烬中也监测不出任何燃烧的迹象,分析师说那些是碳、铝和硅,偶尔能够监测到痕量的硫。

  江心的炮口迅速地黯淡下去,我们怔怔地看着天空,看者那些细灰被风一卷而散。

  全部的捕食者都被这次炮击毁灭了。这是功率远超上海大炮的纽约大炮也不曾做到的。这是一次完全的轰击,像是看上了奶油蛋糕的苍蝇群,所有的捕食者笔直地扑向上海大炮,恰恰把自己法官在了炮击的轨迹上。而杨建南的疯狂和决断在于——他根本从开始就蓄积了两次轰击的能源,瞄准高空中次级母舰的第一炮不过是一个诱饵。

  “他是个疯子……我同意。”二猪说。

  救护车们围绕着刚才我们和捕食者对抗的半条街,医生和护士们扛着担架把一具具人体抬上救护车。可惜他们来得晚了,它(此为错字,应为”他”)们拖回去的大部分只是尸体了。消防车也来了,强有力的水龙扑灭了和平饭店里面因为电线断裂而引起的几处小火。

  德尔塔文明的这次突袭被成功地击退了,上海大炮第二次开炮自豪后,进攻迅速被终结,雷达显示这些东西丝毫也不犹豫地集合撤离了。这是第一次我们”击退”德尔塔文明的进攻,在此之前我们的胜利都是用泡防御磨掉了捕食者和次级母舰的耐心。

  我在那个大家伙的大半个身上踩了踩,大猪过来把手机递还给我。“有人给你短信。”大猪看着江面漫不经心地说。

  我从他的眼神里面大概明白了,打亮手机,显示是:“您有一条短信来自 林澜。”

  那只小野兽又欢欢喜喜跳了出来,翻着筋斗窜上窜下,它每次都是这个德性,半点耐性也没有。我这么想着,听见大猪说:“看你笑的那个样子。”

  我摸了摸嘴角,竟然残留着半个笑容。真见鬼,又笑出来了。“你还活着不?”短信是这么说的。

  “活着活着,捕食者倒是死了很多。”我回了。

  那一天有点奇怪,我再也没有收到林澜的回复。


十二


  “尊敬的各位来宾,现在请允许我介绍,我们在B1021作战中的英雄指战员,”主持人一扬手,”杨建南中校!”

  大家一起转向主席台,掌声热烈如沸。杨建南面无表情,在灼灼目光中登台,一身白色军服笔挺,腰挺直如枪杆,胸口上一列挂了三枚我叫不出名字的奖章。

  “在刚刚结束的B1021作战中,杨建南中校指挥的上海大炮进行勒这门地基巨炮有史以来的第一次和第二次发射,根据事后的录像统计,成功地歼灭了至少1052只捕食者,在这场战争开始以来,这是前所未有的重要战绩。可以说这一战改变了我们在对德尔塔文明抗战中被动挨打的局面,为了我们进一步的反击提供了实际操作经验,更是鼓舞了整个部队乃至全人类的信心和勇气!”主持人声音宏亮。

  台下的人又是哗哗地鼓掌。

  这里是上海展览馆的正厅,老式的苏式建筑,可厅堂真是宏大壮观,7488部队的几乎所有军官乃至于预备役都应邀参加了这次盛大的酒会,高级军官们穿着黑色的军礼服,女军官的军礼服则是白色的一步裙,他们的领章都换成了7488部队的单翼鹰标志,让军队的就会平添了一股老贵族的华丽。串行在人群中的是电视台和报社的记者,摄影机架得很高,灯光从四周投射下来,多少让人有点不舒服。我们不像是来这里品尝冷餐和葡萄酒的,更像是摆着被拍的。

  这是一场做秀,市政府是希望借机鼓舞一下市民的热情吧?连杨建南这种重磅的棋子都被摆到了摄影机前。

  “杨中校,请问你面对成千上万的捕食者时,心情是如何的?”主持人像个八卦记者。

  “我很紧张。我的心跳频率很高,而且也不确定这个战术是否能生效。不过在我看来那时候必须有一个有力的应急战术出现,否则我们将成为捕食者的食物……”

  看得出主持人有点急了,杨建南却并不看他频频施来的眼色。这家伙看外形和做事都像是一块铁板,他以为是如何的就如何说。不过主持人无非希望他能够渲染一下成功,他这么说倒像是威吓市民了。

  杨建南说的也是事实,如果那时候上海大炮不发射,泡防御指挥部未必能够确保上海不遭受光流的轰炸。

  “我们尝试了,我们成功了,我代表我们的全体指战员感谢领导部门,全体战友和市民对我们的信任,并宣誓将以我们的力量为上海的保卫做出更大的贡献。”杨建南说得很简短,把话筒递还了主持人。

  “真是军队的Superstar啊,”主持人恭维着,”杨中校……哦……我已经不能称您为中校了……”

  他忽然提高了声音:“总政治部经过紧急审核,杨建南中校授一级战斗英雄勋章,上校军衔!”

  他打开了手中的盒子,一级战斗英雄的勋章在扑上来的镁光下光辉刺眼。隆重的军乐响起,年轻的女军官捧着托盘登台,托盘上是两杠三星的肩章。

  我敢打赌解放军有不少上校,不过没有任何一个有杨建南那么风光,在那么多人的视线下光辉隆重地扛起了上校军衔。他今年多大?好像是31岁,林澜说的。比我大七岁,比我高四阶,我想我31岁的时候不过是一个上尉吧,依旧坐在工作台前算泡泡。

  我忽然注意到杨建南并未看那些耀眼的勋章和肩章。这个铁板样的家伙安静地看着台下。我的心里咯噔一下,看过去,那个角落里林澜轻轻地拍着巴掌,轻轻地笑。掌声震耳。

  所有人都鼓掌的时候,我和将军是唯二的两个例外,我注意到他站在人群的角落里,脸色生青。

  我紧追着将军的步伐出了展览馆的前门,我们背后还满是掌声笑声和音乐声,走出门却立刻被湿寒的夜风包裹。老家伙猛地一抖防雨风衣穿上,拉紧领口顶着微雨,大步流星地走下台阶,毫不理会在门口跟他打招呼的那位大校。

  黑色的奥迪立刻滑了过来,我拉开后门,将军闪了进去,一拍身边的座位:“坐这里!”我有点诧异,通常我是坐前排,不过我看得出他招我一起离开是有话要说。我钻进车里,和他并排而坐。

  “去哪里?”司机打着方向盘。

  将军随便地挥了挥手,挺得笔直坐在那里,嘴角线条拉得铁硬,目不转睛地看着前方,像是一只蓄势的狮子,牙齿已经磨得雪亮了——这是他最可怕的时候。

  “怎么了?”我试探着问。

  我知道他这一脸的杀机有非同寻常的理由……至少跟我的理由不同。

  将军没有立刻回答我,他缓缓地举起手在脸上用力揉了揉,像是要把那张生铁一样的脸揉得柔软一些。

  “他是电,他是光,他是唯一的神话,他就是他妈的Superstar!”他忽然发作了,低声吼叫,额头的青筋夸张地跳着,这只狮子像是要扑出去吃人。

  我笑了起来,我想到了他的手机铃声和沈姐门背后S。H。E。的大幅招贴。将军猛一扭头,恶狠狠地看了我一眼,目光像是刀子要从我脸上剜去一块肉。

  我又犯错了,这个场合实在不该笑的。

  将军抽回目光,疲惫地靠在椅背上:“这帮好大喜功的家伙,这一次的错误会把所有人送去见马克思!”

  我感觉到了那话里的酷寒,什么都不敢应。

  奥迪无声地滑行在空无一人的南京西路上,车里的空气像是凝固了。

  “江洋,你有没有感觉最近泡防御平衡指挥部的人员增加了?”过了许久,将军自己打破了局面。

  “嗯。”

  “全部的泡防御发生器都已经安置完成,全部的后备技术力量已经进入到一线,我们把手里所有的筹码都赌上了,可是胜算越来越小……”他的声音渐渐低了下去。

  “什么?”

  “市委领导们不相信,这个防御圈快要撑不住了!它就要炸掉了!”

  “什……么?!”我觉得脊背上滑过一道冰流,整个人呆在那里。

  将军的嘴角掠过一丝极残酷的冷笑:“怎么了?害怕了?是不是连你也根本没有想过,我们会失去那层泡泡?”

  “想过也许会死掉……但是没想到过这玩意儿会炸掉。”

  “会炸掉的,理论上存在这种可能,阿尔法文明的方程式中也可以推导出来。我们提交过一份报告提醒上海大炮的负责人,也就是杨建南,还有军委对上海大炮的直接负责人,你不需要知道他的名字,我们说上海大炮只能作为一个威慑武器,除非准备与城共亡,否则上海大炮绝不能开炮!可惜没有人相信,甚至没有人听,他们关心的是阿尔法文明什么时候会回来,他们相信那些我们见都没见过的外星人提供的防御!”将军一拳砸在司机座椅的后背

  “真他妈的见鬼!”

  “可是……上海大炮和泡防御有什么关系?”

  将军在我脑袋上拍了拍:“动脑子。你有没有想过,泡防御圈的能源是什么?地球上所有的能源形式都不足以支撑这样一个防御圈,它可以卸去相当于千万吨级氢弹爆炸的光流轰击,可以瞬间把上百万吨的物质化为灰烬,可以覆盖上海那么大的一个城市。”

  “不知道,大概不是我能理解的东西。”

  将军点点头:“我也不知道,没有人知道。整个上海堡垒的核心部分,完全是由阿尔法文明构筑的,包含泡防御和上海大炮。它们开放给我们的只是一个控制接口,我们知道如何去平衡它,维护它,却不知道细节。但是我清楚一点,就是这个核心系统只有一个,而不是两个!”

  “老大你是说……其实上海大炮和泡防御根本就是一个东西?”

  “毫无疑问!它们不仅是同质的能量,而且有足够的证据表明它们使用的是同一个能量源。你是在现场的人,你知道上海大炮开炮的瞬间泡防御的能量分部变化是怎样的。你能平衡么?”将军冷笑,”杨建南的这次轰击杀灭了多少只虫子?1000只?这个损耗对敌人来说很快就能弥补,你看见过那些捕食者再生的速度。可是对能量源的损耗呢?虽然我们不知道那个能量源是什么,但是我知道它已经被摧毁性地重创了!”

  “有这么严重?”

  “记得你那份关于新德里被摧毁的报告么?”

  “嗯。”

  “新德里为什么会变成一场灰雨?纽约为什么会陆沉?”将军死死地盯着我的眼睛。

  “因为……他们都发射了约束场大炮……”我悚然一惊,全身像是泡在冰水里那样。一直以来,我忽略了一个细微的相似处:这两个堡垒在陷落之前的三个月内都有约束场炮火开炮的记录,尤其是在纽约大炮连战连捷的时候,忽然启动陆沉,是因为泡防御的能量供给出现超出理解的下降。

  “你猜对了,因为他们反击了,这种反击等于放弃防御。现在我们已经反击过来……”将军静了一刻,”明天我会提高你的保密级别为A级,旁听指挥部参谋会议。”

  “没搞错把?我?A级?”我愣了一下。

  “你已经知道得太多了,换在古代皇帝当政的时候,是要灭口的。”将军竖起手掌,在我脖子上轻轻扫了一下。

  一个预备役中尉,可以旁听指挥部的参谋会议?保密级别提高为A级?这是某些高级军官也不能接触的绝密级别。也许这算是一种殊荣,不过为什么我觉得它更像一个阴谋?我老爹从小教导我没有下馅饼雨的上帝,人家对你太好总要小心。

  “好吧,我知道推脱也没有。”事到如今,我只能撑着硬上了。

  “那个东西……事活的!这些东西都是活的!”将军咬着牙。

  “活的?”

  “活体设备,就像是捕食者,次级母舰,它们都是以生物形式利用能源的。阿尔法文明和德尔塔文明,它们在能量利用的形式上没有丝毫区别。”将军深深吸了一口气,”真正和它们不同的,其实是人类。”

  “记得你那次在张江镇对泡防御发生器的检查么?”他换了话题。

  “记得,能量输出衰减,找不出原因来。”

  “我们手中作为能量输出设备的那个活体在慢慢衰弱,目前还不能确定它们的衰减周期,也许短期内能够恢复,可是如果衰减继续下去……”将军疲惫的靠在车座的一角,”我们将被迫启动陆沉计划。”

  “陆沉?”我跟着他重复了一次。

  “从我重新穿上这身军服那一天我就做好了这个准备。”将军双手举起他的军帽,缓缓的扣在头顶,拉低帽檐遮住了自己的双眼,”开车。”

  我的手机忽然响了起来,是大猪来的电话。

  “我带了个东西给你看,你回锦沧文华么?”大猪说。


十三
 

  我盯着手里那张光盘看。它蓝地印白,印着满天飞落的雪花,雪花里两个接吻的小人儿,造型老土,像是在街边卖三五块钱一个的那种瓷玩偶。

  左边印着两个名字——”杨建南”,”林澜”。

  右边印着一行行书手写体——”我们结婚了”。

  大猪在旁边抽烟,我们一起坐在锦沧文华外的台阶上,屋檐外还是飘着微微的小雨。

  大猪瞥了我一眼:“别一付死了全家的样子,只是个样品……样品而已。今儿上海大炮指挥部的一个兄弟拿着到处问哪里刻盘比较便宜,印刷的地方已经找好了,一印2000张,估计是准备作为礼物的。给我看见,一把抢过来了。不过样品出来了,这是筹备着呢……快了。”

  我不说话,食指套在光盘孔里,看着它发呆。

  “不想回去看看里面的内容?”

  “什么内容?”说出口,我才惊觉自己的声音变形得厉害,像是风里的烛火一抖。

  “像是DV拼起来的,很多人都说同一句话,猜他们说的是什么?”大猪踩灭了烟头,并不等我回答,”他们说:‘林澜,请你嫁给杨建南吧。’”

  我的手一抖。光盘掉了下去,远远地滚开了,停在下水道口,被汇流的污水冲刷着。

  “不看拉倒。”大猪说。

  静了一会儿,这个多嘴的家伙弹了弹烟灰:“那些人一个接一个地出来,有的是军官,有的是战士,也有估计是路边找来的行人,张口就是那句,特逗。都是拼起来的,有些镜头春光明媚,有些阴雨绵绵,有在办公室里拍的,也有在路边,还有拍一个刚从飞机上下来的家伙,是老路,一口倍儿糙的苞谷茬子味儿,笑两声,说,林澜,请你嫁给杨建南吧。”

  阴雨绵绵……我真讨厌阴雨绵绵……这雨为什么总是下个不停……总是下个不停……

  “真赞。你不看不知道那个感觉,三江四海五湖的兄弟好像都给凑一起了,操江西话的说完操福建话的说,操安徽话的说完操广东话的说,还有一个小孩,逗死了,拿着张纸条朗诵,宁南,请里下给杨先蓝吧……亏得杨建南都能搜集到。有好些镜头还是战争开始前的样子,准备了好久吧?”大猪沉默了一阵子,拍了拍大腿,”真牛!我是女人我也嫁给他了。这一招你能想到么?”

  “想不到。”我说。

  “就是啊。”大猪摊摊手。

  我们都不说话,静静地坐了一会儿,我站起来。

  “喂,没抽完呢。再坐会儿。”大猪拉我。

  “别拉我!我想点事情!”我心里很烦,现在只想一张床在我面前,我可以平拍着躺下去。

  “还能想什么?”大猪硬拉着我重新坐下。

  “你管那么多干什么?”

  “老大,别想了,这个……真是难搞。”大猪抓了抓脑袋,”说真的,林澜和杨建南就是比较配。”

  “我去你妈的,什么叫比较配?”

  “不说别的,杨建南比林澜大六岁,你呢,还比林澜小一岁。”

  “说得跟姐弟恋似的,你以为新浪娱乐新闻啊?”

  “没的事,没恋,你还没搭上人那条船呢。可是就是姐弟配啊!你以为呢,你比林澜小,你还想改档案啊?而且你想一想也知道没可能啊,你说林澜甩了杨建南投了你?别人还不以为林澜疯了啊?你一个中尉,每月各种补助加起来680块,房子是肯定没有,自己吃饱全家不饿,多一张嘴就不知道往哪里放了。”

  “我们不都是吃食堂么?”

  “我靠,你强!让林澜跟你一起吃食堂!”

  “现在怎么办?”

  “我靠,我说到现在你还不明白我的意思?我不是鼓励你勇敢上前再拼一把,我是说,大猪悠悠地说,”算了……”

  “算了……”我也说,低下头去。

  大猪默默地抽烟,一直抽到烟蒂,才恋恋不舍地扔在雨地。

  “可是……”我忽然抬起头来。

  大猪没有听我说下去,站了起来以他固有的潇洒拍了拍上的灰,走了。我抱着膝盖坐在那级台阶上,看着空无一人的南京西路,唯一一辆出租车亮着”强生”的牌子经过,车后卷起淡淡的雨雾。

  是啊是啊,杨建南什么都是很好的,他真的很配林澜,他们两个在一起那么协调,好像伏羲女娲,好像太阳月亮。我也相信他很喜欢林澜,我看见他和林澜并肩坐在中信泰富的员工食堂里吃饭,他掏出口袋里的餐巾纸为林澜把餐具——擦拭干净。林澜就拿着他擦干净了的勺子低头喝汤。他并不吃东西,只是侧头看着她,我都不敢想这个森冷得像是一块铁板的男人眼里能有那么多温情流露,足以滴滴答答地打落到台面上。

  我不知道该怎么做,如果林澜真的跟我在一起,我想那个铁板一样的男人也会很难过吧?他那么的喜欢林澜。

  可是……

  大猪都不听我说……

  可是……我只是想说……我也很喜欢林澜啊……

  笔记本的光驱在咔啦咔啦作响,像是随时会自己散架似的。

  “林澜,请你嫁给杨建南吧。”一个剃着板寸的兄弟站在南京西路和西康路的交接口,拿着一摞机票打折卡说,满脸春光灿烂。

  “林澜,请你嫁给杨建南吧。”一个大妈斩钉截铁地说,重重地把大扫帚往身边一搁。

  “林澜,请你嫁给杨建南吧。”一个扎蝴蝶结的小女孩说,舔了一口手里的麦芽糖。

  “林澜,请你嫁给杨建南吧。”

  “林澜,请你嫁给杨建南吧。”

  “林澜,请你嫁给杨建南吧。”

  我忽然站了起来,为什么他妈的每个人都这么说?要是有一把快刀在我手边我肯定一把把它拔出来,首先把面前这张桌子劈成柴火,连带着光盘笔记本一起。小时候看《三国演义》,说是孙权听了周瑜的说辞,站起来一把拔了佩剑当众斩下一个桌角,说再别劝我投降了,再劝的就跟这桌子一个下场!

  小时候不知道那是一种什么感觉,现在我忽然知道了。

  就是这种了!那种强烈的东西涌动起来,你一剑斩下一分两半一决雌雄!还说什么?他妈的都给我闭嘴!谁也不要再说下去了!

  孙权说:“老子要抗曹!”

  我说:“老子去找林澜!”

  “喂,看见林澜了么?”我瞪着眼睛问张皓,张皓正捧着一叠文件从30楼的大办公室往外面走,惊惶得把文件紧紧抱在胸口。

  “别挡了!我又不是要非礼你!”我把她手里的文件抢下来,”我帮你送,你告诉我林澜在哪里。”

  张皓一个劲儿地摇头。

  “那你自己送。”我又把文件仍还给她。

  “林澜在这儿么?”我一头冲进五楼的SPRCOFFE。

  一大帮子泡防御指挥部的技术员在里面围成圈儿喝咖啡,一个人正手忙脚乱的收拾扑克牌。

  “我靠,不是查你们打牌的——有人看见林澜么?”

  一群人一起摇头,只有一个女孩说:“刚才在员工食堂看见她了。”

  我大步流星闪进员工食堂,抓住我看见的第一个人问:“喂,看见林澜了么?”

  对方面带诧异,正提着一大桶几十斤泔水,不知道是厨房打杂的还是大师傅。

  “林澜?”那胖子擦了擦头上的油汗。

  “你认识我吧?”我指着自己的脸,”那个个子挺高,以前跟我们一起下来吃饭的女孩,开始头发大卷的,以后烫成拉直的那个!”

  “你搞糊涂啦?”对方不耐烦地推了我一把,”都快两点了,午饭时间过了,哪还有人在这里啊?”

  我往他背后看去,空荡荡的员工食堂。

  我跑出食堂的时候看见苏婉正一溜小跑从便利店里出来,拿着一块巧克力在我面前闪过。

  “喂!看见……”我说。

  “林澜是吧?”苏婉一边小跑一边扭头,”我没看见,我急着赶电梯,喂喂,帮我挡一下门!”

  我愣在那里,呆呆地,然后看见刚才打牌的一大帮子正从便利店里闪出来。

  每个人脸上都带着不怀好意的笑容。

  中信泰富广场真是大啊,这边的长青藤书店,那边的SPR COFFEE、一楼的KENZO、五楼的POSH LIFE、九楼的战备资料室、十一楼的总联络部、二十三楼的后勤总指挥部、三十楼的泡防御第一总控制室……我有点气喘吁吁了,可是哪里都没有林澜。

  最后我只好靠在电梯上喘息一下。

  电梯门开了,我愣了一下。这里是31楼,又不小心按错了,来到了原来的第一总控制室。而我把手伸出去格住了将要关闭的电梯门,我听见有人在外面哼着歌。

  我走了出去,转过几个弯子,悄无声息的站在林澜背后。她双手抱在怀里,哼着又一首我不知道的歌,面对着没有玻璃的巨大落地窗。风从外面吹进来,吹起她的头发。她哼着歌,鞋跟偶尔轻轻地敲打地面。这里真是阴沉,只有大片的光从窗口涌了进来,几乎要把她纤细的身形吞没。

  也不知道过了多久,林澜回头:“你怎么也上来了?”

  我说:“我……”

  真是见鬼,我心里嘀咕。遇上这个女人,一定是个劫数,我记得我大学时候可以为饭里的沙子跟食堂大师傅从门里揪打到门外,也算一个很直接的人。可是我每次遇见林澜,都是一个心情,无声无息的,很安静。我承认在过去很长的时间里我一直觉得这个女人的存在困扰我很厉害,可惜每次听到她的声音看到她的短信听见她走路时候低低地哼着歌,我的一切的躁动不安也就烟消云散。

  不管怎么样都好吧,只要这个女人还在我的生活里……

  “你今天不值班吧?”

  “不。”我摇头。

  “你不值班还不在宿舍里睡个懒觉?”她掉头向我走来,”我可累了大半天了。”

  她走过我身边的时候我忽然握住了她的手腕。也许是握得太用力了,她”啊”的一声喊了出来。

  “你干什么?”她瞪着握。

  “你要结婚了?”

  林澜愣了一下,那一瞬间我死死地盯着她的眼睛,我要从她的眼睛里面看出东西来,无论是阴谋暴露的不安还是凄凄惨惨的离别,无论是得意洋洋的炫耀还是走上不归路的遗憾。

  可是林澜都没有。她的瞳子很深却并不明亮,像是又一层雾把一切都盖住了。她侧头避开了我的视线:“消息传得那么快,你都知道了?”

  “连说都不说?”

  “定得也很急呗,建南他老爹说他已经升到上校了,也31了,该结婚了。建南就带着戒指来问我可以不可以。”林澜说,”你别握着我,你手又硬又冷。”

  我不说话,也不松手。

  林澜皱了皱眉毛,用另一只手上来想把我的手掰开。我把她另外一只手也抓住,眼睛眨也不眨地盯着她。林澜挣扎了一下,安静下来。

  她忽然发作了,瞪着眼睛对我大喊:“我今年夏天就要结婚了,你到底想要怎么样啊?”

  “我没有想要怎么样,我只是想问问,”我深深吸了口气,”真的非要结婚么?”

  这句话要是听在别人耳朵里一定以为我是疯了,不过我已经说了我想说的一切。

  “你发神经。”林澜说。

  “我只是想问问!”

  “你要问什么?”林澜冷笑,”你不是在乎我是不是结婚,只是在乎我跟谁结婚而已!”

  她这么说的时候真的是愤怒了,眼睛瞪得那么圆,像是一头发怒的母豹子。

  “你说得对!”

  我已经不能示弱了,我那局骰子已经揭开了盖子,不能再摇下去,现在剩下的只是横下心看着结果。

  “你要我怎么办?我是女人!女人啊!你们男人找很多女朋友是风流倜傥,我们女人找很多男人就是淫贱下流了!我有个男朋友他很好,喜欢我要娶我,我也想嫁给他,你要我怎么办?”

  “很好?什么叫很好?因为他是石家庄陆军学院毕业的?因为他是战斗英雄?他还是中校?哦,不是,已经是上校了!”

  林澜的脸忽然涨红了,她的嘴唇哆嗦着,哆嗦着,最后她猛地挣脱了我的双手推在我胸口上:“你去死吧!”

  我跌跌撞撞地退了几步。眼前忽然发花,也许是太疲惫了,也许是心律不齐的老毛病又犯了。

  “压DV还是我教你的……”我喃喃地说,感觉像是胸口里所有的热量被一下子抽走了,空旷冰凉。

  视野里是杂乱无章的几何线条,青紫色的一片。我听见那些遥远而又接近的声音:林澜,请你嫁给杨建南吧……请你嫁给杨建南吧……请你嫁给杨建南吧……我看了那个DV,我知道是林澜压制的,是杨建南拍的,林澜把它压制成了婚礼的纪念品。

  她真是笨,怎么也记不住那些参数和流程,我只好一次一次地重复,怎么切时间……调整参数……怎么合并音轨……最后我说这样吧,我告诉你步骤一步骤二步骤三,你无须知道每个参数是为什么这样调,你只需要一二三四五地做,于是林澜学会了。

  我想她趴在她的工作台上低声念叨着步骤一,步骤二,步骤三……一段一段地切出那些DV的高潮段落,拼接起来,像是天南地北千千万万的人同声说:

  林澜,请你嫁给杨建南吧。

  我忽然想起陈凯歌的《致命诱惑》,那是他去好莱坞导演的一部并没什么名气的小片,我在周三的半价档坐在电影院里看的。女主角爱上了英俊勇敢的登山运动员要离开她的同居男友,她回到租住的房子,男友——我记得是个庸碌的胖子——正翘着双腿看球赛。女人下了决心说我要离开你,男人站起来瞪大了眼睛一付不敢相信的样子。

  当他终于明白一切都无法挽回的时候,他咆哮着发作了说你为什么要离开我你这个婊子你这个愚蠢的女人你欺骗了我,而所有的话在女人面前像是撞上了无形的墙壁。最后他喃喃的说,你为什么要离开我,I bought you the subway ticket every weekend……

  I bought you the subway ticket every weekend,我帮你买了每周的地铁票。

  是不是太小气了一些?The subway ticket , just the one-dollar subway ticket……

  大猪在他的Blog里说,我最喜欢的三部电影是《搏击俱乐部》,因为它讲述了永存男人心中的愤怒;是《激情岁月》,因为它讲述了永存男人心中的飘离:是《离开拉斯维加斯》,因为它讲述了永存男人心中的无可奈何。

  我本事没有那么大,没有杨建南那么威风,没有他那么细心,没有他那么聪明能想到那么好的办法去求婚怎么办呢?可是……我真的已经很努力了啊。

  真委屈,像是一个小孩。

  她使劲瞪着我,唇线扯得紧紧的,像是受了责骂的小女孩,又像是愤怒了。我不知道她是要破口大骂还是要放声大哭。

  “对不起……对不起……”我说,我还能说什么呢?

  我忽然放大了声音:“对不起!”

  “早点说明白就好了……”我深深吸了一口气,掉头走了,跑到电梯那边使劲拍了下行的键。

  我背后传来脚步声,一扭头,看见林澜跟着过来,扶着门框站在十米外。

  “那我现在对你说,不要再来找我了。”她说得很轻,但是很坚决,我听不出她话里的语气。

  轻轻的一句话,像是一粒沙子,落地的声音,却像是打雷。我的脑袋里嗡嗡作响,一种像是从每个血细胞里伸出来的疲惫正在沿着我的血管流淌,我想坐下去好好休息一下。落幕了,终于落幕了。

  我站在那里,和她对视,电梯来了,”叮”的一声,我转过身走了进去。她并没有跟进来。

  我趴在冰冷的橱窗玻璃了,看那双带一点白色绒毛边的靴子。女店员从东侧开始慢慢的关闭整个商场的灯光,阴影慢慢地向着我逼近,她最后来到我的身边,用飞扬的眼角看着这个酒气醺醺的人,”喂,别看了,关门了!”

  “等会儿……等我……等我站起来。”

  她不由分说地把橱窗的灯光也关了:“快点!看你也是部队的,小心通知你们领导!”

  “部队的也是人啊,买东西不行啊?”我觉得脑袋真重,快要把脖子压断了。

  “你买什么?靴子?5700,就这一双了,还打八折,你买,你每月多少钱啊?”女店员从鼻孔里狠狠地喷出气来。

  “帮我包起来。”我把一张卡扔出去,”36的对吧?上次也是你跟我说的吧?”

  “信用卡啊?信用卡不给用的了。”女店员捏着卡狐疑。

  “不是,储蓄卡,我存的钱。”我的声音低落下去,”不过现在想不存了……”

  一会儿她提着纸袋出去,塞在我手里,把卡还给我,让我在一张小纸上签字。

  “送给女朋友啊?是要结婚么?”看着我离去,女店员在背后说。

  我像是被电了一下,回头恶狠狠地看她,目光凶险得可以杀死一头恐龙。

  醒来的时候我正躺在锦沧文华酒店11楼自己的房间。听见我的动静,首先闪现的是大猪的脸,而后是二猪的。

  大猪兴奋:“好歹算是醒了,否则你就是指挥部第一个醉死的人了。”

  二猪把一份东西塞到我手里:“来,看看!”

  我硬撑着瞪大眼睛,读着手里的那张纸。

  “尊敬的指挥部各位首长:

  “本人江洋,对于日前在指挥部办公地发生的酒后闹事行为经过深刻反省,做出如下检讨。

  “作为一名服务于国家,服务于人民的解放军预备役部队军官,我没有深刻理解自己的神圣职责,把个人的情绪凌驾于集体利益和国家安危之上,置组织纪律于不顾,无视领导和同事的信任,闯入泡防御指挥部大办公室,高声喧哗,借酒滋事,毁坏公物,侵害同事……

  “在此,我表示深切的检讨和最真挚的歉意,即使用忏悔二字,也无法形容此刻我内心的难过……”

  我按住胸口,喉咙里”呕”的一声。

  “不至于真那么大反应吧?”二猪拍着我的背。

  “胃里的东西没吐干净……不是你写的这个东西……”我干呕了几下,最终没吐出来。

  这是二猪写东西的结构章法,大猪是读书多而不能写,二猪是一贯情真意切字字刻苦,每次看他的检讨我都觉得这个人从灵魂上厌弃自己,期待一种阳光般的新生,不过下次他该犯错误的时候还是照犯不误。

  “我闯入指挥部大办公室了?”

  “没说的,你一脚踢开大门,一声大喝——鲁智深醉打山门也就跟你堪堪相媲美!”大猪很赞叹的样子。

  “毁坏公物?”

  “这个倒是小事,你拿了张皓的茶杯,以为是酒杯,狂灌了一口,像是碎杯为号刀斧手齐出的架势,一把把人杯子给砸了。”二猪说。

  “侵害同事?有么?我侵害谁了。”

  “就差写性骚扰了。你先跟苏婉热烈拥抱,然后按着人家的双肩非要人家坐下来听你说一句话,最后我们大家期待了你半天,你没有说出来就咣地倒下去了。”

  “苏婉……”我头大起来,要是欺负了张皓还好说,苏婉那个能唠叨……

  “高声喧哗这个也算一条啊?”我说。

  “问题是你喊的什么。”大猪悠悠地说。

  “我喊的什么?”

  “你说,”二猪低着头跟背课文似的,”让林澜去死吧……”

  我呆呆地坐着。

  “来,签个字!”二猪把笔塞到我手里。

  我晕晕乎乎地在检查上面签了我的名字,然后一头栽进枕头里。

十四

  “嗨,你听说没有?第一指挥部和第二指挥部就要搬到地下了,所以把我们放在这边,那边正在打包设备。是不是怕地面指挥部顶不住啊?”

  “头儿的事情,我们少管。再喝一杯。”大猪挥舞着咖啡壶。

  “饶了我们吧,真的不敢打盹了!”二猪苦着脸使劲摆手。

  “那再休息十分钟回去,无论如何撑过今夜!”

  大猪刚才泡了一壶苦得让人想吐的咖啡,逼着我和二猪一人灌了一杯,否则我们两个已经趴在工作台上睡死了。这是我们连续值班的第36个小时,前所未有的高强度工作。这里是设在金茂大厦第三指挥部,77楼,我们脚下是一度繁华锦绣的陆家嘴。我们三个打开了一扇玻璃吹着夜风,在封闭的屋子里坐久了,夜风中带着一股槐花般的清香。这种静馨反而让人更想睡去,偏偏身体里那股浓咖啡的咖啡因作怪,让脑神经似乎还有一根是绷紧的。

  上海泡防御指挥部有三个分部,中信泰富的第一指挥部,恒隆广场的第二指挥部,还有陆家嘴金茂大厦的第三指挥部。事实上这三个指挥部的职能都是一样的,不过是三个拷贝,一个出了问题,另外一个立刻可以补上。

  “出了问题”,是指”被摧毁”。

  如果像二猪说的,指挥部决定迁入本来已经很拥挤的地下工事,那么看来指挥部高层对于泡防御的态度里,担忧已经占了上风。不过大猪是对的,我们这些算泡泡的,管不得那么多的事情。

  远处隐隐约约的星辰闪耀,在我眼睛里一个变两个两个变四个……我响亮地扇了自己一个嘴巴。真是管用,脸上火辣辣的痛感瞬间就让人清醒了一些。我把已经凉了的最后一口咖啡灌了下去:“走!回去!”

  “你没事儿吧?”大猪跟着站了起来。

  “没事,这几天挺好的不是?”

  我真是觉得这些天过得还不错。

  其实也就是这样吧?这个世界上,无所谓谁不能没了谁。我开始觉得第三指挥部真是一个不错的地方,我看不见,于是也想不起……虽然我曾经一度觉得站起来就可以看见林澜坐在二十米外桌边的身影是那么重要……

  就让日子这么过下去吧,尽管有些不同了。很多年以后林澜也会变得眼皮下垂花甲黄昏,我和她对面走过,各自拎着一只菜篮在市场里买菜。到时候再想起很多年以前我们发神经一样的决裂,会不会觉得很可笑?

  “你别硬撑。”大猪拉了我一把。

  “真的没事。”我想甩开他。

  二猪也站了起来,发了几秒钟的呆,忽地也狠狠扇了自己一个嘴巴。

  “你也发神经?”大猪惊诧莫名地看着他。

  “我也发困而已……”二猪耷拉着脑袋。

  “这么点儿出息!”大猪作势要去拍他的脑袋。

  凄厉的警报声像是快刀一样切破了死沉沉的气氛,回旋的红光让人一瞬间把困倦和所有乱七八糟的东西都忘到爪哇去了。

  大猪的手停在半空中。

  我们三个愣了一瞬,然后像是三只抢食的野狗那样扑到各自的控制台边,刚刚扣上耳机,就听到耳机里面苏婉的声音:“各部门预备,各部门预备,175。45度,45千米,大量目标出现并急速逼近!”

  她现在坐在整个77层最核心的中央控制台前,被无数的服务器和电缆包围,我只能从那些铁格子的缝隙中看见她的手迅速在键盘上跳跃。她现在是协调员了,负责分配任务给不同的操作员。以前负责这项工作的是林澜。现在林澜留在了中信泰富的第一指挥部,有人说她很快就会调走,因为她就要结婚了……

  我高声骂了一句说:“他妈的,去死!”

  必须把那个在窗上写画的女人的影子赶出我的脑海,现在不是想到她的时候!整个指挥部里的每一个人都听到了我的声音,不过没有人管我,就在我骂那一嗓子的时候,第一道光流已经轰击在泡防御圈上了。

  “1号缺损,缺损度48%,危险级别B+,13号、15号操作员执行修复。”

  “明白。”我和大猪的声音同时出现在公共频道里。

  我是15号,大猪是13号。

  “2号缺损,缺损度36%,危险级别C,7号、9号执行修复。”

  “3号缺损,缺损度72%,危险级别A,4号、17号、23号、24号执行修复。”

  ……

  我看着屏幕一角我的心跳频率在急速地升高,心电图和脑电图的波纹剧烈地震荡,肾上腺素的水平已经飘红。我的全身肌肉像是无数扯紧的弓弦,每按动一个按键是一次发射,随后立即再次扯紧。其他的人也都一样。如果这间屋子里有人现在没戴着耳机,会听见无数敲击键盘的声音混合在一起,像是千万只蚂蚁搬家的声音被无数倍放大后的效果。

  这是一次大规模的进攻,雷达上显示至少有30艘以上的次级母舰集中在175度角的方位,但实际数目应该远不止这些,有一些次级母舰具备和月球轨道上那东西一样的全隐身效果,例如上次那艘巨无霸,直到它发射,我们才知道它在那里。

  好在不同于上次在南浦大桥边,第一指挥部的精英技术员目前都在这里,大猪二猪和我都对技术很自负,整个泡防御界面的能量流还算稳定,技术员们均匀地抽提了其他区块的能量,像是一群拆东墙补西墙的高手。

  我偷空向窗外看了一眼,紫色的光流溃散之后向着四周飞速流溢,最后溅落在泡防御圈外面的土地上,爆发出沉雷一样的轰鸣。

  “准备迎接高强度冲击,倒计时10秒!”苏婉的声音在耳机里冷硬得像个男人,没法想象她在电话里大喊说江洋江洋快点出兵来帮我时的语气。

  我的思维被扯了回来,雷达上还是在175度的方位,一个强大到不可思议的能量高点开始闪烁。

  “见鬼!”我说。

  “又来了!不要在公共频道里骂街!”大猪说。

  真给我猜中了,那群次级母舰中藏着一个大家伙,它一直在等待时机。

  “9!8!7!”苏婉不管我们。

  “局部能量反应开始升高!”

  “函数流系统正常!”

  “6!5!4!”

  “弹性防御开启!”

  “后备能源储备完毕!”

  “3!2!1!”

  我迅速调出那张马鞍形状的泡防御界面能量图,就像第一次那样,一个尖刺形的突起迅速出现,而不同的是,迅速有其他区块的能量流过来补充,整个泡防御界面的能量流动图上像是出现了一个巨大的漩涡,在不断地吸纳着周围的海水。

  “蓝海战术”!奏效了!

  这是新的战术,把拆东墙补西墙的技术发挥到了极致,但是也是极危险的战术。当我们抽提其他区块能量去对抗光流的时候,天知道多少个空洞同时出现在天空里,原本铜墙铁壁一样的泡防御界面像是一张筛子。

  “危险解除!”苏婉说。

  马鞍上的尖刺迅速下降,能量开始回流到其他区块去。根据上次的经验,距离那个巨无霸下次开火还有至少一分钟。好歹可以喘口气了。

  我喘着粗气靠在椅背上,我的心跳频率还是居高不下,胸膛里像是在打鼓。

  “江洋你的身体状态报出危险了,休息一下。”苏婉说。

  我没有拒绝的余地,她掐断了我工作台上的电源,我被强制进入休息。我站起来,觉得有点头晕,跌跌撞撞地走了几步,想出去呼吸一点儿新鲜空气。

  我愣了一下,一滴水滴在我面前的地上,化纤的地毯上冒起一缕淡淡的青烟。

  我往后退了几步。这个场景太熟悉了,让我忽然间有种极度不祥的预感。我抬头看着天花板,那里有一小块湿迹,不过是指甲盖那么大,一滴水挂在上面,淡淡的有点黄绿色。它再次滴落,滴在刚才的位置,那里已经黑了,泛着一股淡淡的焦糊味道。

  湿迹扩大起来,越来越快,很快它变得有拳头那么大了,然后像是花盆大小,然后像是水缸,然后……头顶传来似乎很远又似乎近在眼前的”空空”声。我在喉咙里低低地吼了一声,我从来都不敢想象自己发出那样野兽般的恐惧的低吼。

  “闪开!”我对着周围咆哮。

  可是没有人看我,这帮疯子已经完全进入了工作状态,他们的耳机也足以隔绝一切声音,这见鬼的新型耳机!只有中控台的苏婉看见了我的异状,我拼命地对她挥手,她急忙去摘耳机。

  可是已经来不及了,我扑出去把身边的大猪抓起来。他受惊了,推着我的胸口想要抗拒。我二话不说一个嘴巴抽在他脸上,把他的耳机扯掉,用尽全力把他推到了一边去。

  大猪是我唯一来得及救的人,那块湿迹开始塌陷了。我紧跟着猛扑出去,带着大片的灰尘,天花板崩溃,一个像是巨型蟑螂有着花岗岩皮肤的玩意儿落在地板上,挥舞的触手瞬间套住了周围工作台上的几个操作员。熟悉的场景再次出现,触手抽紧,男人的胸膛塌陷下去,甚至来不及哼一声。

  捕食者!

  刚才的蓝海战术中出现了孔洞,这东西穿过孔洞,降落地点是金茂大厦的上方。它在短短的几十秒内凿通了几十层楼板,直接侵入了泡防御指挥部的控制中心。

  这只捕食者出奇的小,形状看起来更像是一只大章鱼,根本像是为这次突袭度身定做的。它头部硕大的眼睛开合了一次,确认了周围的环境,闪电般地蠕动着前进。确实是蠕动着前进的,可是快得像是眼镜蛇的进攻,一个操作员想要闪开,可是擦身而过的瞬间,他忽然断成了两截!

  我看着那一地的鲜血,想到了那东西的”脚趾甲”。

  它所到之处所有人都尖叫着逃离,它几乎没有遭遇任何阻碍,直扑中央控制台的苏婉。有个操作员想要阻拦它,手里没有东西,只好举起显示器砸了出去。可是这东西就像是武林高手接飞镖一样,一根触手扬起,轻松地卷住了显示器,显示器便像块豆腐那样分崩离析。苏婉的脸上惨无人色,她也想要逃走。可是已经来不及,她被围在几排服务器中间,只有一个狭窄的出口,而那个出口前已经有一条触手横在那里了。触手搭着左右的铁支架,只是稍微抽紧,就把铁架拉弯了。如今这些支撑服务器的架子像是一个牢笼彻底困住了苏婉。

  被推倒的工作台边闪着耀眼的电火花,捕食者经过的地面上洇着大片的血迹。它把触手全部投了出去,搭在了那组服务器铁架上。苏婉死死地靠在背后的墙上看着对她缓缓睁开的绿色眼睛。我爬起来抄起一张椅子想冲上去。

  “别傻了!你救不了她的!”大猪一把扯住我。

  忽然整个办公室安静下来了。

  捕食者忽然停下,保持着挥舞触手进攻的姿态,却并未继续推进,像是一部电影放映中被卡死了。办公室里回荡着大家惊惶的喘息声,还有嗡嗡的风扇声……风扇声?为什么会有那么大的风扇声?我觉得有什么更加可怕的事情即将发生。我大着胆子站起来,看见所有服务器的绿灯都快速地闪动起来,它们的风扇全部开动,像是满负荷运算的样子。

  “我操他妈的!这个东西在读硬盘!”大猪忽然吼了一嗓子。

  我哆嗦了一下,心里透亮。这东西不是为了杀我们而来,它是为了泡防御发生器,它要阿尔法文明留下的某些东西!

  二猪飞起一脚踢碎了消防窗口的玻璃,抄出两柄消防斧一柄扔给我,举起一柄豁尽全力砍向一根触手。消防斧,我们要是去好莱坞,定能胜任电锯狂魔这类角色。不过已经没有时间顾形象了,我掂了掂斧头,扑上去全力砍在另外一根触手上,它丑陋粗糙的尖端刚刚搭上一台服务器,立刻粘上了,迅速生出新的粉红色的肉质触手,像是婴儿的手指,又像是海葵。而这些看似幼嫩的触手释放出了无数细丝,细得肉眼几乎无法分辨。那些细丝仿佛蛛丝一样迅速地包裹了服务器,从电子元件和通风口的缝隙钻了进去。

  像是砍中了橡皮,消防斧被弹开,触手上留下了二十厘米长的缺口,浓腥的气味扑面而来,黄绿色的液体飞溅。我跳起来闪过,那些液体落地冒着白烟,带着”滋滋”的声音腐蚀着化纤地毯。我再看消防斧,已经没有刃口了!

  又是一个变种的捕食者,和我们上次遭遇的那只不同,它的整个肢体里面估计都是这种可怖的酸液,用来保护它自己免受伤害。

  惨叫声从我背后传来。我猛地回头,看见一个操作员抱着头在那里转圈,把消防斧扔下。他满脸都是黄绿色的黏液,身边有一根被斩断的小触手,正扭动着喷洒酸液。那个兄弟转了两圈趴在墙壁上,再也不动了,很快,他的脖子一弯,头掉落下来,滚动着露出了白骨。

  这样强的酸液……绝不是上次那个东西可比的。

  “别愣着!”大猪大吼,”不能砍它,就砍服务器!”

  我们忽然清醒过来。我和二猪一起扑向了周围。首先敲碎了工作台旁的机箱。这些计算机里面同样存储了海量的泡防御圈资料,我一斧头劈开机箱,跟上一斧头把硬盘砍成两半。二猪的操作跟我也差不多,周围的人也纷纷踢翻自己周围的计算机,举起椅子往机箱上砸。

  一斧子劈开机箱,一斧子敲掉硬盘;再一斧子劈开机箱,再一斧子敲掉硬盘;我机械地操作着,像是一个忘我的樵夫。我们在跟那个捕食者抢时间,多一秒钟就能抢回很多资料,最电子化的资料要用最原始野蛮的方式来抢夺,科学技术还真是跟我们开了一个大玩笑。

  “犯混啊你们!”大猪推了我一把,”用得着那么费劲么?砍掉电源就可以,那玩意儿还自带电源不成?”

  “废话!它当然自带电源!你自己看看那边的服务器!”我指着中央控制台。苏婉站在最核心的区域,手里拿着拔下的主电源插头。而所有的服务器硬盘的绿灯还在发疯一样狂闪。

  “见鬼,还是个电鳗!”

  “庆幸吧,多亏不是巨型计算机,读盘速度有限!”我砍开了下一张硬盘。

  金茂大厦这边因为军用设备来不及到位,操作中心是基于UNIX系统和民用服务器的,硬盘读取速度只有7200转每秒,否则这个东西抽提信息的速度会增加到十倍以上。不过即便这样,我们也不知道还剩下多少时间。而砍完了这些工作台上的硬盘,服务器上的硬盘又怎么办?

  我拍了拍脑袋,抽出手机来:“蒋黎!77楼呼叫支援!它们在攻击服务器!远程武器!我们需要远程武器!”

  “我们被困在电梯里了!有什么东西控制了电梯!等我们把门弄开!”蒋黎的声音显得气喘吁吁的。

  “砸开撬开炸开!得快!中央控制台快要保不住了!”

  “苏婉怎么样?”

  我愣了一下:“现在还没事!”

  蒋黎挂断了电话。    一阵密集的枪声,无数弹孔出现在办公室的门上,有人一脚踢开了大门,冲进来的都是黑色军服的特别宪兵,蒋黎冲在最前面。

  “怎么那么慢?”我跳了起来。

  “还有一只堵在电梯门口,我们出不来。”

  “还有一只?搞定了?”

<