阅读:1290回复:4
问个问题,
问个问题:
有个函数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的地方,这会导致我找到错误的地址 各位有什么办法解决吗? |
|
|
沙发#
发布于:2007-06-18 14:41
hook 过也没关系吧, 莫非别人的hook里FuncB的地址是错的 ?
|
|
|
板凳#
发布于: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,所以比较郁闷 楼上有什么好办法吗? |
|
|
地板#
发布于: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去的让我挺晕的 |
|
|
地下室#
发布于:2007-06-18 16:05
是这样的,FUNCB是ntoskrnl里的一个函数,微软的编译器比较古怪
FuncB有时候是这样的: xxxx: .... call Func.. jmp zzzzz FuncB: ..... .... Jnz xxxx jmp ddddd zzzz: .... 也就是说FuncB的代码不是连续的。。。 而FUNC在FUNCB的上面。。。 所以没法简单通过搜索特征的办法找到FUNCB的开头。。 |
|
|