我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: [求助]内核补丁中的函数调用方法 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ book /buk/ n. 书本,书籍,手册,卷,册;vt. 预定(票、座位等) ]


[求助]内核补丁中的函数调用方法

本帖被 zhd32 执行提前操作(2007-11-26)
用户态的补丁或者注入如果要调用API的话,一般就是先定位Kernel32的基址(请教各位高手关于注入代码定位kernel32基址的好方法),然后根据导出表找LoadLibrary和GetProcAddress,然后就可以为所欲为。

那么内核态中的驱动补丁有没有类似的方法呢?

有同学告诉我在内核中可以直接调用SSDT,那具体做法又是怎样做呢?
顶端 Posted: 2007-11-24 20:54 | [楼 主]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ immune /i'mjun/ a. 免除的,不受影响的,免疫的;n. 免疫者 ]


其实我对这方面也只是一知半解~
顶端 Posted: 2007-11-24 23:47 | [1 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ exclusive /iks'klu:siv/ a. 排外的,排斥的,独占的,专有的,排它的 ]


刚才看书,谈到了获取Kernel32基址的办法,它说了两个
(1)
每个进程都是被Kernel32.CreateProcess调用得来的,所以程序开始执行的时候栈顶中的返回地址是属于Kernel32的,得到这个地址再向上找PE文件头再根据导出表找函数。
(2)
同一版本的Windows操作系统,Kernel32模块的地址是固定的,Win XP为0x77E60000。

不过我觉得这两个都不是好办法。
第(1)个,有一个前提条件是注入的代码必须要在原程序开始执行之前运行。
第(2)个,对于这个方法我只能无语了……


我印象中在看雪看过一个用SEH获得Kernel32基址的办法的……可以在任何时候任何系统版本获取
顶端 Posted: 2007-11-25 14:43 | [2 楼]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ motorway /'məutəwei/ n. 高速公路,快车道 ]


终于找到了两个好方法
分别是扫描SEH和从PEB中读取

Quote:

【文章标题】: 反--反转存和非侵入性[屏蔽](上)
【文章作者】: deroko/ARTeam;译者:kkbing/看雪论坛
【作者声明】: 此文时看雪老大从ARETeam移入,见其有些价值拿来翻译。其中存在很多不足甚至是错误的地方,欢迎批评指正。特别感谢aalloverred 的指正

…………
…………
…………

  2.2 重新得到 kernel32.dll 基址和 APIs
  对于自定位代码来说,下一个重要的问题就是在Win32环境下调用APIs。为了能这样做,我们需要定位kernel32.dll的基址。以下是一些我们可以完成它的方法。
  -扫描 SEH
  -由Ratter/29a 提供的 PEB 技巧
  -获得硬编码。(译者注:比如Win2k下一般是77e60000h,WinXP SP1
            是77e40000h,SP2是7c800000h等。但是这么做不具有通用性)
  扫描 SEH---首先我们需要知道描述的SEH(结构化异常处理)的数据结构表
  kd> dt nt!_EXCEPTION_REGISTRATION_RECORD
  +0x000 Next      : 前一个 _EXCEPTION_REGISTRATION_RECORD结构
  +0x004 Handler    : 异常处理回调函数地址
  kd>
  (译者注:这是windbg中的命令,用来获取结构的信息,很实用)
 
  任何SEH链将会赋予一个指向kernel32.dll中某个值的句柄,当然,如果这是最后一个EXCEPTION_REGISTRATION_RECORD,那么_EXCEPTION_REGISTRATION_RECORD 结构的第一个参数名将被置为-1,这样我们就知道何时在kernel32.dll中获取地址了
 
  getkernelbase:
                  pushad
                  xor edx, edx
                  mov esi, dword ptr FS:[edx]
  __seh:        lodsd
                  cmp eax, 0FFFFFFFFh
                  je __kernel
                  mov esi, eax
                  jmp __seh
  __kernel:      mov edi, dword ptr[esi + 4]
                  and edi, 0FFFF0000h
  __spin:        cmp word ptr[edi], 'ZM'
                  jz __test_pe
                  sub edi, 10000h
                  jmp __spin
  __test_pe:      mov ebx, edi
                  add ebx, [ebx.MZ_lfanew]
                  cmp word ptr[ebx],'EP'
                  je __exit_k32
                  sub edi, 10000h
                  jmp __spin
  __exit_k32:    mov [esp.Pushad_eax], edi
                  popad
                  ret
 
  这个代码并不是最优化的,但是它展示了逻辑。扫描SHE直到这里等于-1,简单的获得句柄的地址和搜索MZ与PE符号。一旦我们找到了他们,我们就获了kernel32.dll的地址。
  PEB 方法---这个方法是由Ratter/29a发现和提出的,我会给出例子,但是要想获得更多的解释请回到[2](译者注:应指的是文后参考文献[2],也可以参见http://www.nsfocus.net/index.php?act=magazine&do=view&mid=2002)
 
  mov eax, dword ptr FS:[30h]
  mov eax, dword ptr[eax+0ch]
  mov eax, dword ptr[eax+1ch]
  mov eax, dword ptr[eax]
  mov eax, [eax+8]
 
  首先我们找回PEB的值,接着找到PEB_LDR_DATA,随后我们就进入到InInitializationOrderModuleList,头一个LIST_ENTRY指向ntdll.dll ,再进入下一个表的入口,瞧,kernel32.dll 的基址我们就接收到了。
 
  获得装入时硬编码的值----这个非常简单,并不需要太多的知识,我们用GetModuleHandleA去重新获得kernel32.dll的值并储存到偏移值中。
  例码:
            pushs <"kernel32.dll">
            call GetModuleHandleA
            mov kernel32, eax
  loader:
  ...
  kernel32  dd  ?


…………
…………


引自  http://bbs.pediy.com/showthread.php?threadid=25001
顶端 Posted: 2007-11-26 12:38 | [3 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.031328(s) query 6, Time now is:11-22 15:45, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号