我想知道如何手动执行附加应用程序中存在的函数?我到处搜索,找不到任何有用的词。在IDA Pro中,它叫做appCall,那对于olly来说是什么等同的呢?
答案 0 :(得分:3)
手动调用任何函数等同于组装函数调用inplace
假设您在ollydbg下运行calc.exe
内部函数SetBox(< x>,< y>)在科学模式的inv和hyp复选框中设置复选标记
< x>可以有两个值设置== 1和未设置== 0
< y> == CheckBox的Id,您已确定Id为0x8c和0x8d
你还确定这个函数是__stdcall
假设您想要手动调用此函数并想要设置id为0x8c的复选框,您需要做的就是找到一个位置并汇编以下序列并执行它们
push 1
push 0x8c
call calc.SetBox
执行此操作时,您需要注意的是不要破坏堆栈,当您完成执行代码段后返回到您最初转移的位置
ollydbg.exe calc.exe - > f9 运行exe然后 f12暂停 注意ollydbg暂停的地址(对于xpsp3它将是ntdll!KiFastSystemCallRet())
现在找到一个代码洞穴汇编在这里使用new origin将eip 转移到新组装的代码执行完代码片段时选择原始的暂停地址(对于xpsp3 ntdll!kiFastSystemCallRet())和重新设置回到该地址这里有新的来源和 f9 来运行exe你会注意到你设置了复选标记而没有点击复选框:)
我有时会手动完成(f12书签eip向下滚动到空白空间汇编执行并通过书签返回)
或使用脚本并使用ODBGSCRIPT
运行它 当你用下面的f12暂停ollydbg时,上面描述的scenerio脚本(calc复选框)
编辑评论的脚本并添加了一个malloc来摆脱洞穴搜索家务
var myret ;variable
var cave ;variable
var mem ;variable
mov myret , eip ;save current eip
alloc 1000 ;allocate memory (no need to search for code caves
mov mem, $RESULT ;save for freeing the allocated memory
mov cave,$RESULT ;mov newly allocated space to var cave
mov eip , cave ;detour current eip to cave
asm cave, "push 01" ;assemble instruction (pop all push dont corrupt stack)
add cave,$RESULT ;lenght added to find next address for assembling
asm cave, "push 08c" ;assemble next instruction
add cave,$RESULT ;len of previous instruction added to current address
asm cave, "call calc.SetBox" ; assemble call
step ; we assembled 3 instructions lets step thrice
step ;
step ;
mov eip , myret ;restore saved eip
free mem,1000 ;free
go ;run the binary to notice the check box ticked
答案 1 :(得分:0)
对于Ollydbg中的应用程序,没有内置的方法来执行此操作。您可能需要编写一个插件来执行此操作。
但是,如果您的目标是DLL中的导出函数,则可以使用Ollydbg中的“调用DLL导出”功能。使用“调用导出”功能,您可以使用参数调用导出的函数,如下面的屏幕截图所示。