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 条评论) |