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语⾔写个简单的Hello World!程序
代码如下:
将编译好的⽂件拖⼊OD
这⾥笔者对反汇编窗⼝进⾏了⼀下划分和标注:
这⾥⾯地址即为程序的内存地址,hex即为hex数据,反汇编就是程序的汇编代码,注释即为od分析出来的,双击即可编辑,信息窗⼝能对操作进⾏更加详细的查看。
3.寄存器窗⼝:
这⾥就简单介绍⼏个通⽤寄存器
ESP:指向堆栈栈顶
EBP:⼤部分⽤来定位局部变量和参数
其余的就各⾃拆开来⽤
这⾥⾯不低寄存器做更加深⼊的讲解,有兴趣的同学可以看看王爽的《汇编语⾔(第3版) 》。
另外, 点击标签寄存器 (FPU) 可以切换显⽰寄存器的⽅式
4.数据窗⼝:
数据窗⼝主要的即为程序或者内存的数据,右键可以切换显⽰⽅式
5.堆栈窗⼝:
主要存放线程的临时数据,可以⽤于动态调试.
汇编语言跳转指令6.命令⾏窗⼝:
主要就是执⾏⼀些下断命令
⽐如:bp+API函数名称——————————————————————————————————————————————————0×02 ⼀些常⽤的操作
为了⽅便演⽰下⾯的操作,笔者写了⼀段代码来检测进程的程序
代码如下:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main()
{
char* procressName = “”;
char pName[MAX_PATH];
strcpy(pName, procressName);
CharLowerBuff(pName, MAX_PATH);
PROCESSENTRY32 currentProcess;
currentProcess.dwSize = sizeof(currentProcess);
HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcess == INVALID_HANDLE_VALUE)
{
printf(“函数CreateToolhelp32Snapshot调⽤失败!\n”);
return FALSE;
}
BOOL bMore = Process32First(hProcess, ¤tProcess);
while (bMore)
{
CharLowerBuff(currentProcess.szExeFile, MAX_PATH);
if (strcmp(currentProcess.szExeFile, pName) == 0)
{
CloseHandle(hProcess);
printf(“发现”);
system(“pause”);
exit(0);
}
bMore = Process32Next(hProcess, ¤tProcess);
}
printf(“没有发现\n”);
CloseHandle(hProcess);
printf(“Cracke Success!”);
getchar();
return 0;
}
编译完成后运⾏
打开OD
1. 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输⼊命令: bp 00B510EC,回车
(4)删除断点
a.查看 –> 断点 然后就进⼊到显⽰断点窗⼝(快捷键 Alt+B)
b.⽤⿏标点击需要删除的断点右键删除即可
(PS:这⾥⾯断点的使⽤并不全⾯,这是做了⼀个简单的介绍⽽已)
4.保存⽂件
就以这个检测的程序为例⼦
我们需要将程序改为直接输出Cracke Success!
⾸先搜索字符串到Cracke Success!
双击字符串跟踪
往上翻⼀翻字符串会发现”没有发现\n”这段ASCII,⽤⿏标选中ASCII所在的代码,如图所⽰
这⾥⾯⽤⽩⾊圆形所传出来的是⼀段跳转,我们需要跟踪⼀下
(这⾥的红线代表的是跳转实现,⽽⽩线则是不实现。)
发现是从je short Checking.00B510EC跳转过来
这⾥⾯普及⼀下汇编的条件跳转指令:
jmp :⽆条件跳转 (jump)
je/jz :结果为0跳转 (jump zero)
jnz/jne: 结果不为0跳转 (jump not zero)
js:结果为负跳转 (Jump if sign)
jns:结果为正跳转(Jump if not sign)
jb:⼩于则跳转(Jump below)
jnb:⼤于或等于则跳转(Jump not below)
回到这个程序中,程序的意思就是调⽤CreateToolhelp32Snapshot函数去创造⼀个当前进程快照,利
⽤ProcessFirst和 ProcessNext这两个API函数去遍历进程快照的进程并且与做cmp,如果结果为真就不跳转,输出“
发现”,如果结果为假就跳转“没有发现 Cracke Success!”
所以这其中的关键就在于遍历查部分
⽤⿏标选中后,双击编辑
将条件跳转的je改为⽆条件跳转的jmp
右键 -> 复制到可执⾏⽂件 –> 所有修改
点击全部复制
右键后,到保存⽂件
我们将其重命名为
保存在桌⾯上
运⾏⼀下
这个检测进程就被我们绕过了
——————————————————————————————————————————————————
0×03 常⽤汇编指令扫盲
1.通⽤数据传送指令
MOV(Move)传送
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论