首页 > 试题

od是什么意思

更新时间:2022-11-16 12:44:11 阅读: 评论:0

聚能教育一对一收费表-数学计算题100道


2022年11月16日发(作者:爱的死心塌地)

OD(Ollydbg)基础常⽤汇编

0×00序⾔:

1.⾃从上次笔者调戏完盗取⽂件密码⼤⿊客后,这激发了笔者的创作热情,就给⼤家带来程序逆向系列,当然有⼀些地⽅还是有所⽋缺,请⼤家在

私聊中指出我⽂中的错误,我会加以改正。

2.本篇教程每篇⽂章都会在附件中给出⼀个程序逆向例⼦,所⽤到的知识都会在该篇⽂章中体现,有兴趣的同学可以⾃⼰实践实践

3.为什么要学习逆向破解?

a.你可以汉化⼀些软件给予⼤家使⽤

b.你可以进⾏病毒分析

c.外挂辅助的研究

d.程序的破解

5.破解的环境要求由于⼀些程序的编写者不期望⾃⼰的程序被破解(其实谁也不期望),所以就采取了⼀些⽐较极端的⽅法,⽐如:格式化您的重

要资料……

所以,程序破解的时候需要⽤到虚拟机,虚拟机推荐使⽤vmware

密码:9954

系统镜像下载地址:

只需要把您需要⽤到的镜像的下载链接放到迅雷⾥即可

———————————————————————————————————————————————————————————————

0×01⾸先认识⼀下OD(Ollydbg)

打开OD界⾯,呈现出下图的窗⼝分布,这⾥笔者对OD界⾯的⼏个窗⼝进⾏了⼀下标识。

1.菜单窗⼝:

从左往右依次去说这些按钮的作⽤以及快捷键:

(1)打开新的可执⾏⽂件[快捷键F3]

(2)重新载⼊程序[快捷键Ctrl+F2]

(3)关闭程序[快捷键Alt+F2]

(4)运⾏程序[快捷键F9]

(5)暂停执⾏程序[快捷键F12]

(6)单步步⼊[快捷键F7]

(7)单步步过[快捷键F8]

(8)跟踪步⼊[快捷键Ctrl+F11]

(9)跟踪步过[快捷键Ctrl+F12]

(10)执⾏到返回[快捷键Ctrl+F9]

(11)转到反汇编窗中⼝的地址(转到表达式)[快捷键Ctrl+G]

(12)显⽰记录窗⼝[快捷键Alt+L]

(13)显⽰模块窗⼝[快捷键Alt+E]

(14)显⽰内存窗⼝[快捷键Alt+M]

(15)显⽰线程窗⼝

(16)显⽰窗⼝

(17)显⽰句柄窗⼝

(18)显⽰CPU窗⼝[快捷键Alt+C]

(19)显⽰补丁窗⼝[快捷键Ctrl+P]

(20)显⽰调⽤堆栈窗⼝[快捷键Alt+K]

(21)显⽰断点窗⼝[快捷键Alt+B]

(22)显⽰参考窗⼝[快捷键Alt+R]

(23)显⽰Run跟踪窗⼝

(24)显⽰源码窗⼝

(25)调试选项(快捷键Alt+O)

(26)界⾯选项

(27)帮助

2.反汇编窗⼝:

为了演⽰⽅便笔者决定⽤C语⾔写个简单的HelloWorld!程序

代码如下:

将编译好的⽂件拖⼊OD

这⾥笔者对反汇编窗⼝进⾏了⼀下划分和标注:

这⾥⾯地址即为程序的内存地址,hex即为hex数据,反汇编就是程序的汇编代码,注释即为od分析出来的,双击即可编辑,信息窗⼝能对操

作进⾏更加详细的查看。

3.寄存器窗⼝:

这⾥就简单介绍⼏个通⽤寄存器

ESP:指向堆栈栈顶

EBP:⼤部分⽤来定位局部变量和参数

其余的就各⾃拆开来⽤

这⾥⾯不低寄存器做更加深⼊的讲解,有兴趣的同学可以看看王爽的《汇编语⾔(第3版)》。

另外,点击标签寄存器(FPU)可以切换显⽰寄存器的⽅式

4.数据窗⼝:

数据窗⼝主要的即为程序或者内存的数据,右键可以切换显⽰⽅式

5.堆栈窗⼝:

主要存放线程的临时数据,可以⽤于动态调试.

6.命令⾏窗⼝:

主要就是执⾏⼀些下断命令

⽐如:bp+API函数名称

——————————————————————————————————————————————————

0×02⼀些常⽤的操作

为了⽅便演⽰下⾯的操作,笔者写了⼀段代码来检测进程的程序

代码如下:

#include

#include

#include

intmain()

{

char*procressName=“”;

charpName[MAX_PATH];

strcpy(pName,procressName);

CharLowerBuff(pName,MAX_PATH);

PROCESSENTRY32currentProcess;

=sizeof(currentProcess);

HANDLEhProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(hProcess==INVALID_HANDLE_VALUE)

{

printf(“函数CreateToolhelp32Snapshot调⽤失败!n”);

returnFALSE;

}

BOOLbMore=Process32First(hProcess,¤tProcess);

while(bMore)

{

CharLowerBuff(ile,MAX_PATH);

if(strcmp(ile,pName)==0)

{

CloHandle(hProcess);

printf(“发现”);

system(“pau”);

exit(0);

}

bMore=Process32Next(hProcess,¤tProcess);

}

printf(“没有发现”);

CloHandle(hProcess);

printf(“CrackeSuccess!”);

getchar();

return0;

}

编译完成后运⾏

打开OD

载⼊程序的两种⽅法

(1)拖拽exe⽂件载⼊,这个很简单直接把exe⽂件拖拽到OD窗⼝中就⾏

(2)进程附加,前提是你需要先运⾏所要附加的exe

a.⾸先运⾏需要附加的exe

b.点击⽂件->附加,找到需要附加的进程,选中后点击附加

2.字符串搜索⽅法

在反汇编窗⼝上点击右键->中⽂搜索引擎[根据需要你可以选取相应的筛选选项(1.搜索ASCII,2.搜索UNICODE,3.智能搜索)]

PS:ASCII⼜叫ANSI简写为A

UNICODE⼜叫WideChar简写为W

程序API⾥⾯的A/W就是指的这两种编码

⽤刚刚那个检测explorer进程的exe为例⼦:

ASCII搜索:

UNICODE搜索:

智能搜索:

在这⾥⾯笔者推荐在搜索字符串的时候使⽤智能搜索

3.下断点以及删除断点:

(1).快捷键下断点(F2):⽤⿏标选中需要下段的代码,按⼀下F2

(2)⽤⿏标选中代码右键->断点->切换

(3)命令⾏下断点:

a.先找到需要下段的内存地址:

b.在命令⾏窗⼝输⼊bp内存地址

本程序中需要下段的内存地址为:00B510EC输⼊命令:bp00B510EC,回车

(4)删除断点

a.查看–>断点然后就进⼊到显⽰断点窗⼝(快捷键Alt+B)

b.⽤⿏标点击需要删除的断点右键删除即可

(PS:这⾥⾯断点的使⽤并不全⾯,这是做了⼀个简单的介绍⽽已)

4.保存⽂件

就以这个检测的程序为例⼦

我们需要将程序改为直接输出CrackeSuccess!

⾸先搜索字符串找到CrackeSuccess!

双击字符串跟踪

往上翻⼀翻字符串会发现”没有发现”这段ASCII,⽤⿏标选中ASCII所在的代码,如图所⽰

这⾥⾯⽤⽩⾊圆形所传出来的是⼀段跳转,我们需要跟踪⼀下

(这⾥的红线代表的是跳转实现,⽽⽩线则是不实现。)

发现是从jeshortChecking.00B510EC跳转过来

这⾥⾯普及⼀下汇编的条件跳转指令:

jmp:⽆条件跳转(jump)

je/jz:结果为0跳转(jumpzero)

jnz/jne:结果不为0跳转(jumpnotzero)

js:结果为负跳转(Jumpifsign)

jns:结果为正跳转(Jumpifnotsign)

jb:⼩于则跳转(Jumpbelow)

jnb:⼤于或等于则跳转(Jumpnotbelow)

回到这个程序中,程序的意思就是调⽤CreateToolhelp32Snapshot函数去创造⼀个当前进程快照,利⽤ProcessFirst和

ProcessNext这两个API函数去遍历进程快照的进程并且与做cmp,如果结果为真就不跳转,输出“

发现”,如果结果为假就跳转“没有发现ckeSuccess!”

所以这其中的关键就在于遍历查找部分

⽤⿏标选中后,双击编辑

将条件跳转的je改为⽆条件跳转的jmp

右键->复制到可执⾏⽂件–>所有修改

点击全部复制

右键后,找到保存⽂件

我们将其重命名为

保存在桌⾯上

运⾏⼀下

这个检测进程就被我们绕过了

——————————————————————————————————————————————————

0×03常⽤汇编指令扫盲

1.通⽤数据传送指令

MOV(Move)传送

例如mova,b就是把b的值传给a

PUSH(Pushontothestack)进栈

POP(Popfromthestack)出栈

注:push和pop由于堆栈平衡原理

有push就必须要有pop

XCHG(Exchange)交换

2.标志寄存器传送指令

PUSHF(pushtheflags)标志进栈

POPF(poptheflags)标志出栈

3.条件跳转(⼀般配合cmp使⽤)

JMP(jump)⽆条件跳转

JZ/JE(Jumpifzero,orequal)结果为零(或相等)则跳转注:检测Z位

JNZ/JNE(Jumpifnotzero,ornotequal)结果不为零(或不相等)则跳转注:检测Z位

JS(Jumpifsign)结果为负则跳转注:检测S位

JNS(Jumpifnotsign)结果为正则跳转注:检测S位

JB(JumpBelow):⼩于则跳转注:检测C位

JNB(JumpNotBelow):⼤于或等于则跳转注:检测C位

那这些C位,Z位,S位在哪⾥看呢?

在0×01认识OD中在寄存器窗⼝中认识了标志寄存器,如图:

这⾥⽤jnz去举例,jnz的判断检查Z位,当Z位是0的时候就不跳转,在Z为是1的时候就跳转

4.⼦程序

CALL调⽤指令

RET返回指令

循环指令

6.算数指令

ADD加法指令

SUB减法指令

SUBR减法指令

MUL乘法指令

DIV除法指令

DIVR;除法指令

空指令

0×04总结

本篇⽂章介绍了OD的基础使⽤,以及⼀些基础操作

本文发布于:2022-11-16 12:44:11,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/31344.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:六次函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图