前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逆向二期/002/OD知识

逆向二期/002/OD知识

作者头像
yichen
发布2020-01-02 11:44:46
7010
发布2020-01-02 11:44:46
举报

基础知识

看雪新手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的学习。。。

日常自闭中。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档