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

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

yinx



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

5come5帮你背单词 [ hometown // n. 家乡 ]


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

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

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

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



性别: 帅哥 状态: 该用户目前不在线
等级: 版主
家族: YD一族
发贴: 619
威望: 0
浮云: 543
在线等级:
注册时间: 2006-04-22
最后登陆: 2009-06-22

5come5帮你背单词 [ gum /gΛm/ n. 口香糖 ]


驱动层的东西不懂了
顶端 Posted: 2007-11-24 21:59 | [1 楼]
ljpdxj



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 687
威望: 0
浮云: 1108
在线等级:
注册时间: 2006-02-28
最后登陆: 2008-06-29

5come5帮你背单词 [ control /kən'trəul/ vt. 控制,抑制,支配 ]


偶落伍了......也没有学习那么深入
顶端 Posted: 2007-11-24 23:22 | [2 楼]
wsdd



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1078
威望: 0
浮云: 1105
在线等级:
注册时间: 2006-11-02
最后登陆: 2009-06-10

5come5帮你背单词 [ compress /kəm'pres/ vt. 压缩,浓缩 ]


这是程序员六大境界之三呀........此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。

水平还没那么高哇..
顶端 Posted: 2007-11-24 23:27 | [3 楼]
yinx



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

5come5帮你背单词 [ kneel /ni:l/ vi. 跪(下) ]


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



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ soluble /'soljubl/ a. 可溶的,可以解决的 ]


这个级别很强
顶端 Posted: 2007-11-25 14:29 | [5 楼]
yinx



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

5come5帮你背单词 [ minute /'minit, mai'nju:t/ B n. 分,分钟,一会儿,片刻,(pl.)会议记录 ]


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

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


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



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

5come5帮你背单词 [ tolerant /'tolərənt/ a. 忍受的,容忍的,宽容的 ]


终于找到了两个好方法
分别是扫描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 | [7 楼]
disneycheng



性别: 帅哥 状态: 该用户目前不在线
头衔: Piano Prince
等级: 荣誉会员
发贴: 1971
威望: 1
浮云: 413
在线等级:
注册时间: 2005-12-16
最后登陆: 2008-06-29

5come5帮你背单词 [ superficial /sju:pə'fiəl/ a. 表面的,肤浅的,浅薄的 ]


其实核心和用户差不了多少的~很多都很相似~~
顶端 Posted: 2007-11-28 23:02 | [8 楼]
takemeon



性别: 帅哥 状态: 该用户目前不在线
头衔: 辰龍
等级: 荣誉会员
发贴: 36205
威望: 2
浮云: 280
在线等级:
注册时间: 2006-11-11
最后登陆: 2011-11-07

5come5帮你背单词 [ payment /'peimənt/ n. 支付,支付的款项 ]


  竟然有硬件的编程  不懂啊 就是看着象
顶端 Posted: 2007-11-28 23:09 | [9 楼]
我来我网·5come5 Forum » 程序员之家

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