基础知识
看雪新手wiki:
https://bbs.pediy.com/thread-31443.htm
控制面板图标
L:日志窗口
E:程序运行使用的模块
M:程序映射到内存的信息
T:程序线程窗口
W:显示程序窗口
H:句柄窗口
C:CPU窗口
/ :显示程序修改信息
K:调用的堆栈窗口信息
B:程序普通断点,不显示硬件和内存断点
R:显示搜索结果
...:显示run跟踪命令的结果
关联插件目录:
options->appearance->directories
指定plugin路径,重启OD
基本概念:
入口点:程序刚被加载的第一条指令,区别于OEP(原始入口点)
找一个系统API的方法:
在command插件输入:?MessageBoxA 会在后面出现地址,转到就可以了
也可以直接转到:MessageBoxA
还可以在反汇编窗口右键:查找->当前模块中的名称,这样就找到了该程序的api名称列表,这时候直接在键盘上按M键,就会检索以M开头的API,找到后右键反汇编窗口中跟随
retn 10:普通的retn只是返回后返回地址从堆栈删除,堆栈指针向下移动4字节,而retn 10还要把ESP增加10h,所以ESP增加量为14H,即20
关于断点:
普通CC断点:
使用F2就可以,了解一下下断后会发生什么变化
设置断点后,OD会将对应指令处第一个字节替换成CC,但是却不显示
除了F2,还可以在command处输入:BP 401018
同理可以输入BP MmessageBoxA给MessageBoxA下断
而是用BPX MmessageBoxA可以给所有的引用或调用了MmessageBoxA的函数指令下断点
内存断点:
这种断点修改内存页的访问属性,当设置了内存断点,任何代码访问了该处代码的话都会触发
内存断点不会出现在【B】处,必须记住在哪里下的断,不能同时设置多个,设置下一个,上一个就自动删除
还可以在【M】中设置区段断点,比如在401000处设置内存断点,当运行的时候就会断住,尝试执行当前代码段的任何指令都会触发
如果程序会检测函数首字节是否为0xCC的话,普通断点就不能用了,使用内存断点
硬件断点:
最多可以设置4个硬件断点
分为:硬件执行断点。,硬件写入断点,硬件访问断点
硬件执行断点与普通CC断点作用一样但是不会修改首字节为CC所以更难检测,但有的程序会使用技巧清除硬件断点
右键->断点->硬件执行,来设置硬件执行断点
也可以在command输入:HE 地址 来设置硬件执行断点
硬件访问/写入断点会断在触发硬件断点的下一条指令处
条件断点:
条件断点实际上就是普通的CC断点,只不过需要条件触发
条件记录断点:可以通过设置该断点来记录设置下的条件精确值
比如给给一个API函数设置条件记录断点,那么可以精确记录程序中每次调用该API函数传递给它的内容
当函数断下来,右键设置就可以
消息断点:
也称为:BMSG
Windows窗口程序至少有一个消息循环,消息循环是由特定的api函数构成的,最常见的是GetMessage和DispatchMessage函数
在编辑框获取文本通常使用GetDlgItemTextA或GetWindowTextA,或者unicode版的GetDlgItemTextW或GetWindowTextW,但是保护强度高的不能获取
给GetDlgItemTextA下断,输入用户名和序列号,断住,注意堆栈,有一个buffer(缓冲),这里存放了编辑框中的内容,数据窗口中跟随,因为函数还没有被执行,所以内容为空,ctrl+F9,执行到返回,就可以在数据窗口看到
然而,大多数时候,是通过发送消息来获取文本内容的
(普通断点与消息断点区别在于,普通断点在程序启动之前就可以设置,消息断点只有在窗口创建后才能设置)
点击【W】,如果什么都没有就刷新一下,找到标题为OK的,右键,设置消息断点
在这个程序中,点击鼠标左键,系统会发送WM_LBUTTONDOWN,松开鼠标左键,系统会发送WM_LBUTTONUP消息,在设置了202WM_LBUTTONUP后,松开左键就会收到202消息
f9运行后,会停在奇怪的代码段,在【M】中,找到程序入口点,设置内存访问断点,F9 单步,会运行到GetDlgItemTextA,删除内存断点和普通断点,打开【W】重复之前的步骤,在【B】里把condition删掉,把expression改成condition的[esp+8]确定,这样就能捕捉消息并记录到日志中
硬编码序列号:
给GetDlgItemTextA或GetWindowTextA(获取编辑框中的文本)和MessageBoxA(弹窗)
在窗口中随便输入,点击验证,断下来,在堆栈中找到buffer,数据窗口中跟随
调试->执行到返回,这样就可以看到刚才输入的了,此时到了retn处,F7执行这个retn,来到mov处,有两个mov,这就是把输入的跟原本设定的放到不同的寄存器下面再对比,找出来就可以了
这个笔记做的乱七八糟的。。。
开始160个crackme的学习。。。
日常自闭中。。。