WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:1290回复:4

问个问题,

楼主#
更多 发布于:2007-06-18 14:26
问个问题:
有个函数A:它的内容是这样的
FuncA:
....
PUSH x
Call FuncB
....
retn
然后函数FuncB,又有如下内容:
FuncB:
....
Call FuncC
...
retn
其中FuncA的地址是已知的,FunC的代码我可以自行修改
如何在FunC里得到FuncB的地址呢?
由于函数代码比较变态,不能进行函数地址线形搜索

我现在用的办法是从堆栈中搜索Push的X和Call B的返回地址
找到后再取B的地址

但有个问题,FuncA可能被其他软件HOOK了
那么就会先过其他软件,其他软件的代码中可能同样有Call FuncB及PUSH x的地方,这会导致我找到错误的地址

各位有什么办法解决吗?
驱动开发者 呵呵
rhettxie
驱动牛犊
驱动牛犊
  • 注册日期2004-10-27
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望65点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-18 14:41
hook 过也没关系吧, 莫非别人的hook里FuncB的地址是错的 ?
静水流深
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-06-18 14:47
是这样的,别人HOOK了A之后
可能例如这样:
NewFuncA:
....
Call FuncD
....
...
Call OldFuncA
...
retn
然后
FuncD:
.....
push x
call FuncE
...
retn
FuncE:
....
Call FuncC
...
retn

这样导致的结果就是
我Call FuncA(实际是Call NewFuncA)->FuncD->FuncE->FuncC(这里我向上搜索地址,结果搜索到
push X
call FunE
搜索到错误的FuncE
而实际的往下走才能得到
OldFuncA->FuncB->FunC
而得到最终正确的结果

而我不知道NewFunC究竟何时才会调用OldFuncA,所以比较郁闷
楼上有什么好办法吗?
驱动开发者 呵呵
rhettxie
驱动牛犊
驱动牛犊
  • 注册日期2004-10-27
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望65点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-18 15:01
funcB 里call funcC,  funcC 你可以控制是吧?

那你在funcC里面用 ebp+4 取得返回地址, 这个地址在funcB 里,你向上搜索,找到
mov edi,edi , push ebp, mov ebp,esp 之类的应该就是funcB的函数头了吧。

ps:我瞎说的,你那call来call去的让我挺晕的
静水流深
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-06-18 16:05
是这样的,FUNCB是ntoskrnl里的一个函数,微软的编译器比较古怪
FuncB有时候是这样的:
xxxx:
....
call Func..

jmp zzzzz
FuncB:
.....
....
Jnz xxxx
jmp ddddd
zzzz:
....

也就是说FuncB的代码不是连续的。。。
而FUNC在FUNCB的上面。。。
所以没法简单通过搜索特征的办法找到FUNCB的开头。。
驱动开发者 呵呵
游客

返回顶部