用 OD 捕获按钮事件,可以尝试以下办法:
1、通过编写好的脚本来获取按钮事件:
先将以下脚本保存至 txt 文件中:
var Addrmov Addr,401000
loop:
find Addr,#740E8BD38B83FF93#
cmp $RESULT,0
je Exit
add $RESULT,0A
bp $RESULT
add $RESULT,1
mov Addr,$RESULT
jmp loop
Exit:
ret
用OD载入 Delphi 程序,右键 运行脚本-->打开,选择上面保存的文件,运行,如果d出了script finished 窗口就表示找到按钮事件断点位置。
2、用资源编辑工具+十六进制编辑工具来查找:
首先用ResScope或者其他工具打开目标程序,在RCData中能够找到窗体的资源信息,例如
object Form1: TForm1object Button1: TButton
Caption = 'Button1'
OnClick = Button1Click
end
end
此时假设我们要找“Button1”按钮事件,记住OnClick的名字(在这里就是Button1Click)
然后再用WinHex打开程序,查找事件名“Button1Click”,如下图所示: 事件名的前一个字节就是事件名的长度,再前面就是事件地址了:
找到地址后,用 OD载入程序,直接Ctrl+G前往该地址。
来源;>
前期准备:
首先,我们需要一个调试器,这里我比较喜欢OLLYDBG ---我认为他是这个世界上最好的调试器 :P)
第二,我们需要一个拿来注入我们代码的应用程序,我选择的是windows的记事本(notepadexe),把notepadexe拷贝到一个新的目录下,
并把它重命名为CodeInjectTest。
开始
我们的目标是往NotepadEXE 注入一些我们想要的代码,在例子中我们将在NotepadEXE启动的时候注入一个简单的对话框。
启动记事本,如下是原本的记事本的样子。
用OD打开原始的notepad,如果没什么差错的话,你应该会看到下面的窗口。
因为我们需要往exe中注入自己的代码,因此需要遭到应用程序的空白处,这个空白处我们把它叫做CodeCaves。滚动od中的cpu窗口,
知道我们找到CodeCaves。如下:
地址从01008747开始。
在标红的区域中,就是notepad的CodeCave。在这里我们可以写一些自己想要的代码,而且他不会影响程序的正常运行。如果我们想要调用 Messagebox,
你需要知道一下关于Messagebox的介绍:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
这些就是你必须知道的一些关于MessageBox的东西,现在我们可以在CodeCaves 下做一些自己的事情了。首先,我们要创建MessageBox里显示的
提示信息的字符串,这里我们选择几行CodeCaves,如下:
点击 Binary=>Edit or (CTRL+E)你将看到如下的窗口,在窗口中输入你自己想填写的:
点击ok,你将会看到那些红色代码就是你修改的:
现在用CTRL+A 在分析一下代码。
Ok,如果你希望MessageBox ,有不同的标题属性,你可以重复上述的 *** 作,创建另外一个字符串,如"INJECTED NOTEPAD"。
现在是时候编写 asm代码的时候了 ;)
我们需要编写触发MessageBox 的asm代码。这是一些快速的例子如下:
PUSH 0 ; BUTTONS = <OK ONLY>
PUSH 1008751 ; CAPTION = Our adress of the "INJECTED NOTEPAD"
PUSH 1008751 ; MESSAGE = Same like above
PUSH 0 ; ICON = <NO ICON>
CALL MessageBoxA ; Run MessageBoxA with the Params above
这些代码在od上看起来应该是这个样子的:
看到上面的箭头了没,接下来是重要的一步!如果你现在保存它并运行它,你将看不到任何的效果,为什么呢?
因为这段代码并没有被调用。
我们必须记住" PUSH 0" 的偏移位置,因为我们需要从程序的开始位置跳转过来,然后在跳回去 ;)
再记住了这个地址以后,跳转到程序的开头位置如下:
现在来到了程序开始执行的位置。还记得我们一开始我们想往程序里加入什么吗? ;) 从开始选择几段的代码,拷贝到剪贴板中。
把这些代码保存在文件中去,可能等下我们会使用到它。回到刚才程序的开头位置 (在中是 PUSH 70)
双击它,在d出来的地方下 编写如下的代码"JMP <adress of your first push>"
按下Assemble 按钮,将看到如下红色的代码。
注意下红色盒子里的地址,这是我们等下需要跳回来的地方。
对比一下新的代码和刚才拷贝到剪贴板的代码,你会发现原来的一些代码被覆盖带了,为了保持程序可执行我们必须补上这些被重写的代码。
在这个例子中,被覆盖掉的代码如下:
PUSH 70
PUSH NOTEPAD01001898
在 CALL MessageBoxA的后面,补上这段代码,然后跳回到原处。
一切都已经就绪了。
如下,保存一下新的记事本:
选择"All modifications",在d出来的对话框中选择"Copy All" ,给程序去一个名字,保存它,如果你成功的话,你讲看到如下的窗体。
点击ok,记事本将正常启动了。
总结:
1明白要注入的代码该怎么编写
2记得恢复原来被代替掉的代码。
以上就是关于如何在OD中为Delphi程序添加按钮点击事件全部的内容,包括:如何在OD中为Delphi程序添加按钮点击事件、【楚】E-DeBug配合OD撸易语言、如何注入代码到exe中使用OD进行 *** 作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)