从零开始的程序逆向之路 第一章——认识OD(Ollydbg)以及常用汇编扫盲
原文来自:https://bbs.ichunqiu.com/thread-43041-1-1.html
0×00 序言:
1.自从上次笔者调戏完盗取文件密码大黑客后,这激发了笔者的创作热情,就给大家带来程序逆向系列,当然有一些地方还是有所欠缺,请大家在私聊中指出我文中的错误,我会加以改正。
2.本篇教程每篇文章都会在附件中给出一个程序逆向例子,所用到的知识都会在该篇文章中体现,有兴趣的同学可以自己实践实践
3.为什么要学习逆向破解?
a.你可以汉化一些软件给予大家使用
b.你可以进行病毒分析
c.外挂辅助的研究
d.程序的破解
4.这套系列笔者所用的工具已经被笔者整理为工具包,链接地址: https://bbs.ichunqiu.com/thread-43019-1-1.html
5.破解的环境要求由于一些程序的编写者不期望自己的程序被破解(其实谁也不期望),所以就采取了一些比较极端的方法,比如:格式化您的重要资料 ……
所以,程序破解的时候需要用到虚拟机,虚拟机推荐使用vmware
下载链接: https://pan.baidu.com/s/19eBzCzPrSs4xnkwrcWNV_Q
密码: 9954
虚拟机安装教程: https://jingyan.baidu.com/article/25648fc1c467eb9191fd00d6.html
系统镜像下载地址:
只需要把您需要用到的镜像的下载链接放到迅雷里即可
——————————————————————————————————————————————————————————————————
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 一些常用的操作
为了方便演示下面的操作,笔者写了一段代码来检测explorer.exe进程的程序
代码如下:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main()
{
char* procressName = “explorer.exe”;
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(“发现explorer.exe”);
system(“pause”);
exit(0);
}
bMore = Process32Next(hProcess, ¤tProcess);
}
printf(“没有发现explorer.exe\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.保存文件
就以这个检测Explorer.exe的程序为例子
我们需要将程序改为直接输出Cracke Success!
首先搜索字符串找到Cracke Success!
双击字符串跟踪
往上翻一翻字符串会发现”没有发现explorer.exe\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函数去遍历进程快照的进程并且与Explorer.exe做cmp,如果结果为真就不跳转,输出“
发现explorer.exe”,如果结果为假就跳转“没有发现explorer.exe Cracke Success!”
所以这其中的关键就在于遍历查找部分
用鼠标选中后,双击编辑
将条件跳转的je改为无条件跳转的jmp
右键 -> 复制到可执行文件 –> 所有修改
点击全部复制
右键后,找到保存文件
我们将其重命名为Cracker-Checking Explorer.exe
保存在桌面上
运行一下
这个检测进程就被我们绕过了
——————————————————————————————————————————————————
0×03 常用汇编指令扫盲
1.通用数据传送指令
MOV(Move)传送
例如 mov a,b 就是把b的值传给a
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
注:push和pop由于堆栈平衡原理
有push就必须要有pop
XCHG(Exchange)交换
2.标志寄存器传送指令
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈
3.条件跳转(一般配合cmp使用)
JMP(jump) 无条件跳转
JZ/JE(Jump if zero,or equal) 结果为零(或相等)则跳转 注:检测Z位
JNZ/JNE(Jump if not zero,or not equal) 结果不为零(或不相等)则跳转 注:检测Z位
JS(Jump if sign) 结果为负则跳转 注:检测S位
JNS(Jump if not sign) 结果为正则跳转 注:检测S位
JB(Jump Below):小于则跳转 注:检测C位
JNB(Jump Not Below ):大于或等于则跳转 注:检测C位
那这些C位,Z位,S位在哪里看呢?
在0×01认识OD中在寄存器窗口中认识了标志寄存器,如图:
这里用jnz去举例,jnz的判断检查Z位,当Z位是0的时候就不跳转,在Z为是1的时候就跳转
4.子程序
CALL 调用指令
RET 返回指令
5.LOOP 循环指令
6.算数指令
ADD 加法指令
SUB 减法指令
SUBR 减法指令
MUL 乘法指令
DIV 除法指令
DIVR ;除法指令
7.nop 空指令
0×04 总结
本篇文章介绍了OD 的基础使用,以及一些基础操作
介绍了一些常用的汇编指令,如果有哪些常用的汇编指令没有补充到位的以及文章中出现瑕疵的地方欢迎在评论区中指出,我会及时审改的
阅读原文可下载附件,附件中有本篇文章的例子以及一个演示例子。
从零开始的程序逆向之路 第一章——认识OD(Ollydbg)以及常用汇编扫盲的更多相关文章
- 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件
作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...
- 【Java】《Java程序设计基础教程》第一章学习
一.Java概述 1.介绍了Java语言的由来 2.Java语言的特点:简单.面向对象.分布式.高效解释执行.健壮.安全.结构中立.可移植.高效率.多线程.动态 3.Java语言的实现机制,引入虚拟机 ...
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第五步)(2)
把下载下来的"hadoop-2.2.0.tar.gz"复制到"/usr/local/hadoop/"文件夹下并解压: 改动系统配置文件,改动~/.bashrc文 ...
- WEB的进击之路-第一章 HTML基本标签(1)
一.HTML简介 超文本标记语言,标准通用标记语言下的一个应用. "超文本"就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 超文本标记语言的结构包括"头&q ...
- Windows PE 第一章 熟悉OD(顺便破解一个小工具)
熟悉OD(顺便破解一个小工具) 上一节了解了OD的简单使用,这次就练习下,目标是破解一款小软件(入门练手用的,没有壳什么的). 首先我们来看一下这个小软件: 我们的目的是输入任何字符串都可以成功注册, ...
- 【vue.js权威指南】读书笔记(第一章)
最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...
- 数据库系统第一章【绪论】(B站视频)
目录 数据库系统第一章[绪论](B站视频) 一.绪论 数据库的四大基本概念 数据 数据库 数据库管理系统 主要功能 数据库系统 数据管理 我的理解 数据系统的特点 数据结构化 数据系统的共享性 数据独 ...
- Win32简单图形界面程序逆向
Win32简单图形界面程序逆向 前言 为了了解与学习底层知识,从 汇编开始 -> C语言 -> C++ -> PE文件 ,直至今天的Win32 API,着实学的令我头皮发麻(笑哭). ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章05
1.3 开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...
随机推荐
- jsp页面中比较“接收数据”与“页面循环数据”是否相等
页面中关系运算符: -lt 小于 -le 小于或者等于 -gt 大于 -ge 大于或者等于 -eq 等于 -ne 不等于 判空:<c:if test="${empty count ...
- 悲观锁,乐观锁,排他锁,行锁----MYSQL
在说具体的锁结构时,先思考一个问题,那就是为什么要上锁?然后我要如何选择锁?锁具体如何实现? 在文章得末尾我给出了我的个人答案. 一.什么是悲观锁? 1.悲观锁就是在操作数据时,认为此操作会出现数据冲 ...
- java中封装类(一)
java中封装类共九个,分别是Boolean,Byte,Short,Integer,Long,Float,Double,Character,Void 其中Void对于使用者并无多大意义,也不可以构造任 ...
- Install weblogic in silent mode
使用静默(silent)模式来安装weblogic,在需要将安装脚本化,或无法使用图形界面的时候非常有用. 下面按照自己在实际工作中碰到的例子,来慢慢总结不同版本和平台weblogic的静默安装方法. ...
- selenium下打开Chrome报错解决
错误如下: [22516:20196:0704/024642.979:ERROR:install_util.cc(597)] Unable to read registry value HKLM\SO ...
- Servlet中获取Spring管理的bean
描述: 在Servlet中调用Spring管理的接口,可以使Dao/Service/ServiceImpl. 前提是在调用的bean中有注解: @Repository("beanName&q ...
- etcd集群部署与遇到的坑
在k8s集群中使用了etcd作为数据中心,在实际操作中遇到了一些坑.今天记录一下,为了以后更好操作. ETCD参数说明 —data-dir 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群 ...
- POJ-1797.HeavyTransportation(最长路中的最小权值)
本题思路:最短路变形,改变松弛方式即可,dist存的是源结点到当前结点的最长路的最小权值. 参考代码: #include <cstdio> #include <cstring> ...
- effector - 必应词典
effector - 必应词典 美[ɪ'fektə(r)]英[ɪ'fektə(r)] n.效应物 网络效应器:效果器:受动器 变形复数:effectors:
- 426. Convert Binary Search Tree to Sorted Doubly Linked List把bst变成双向链表
[抄题]: Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right po ...