标题:IAT HOOK [Rootkis基础入门]
只看楼主
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
已结贴  问题点数:20 回复次数:5 
IAT HOOK [Rootkis基础入门]

如上图,[随手画的,可能不对,以我理解解释一下]
PE文件给加载到内存后FirstThunk指向真实的函数地址,即是IAT[导入地址表]
HOOK IAT就是要把IAT里的函数地址换为自己的函数地址。
我这里假设的是OriginalFirstThunk是存在的,[听说有些PE格式构建是把OriginalFirstThuk清零的]
;;;;;;;;;;;
先查找导入表结构中是否有user32.dll这个,若是找到,再在OriginalFirstThuk里查找是否有想要HOOK的函数
若找到了,就替换自己的函数地址
这里FirstThuk里的函数序号是与OriginalFirstThuk里的是一样的。


上代码,程序看附件。[写好就没改了,代码很差,入门的兄弟可以看看,高手指点下。]
程序代码:
;IAT HOOK
;onepc 153785587
;ml /c /coff dll.asm
;Link  /subsystem:windows /Dll /Def:dll.def dll.obj ;/section:.bss,S
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include shell32.inc
includelib shell32.lib

.data
szTitle db 'Hook',0
szConten db 'Hook MessageBox OK',0
szMesg db 'MessageBoxA',0
szDll db 'user32.dll',0
szWZ db 'http://bbs.',0
szFmatN db '%08x',0
szFmat db '%s',0
.data?
hModule dd ?
hdllModule dd ?
;oldFunAddr dd ?;旧函数地址
newFunAddr dd ?;新函数地址
dwNum dd ?
dwoldAccess dd ?
dwNewAccess dd ?
dwFirstuck dd ?
dwProcess dd ?
szBuffer db 250 dup (?)
.code
_MyHookFun proc
pop eax
add esp,10h
push eax
invoke ShellExecute,0,0,addr szWZ,0,0,SW_NORMAL
ret
_MyHookFun endp

;;;;;;;;;;;;;;;;;;;;;;;;;;
_SetApiHook proc
        invoke GetModuleHandle,NULL ;得到的是exe进程的实例句柄
;                                   pushad
;                                   invoke wsprintf,addr szBuffer,addr szFmat,eax
;                                   invoke MessageBox,NULL,addr szBuffer,addr szConten,0
;                                 popad
        mov hModule,eax
        mov esi,eax
        assume esi:ptr IMAGE_DOS_HEADER
        add esi,[esi].e_lfanew
        assume esi:ptr IMAGE_NT_HEADERS
        mov ebx,[esi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
        add ebx,hModule;RVA+hModule=在内存的实际地址
        mov esi,ebx ;指向内存中的导入表地址
        assume esi:ptr IMAGE_IMPORT_DESCRIPTOR
    .while [esi].OriginalFirstThunk || [esi].TimeDateStamp || [esi].ForwarderChain || [esi].FirstThunk || [esi].Name1
          mov edi,[esi].Name1 ;指向DLL NAME 的RVA
          add edi,hModule ;在内存中实际的地址
          invoke lstrcmpi,edi,addr szDll ;比较不区分大小写 返回0表示相等
          .if !eax ;表示找到dll文件
;                                   pushad
;                                   invoke wsprintf,addr szBuffer,addr szFmat,edi
;                                   invoke MessageBox,NULL,addr szBuffer,addr szConten,0
;                                 popad
                  mov edx,hModule
               add edx,[esi].FirstThunk ;在内存中找到dll这个结构的,指向真实的函数入口地址。[FirstThunk偏移+内存地址]
               mov dwFirstuck,edx ;第一个地址
;               cmp [esi].OriginalFirstThunk,0
;               jz _exit
                    mov edi,hModule
               add edi,[esi].OriginalFirstThunk ;指向IMAGE_THUNK_DATA结构数组[OriginalFirstThunk没有给清零的话]
               mov dwNum,0
               .while DWORD PTR [edi]!=0 
                   .if DWORD ptr [edi] & 80000000h ;当双字最高位为0时[表示函数以字符串类型的函数名方式导入],这时低位是一个RVA指向IMAGE_IMPORT_BY_NAME
                           inc dwNum ;计数加1
                   .else
                           inc dwNum ;计数加1
                           mov ebx,hModule
                           add ebx,DWORD PTR [edi] ;edi是一个RVA值
                           assume ebx:ptr IMAGE_IMPORT_BY_NAME
                           invoke lstrcmpi,addr [ebx].Name1,addr szMesg 
                               .if !eax ;找到相等的函数
;                                   pushad
;                                   invoke wsprintf,addr szBuffer,addr szFmat,addr [ebx].Name1
;                                   invoke MessageBox,NULL,addr szBuffer,addr szConten,0
;                                 popad
;                                   pushad
;                                   invoke wsprintf,addr szBuffer,addr szFmatN,dwNum
;                                   invoke MessageBox,NULL,addr szBuffer,addr szConten,0
;                                 popad
                                       mov eax,dwNum
                                       dec eax
                                       mov ecx,4
                                       mul ecx
                                       mov edx,dwFirstuck
                                       add edx,eax ;序号与OriginalFirstThunk相同
;                                   pushad
;                                   invoke wsprintf,addr szBuffer,addr szFmatN,edx
;                                   invoke MessageBox,NULL,addr szBuffer,addr szConten,0
;                                 popad    
                                       mov dwFirstuck,edx
                                       invoke VirtualProtect,edx, sizeof DWORD, PAGE_WRITECOPY, addr dwoldAccess;设为可写
                                     
                                       invoke GetCurrentProcess;当前进程伪句柄,需要当前进程的时候可以用
                                       mov dwProcess,eax
                                       mov edx,dwFirstuck
                                       mov eax,offset _MyHookFun
                                       mov newFunAddr,eax
                                       invoke WriteProcessMemory,dwProcess,edx,addr newFunAddr,sizeof DWORD,NULL                                      
                                        mov edx,dwFirstuck                                      
                                        invoke VirtualProtect,edx, sizeof DWORD, dwoldAccess, addr dwNewAccess; 恢复之前的访问属性 
                                            jmp _exit
                               .endif            
                   .endif
                   add edi,4              
               .endw
               jmp _exit
          .endif
          add esi,sizeof IMAGE_IMPORT_DESCRIPTOR ;指向下个结构
   .endw 
_exit:   
ret
assume esi:nothing
_SetApiHook endp




DLLEntry proc  _hInstance,_dwReason,_dwReserved ;_hInstance动态链接库的实例句柄
        local    @dwThreadID
mov eax,_dwReason
.if eax ==  DLL_PROCESS_ATTACH
        push _hInstance
        pop hdllModule ;保存DLL的句柄
            invoke    CreateThread,NULL,0,offset _SetApiHook,NULL,\
                NULL,addr @dwThreadID 
            invoke    CloseHandle,eax
.endif
mov eax,TRUE ;
ret
DLLEntry endp

End DLLEntry

HookIAT.rar (12.66 KB)
收到的鲜花
  • zklhp2010-01-01 20:07 送鲜花  49朵   附言:我很赞同
搜索更多相关主题的帖子: 入门 基础 Rootkis HOOK IAT 
2009-12-31 09:17
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:20 
学习。
onepc版主学习的劲头真让人羡慕。。。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-01-01 18:30
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
得分:0 
上个月看了一个月驱动开发详解,正在看rootkits[内核要用到驱动方面的],顺便复习下pe。
2010-01-01 19:16
s912360101
Rank: 3Rank: 3
来 自:山西
等 级:论坛游侠
帖 子:168
专家分:147
注 册:2009-3-15
得分:0 
强。虽然不是学c的。但是牛。。

孤独是一个人的狂欢
2010-02-11 23:50
cgy1989
Rank: 2
等 级:论坛游民
帖 子:4
专家分:17
注 册:2009-8-12
得分:0 
下学期开始学汇编。。。。。
2010-02-15 00:40
hwbcs
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-7-9
得分:0 
厉害 学习了
2010-12-26 22:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-294690-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037763 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved