熟悉OD(顺便破解一个小工具)

上一节了解了OD的简单使用,这次就练习下,目标是破解一款小软件(入门练手用的,没有壳什么的)。

首先我们来看一下这个小软件:

我们的目的是输入任何字符串都可以成功注册,达到破解的目的。

这个东西破解方式很多,而且也不是唯一,逆向这东西很多地方都不是固定的,都是靠分析汇编逻辑细节,靠经验,有的时候还要靠猜,当然更需要的就是耐心。

说下我的分析过程:

1.首先看下有没有加壳:

OK  没有进行加壳处理。

2.加载到OD里:

注意左上角的地址,固定基址。

3.找到一个分析的入口,这个很容易想到就是

那么猜测一下:

if(***) 注册成功...

else 注册失败

我们查找注册失败的这个串的调用地址,应该是能找到他这个弹窗函数,这样我们可以看下这个附近有没有注册成功的串,如果有的话,那么可以简单判断应该是在同一个函数里完成的,也就是破解的位置j*这个语句也可能在这个函数里,如果没有看到那个成功串,只看到了注册失败,那么就有可能这是个失败函数,如果是个失败函数也比较好处理。我们在这打上断电,然后调试到ret的位置,这个时候堆栈应该是平衡的,正确的,我们直接看栈里的下一条地址,这个就应该是调用这个函数call
FunError() 的下一条地址,至于为什么,这里就不解释了,汇编基础知识。同时我们还可以不看堆栈,直接在ret打上断点,然后F8就行了,当然也可以直接找到这个函数的最上面,也就是函数地址,这样可以直接查找谁调用过这个函数,然后再一一排除,不过感觉这样效率不高。

OK,继续往下走,我们可以先文档化的搜索下这个字符串在PE文件里的文件偏移位置:

OK 这里看到 文件偏移地址是81A79
在加上这个工具是固定基址:

所以可以简单计算字符串的内存位置是0x00400000+81A79 = 0x00481A79

那我们可以直接在OD里搜索常量:

然后我们可以分析上下文,来找找注册成功的串在不在,如果在就分析这个函数,否则就找调用这个函数的地方去找注册成功后call的那个函数。

结果是就在附近:

那么好办了,直接分析下这附近的汇编代码就行了。我分析了下,内容我写在注释里:

具体破解思路我也写在了注释里。

4.修改指令,保存文件实现破解jg A.00405D11 ->  jl A.00405411

最后的破解结果是:

TIP:

最后提示一下,上面我通过找文件偏移地址然后计算字符串内存加载地址,还有另一种方式就是直接OD插件部分一个功能,插件->中文搜索引擎->ASCII直接搜索到注册失败的这个串,然后直接双击那一行会直接跳转到我们搜索计算后的常量的时候的那一行汇编代码出。然后后续分析流程一样。而且这只是其中一种破解思路,比如如果我们发现成功掉函数A
失败掉函数B
那么我们可以在失败Call B处改成
Call A  等等,根据具体情况而求改相关代码。还有,上面的是大体思路,我没有写OD的详细操作细节,比如怎么搜索东西,怎么改汇编代码,怎么保存等,这些都是基础操作我就不写了,很容易搜到。

Windows PE 第一章 熟悉OD(顺便破解一个小工具)的更多相关文章

  1. Windows PE 第一章开发环境和基本工具使用

    第一章 Windows PE 基本工具 1.1开发语言MASM32 1.1.1设置开发环境 这个不细说了,我在整理Intel汇编的时候详细的说了环境搭建以及细节.地址是:http://blog.csd ...

  2. 决胜Flutter 第一章 熟悉战场

    欢迎参加“决胜Flutter” 实训课程,这里是你此次实训之旅的起点. 本章将带您快速了解移动开发的现状,然后向您介绍Flutter的发展历史以及优势特点,最后一起动手,搭建高效的开发环境. 由于Fl ...

  3. 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法

    第一章 熟悉Objective -C   编写高质量iOS与OS  X代码的52 个有效方法   第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...

  4. 从零开始的程序逆向之路 第一章——认识OD(Ollydbg)以及常用汇编扫盲

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43041-1-1.html 0×00 序言: 1.自从上次笔者调戏完盗取文件密码大黑客后, ...

  5. Windows PE第九章 线程局部存储

    线程局部存储(TLS) 这个东西并不陌生了,之前写过了一个关于这个的应用,利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路.地址在这:http://blog.csdn.net/u013761 ...

  6. iOS 52个技巧学习心得笔记 第一章 熟悉OC

    1 .简单了解OC2 .在类的头文件中尽量少引入其他头文件3 .多用字面量语法 少用与之等价的方法 4 .多用类型常量 少用 #define 预处理指令5 .用枚举表示状态,选项,状态码 .简单了解O ...

  7. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  8. 防止ssh暴力破解的小工具denyhosts

    DenyHosts 简介 DenyHosts 是 Python 语言写的一个程序软件,运行于 Linux 上预防 SSH 暴力破解的,它会分析 sshd 的日志文件(/var/log/secure), ...

  9. 《java入门第一季》之Math类一个小案例获取任意数值范围内随机数

    Math:用于数学运算的类. import java.util.Scanner; /* * 需求:请设计一个方法,可以实现获取任意范围内的随机数. * * 分析: * A:键盘录入两个数据. * in ...

随机推荐

  1. WPF 基础 - 图片之界面截图

    1. 功能 系统截图. 2. 实现 2.1 思路 控件继承自 System.Windows.Media.Visual, 通过 System.Windows.Media.Imaging.RenderVi ...

  2. Go语言学习笔记——在本地建立一个官网查看

    命令行内运行 godoc -http=:8080 运行完成后打开浏览器输入网址:http://localhost:8080能看到一个和官网一模一样的网站,然后查看帮助文档

  3. HDU_3359 Kind of a Blur 【浮点型高斯消元+BFS】

    一.题目 Kind of a Blur 二.分析 题目读起来挺费劲的. 主要就是要求一个矩阵,其中每个点及其于这个的曼哈顿距离小于D的点的值总和的平均值就是新生成的矩阵. 给定新生成的矩阵,求初始矩阵 ...

  4. fianl关键词

    一.final关键字概述 final关键字具有最终或不可改变的含义,可用于修饰类.变量.方法.因此被final修饰的类.变量.方法具有以下特征: --final修饰的类不能被继承: --final修饰 ...

  5. 2020年Acm暑期考核Hznu _2797

    题目链接:http://acm.hznu.edu.cn/OJ/problem.php?id=2797 题意:求1-N中有多少数字满足: x是正整数且无前导0. x(mod 666) = S(x). 6 ...

  6. c++ 反汇编 构造函数和析构函数

    构造函数和析构函数出现的时机 局部对象 109: // 局部对象定义调用构造函数 110: 111: CNumber Number; 00C8A37D 8D 4D EC lea ecx,[Number ...

  7. 开源的 Switch 模拟器——GitHub 热点速览 v.21.12

    作者:HelloGitHub-小鱼干 脸滚键盘操作选手小鱼干这里要推荐一个超酷 Switch 模拟器,不能埋没你的游戏天赋.Ryujinx 是一个 C# 写的 Switch 模拟器,1700+ 游戏可 ...

  8. ( ) 与 { } 差在哪?-- Shell十三问<第七问>

    ( ) 与 { } 差在哪?-- Shell十三问<第七问> 先说一下,为何要用 ( ) 或 { } 好了. 许多时候,我们在 shell 操作上,需要在一定条件下一次执行多个命令,也就是 ...

  9. 2020 OO 第一单元总结 表达式求导

    title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...

  10. libnet的使用详解

    最近搬砖需要对libnet进行介绍在这里对知识进行汇总. 1.libnet简介 在libnet出现以前,如果要构造数据包并发送到网络中,程序员要通过一些复杂的接口来处理.libnet的出现,为程序员提 ...