熟悉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. ORM思想解析

    ORM思想解析 qq_16055765 2019-01-10 11:29:08 1688 收藏 1 分类专栏: # hibernate 最后发布:2019-01-10 11:29:08首次发布:201 ...

  2. go-优雅地关机或重启

    目录 优雅地关机或重启 优雅地关机 什么是优雅关机? 如何实现优雅关机? 优雅地重启 总结 优雅地关机或重启 我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kil ...

  3. Django之cookie 与session组件

    一.会话跟踪技术 1.1 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  4. 技术分享PPT整理(一):Bootstrap基础与应用

    最近在复习的时候总感觉有些知识点总结过,但是翻了一下博客没有找到,才想起来有一些内容是放在部门的技术分享里的,趁这个时候跳了几篇相对有价值的梳理一下,因为都是PPT,所以内容相对零散,以要点和图片为主 ...

  5. Ingress-nginx工作原理和实践

    本文记录/分享 目前项目的 K8s 部署结构和请求追踪改造方案 这个图算是一个通用的前后端分离的 k8s 部署结构: Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二 ...

  6. 半监督学习方法(Semi-supervised Learning)的分类

    根据模型的训练策略划分: 直推式学习(Transductive Semi-supervised Learning) 无标记数据就是最终要用来测试的数据,学习的目的就是在这些数据上取得最佳泛化能力. 归 ...

  7. C语言之动态内存管理

    C语言之动态内存管理 大纲: 储存器原理 为什么存在动态内存的开辟 malloc() free() calloc() realloc() 常见错误 例题 柔性数组 零(上).存储器原理 之前我们提到了 ...

  8. Java例题_48 四位数据加密

    1 /*48 [程序 48 加密] 2 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 3 加密 规则如下: 4 每位数字都加上 5,然后用和除以 10 的余数代替该数字 ...

  9. java例题_05 判断分数等级

    1 /*5 [程序 5 判断分数等级] 2 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90 分的同学用 A 表示,60-89 分之间的用 B 表示,60 分以下的用 C 表示. 3 程序 ...

  10. ACNet:用于图像超分的非对称卷积网络

    编辑:Happy 首发:AIWalker Paper:https://arxiv.org/abs/2103.13634 Code:https://github.com/hellloxiaotian/A ...