WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:1296回复: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的地方,这会导致我找到错误的地址

各位有什么办法解决吗?
驱动开发者 呵呵
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,所以比较郁闷
楼上有什么好办法吗?
驱动开发者 呵呵
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的开头。。
驱动开发者 呵呵
游客

返回顶部