GetKernelBase代码收集

一、
        GetKernelBase proc _KernelRet  ;寻找kernel32.dll的基址
          local @dwReturn
         pushad
         FlowerKey         ;用花指令干扰静态反汇编
         mov @dwReturn,0
         mov edi,dword ptr _KernelRet 
       and edi,0ffff0000h
      LoopFindKen:
       cmp word ptr [edi],IMAGE_DOS_SIGNATURE
       jnz ErrPage
       mov esi,edi
       add esi,[esi + 003ch]
       cmp word ptr [esi],IMAGE_NT_SIGNATURE
       jnz ErrPage
       mov dword ptr @dwReturn,edi
       jmp FindKenOk
      ErrPage:
       sub edi,010000h
       cmp edi,070000000h
       jnz LoopFindKen
       mov dword ptr @dwReturn,0BFF00000h ;赋予默认的9x基址
      FindKenOk:
       popad
       mov eax,@dwReturn
       ret
        GetKernelBase endp
 
二、
GetKernelBase   proc uses esi edi dwKernelRet:DWORD
  LOCAL dwReturn: DWORD
  mov edi, dwKernelRet                ; edi = 堆栈顶
  and edi, 0ffff0000h                 ; 用 AND 获得初始页
  .while TRUE
      .if word ptr [edi] == IMAGE_DOS_SIGNATURE       ; 等于“MZ”吗?
          mov esi, edi                                ; Yes, next...
          add esi, [esi + IMAGE_DOS_HEADER.e_lfanew]  ; 就是 esi + 3ch
          .if word ptr [esi] == IMAGE_NT_SIGNATURE    ; 等于“PE”吗?
              mov dwReturn, edi                       ; Yes, we got it.
              .break
          .endif
      .endif
      ;以下等同于sub edi, 010000h,即每次减少64k:
      dec edi
      xor di, di
      .break  .if edi < 070000000h    ; 基地址一般不可能小于70000000h
  .endw
  mov eax, dwReturn
  ret
GetKernelBase   endp

你可能感兴趣的:(代码,职场,收集,休闲,GetKernelBase)