用OllyDbg做破解[转]

摘要:
一位朋友请我帮忙破解一个MFC小程序,他很想使用它(背景:几个人一起创业,其中一人负责用一个小核心编写这个项目。为了巩固自己的“地位”,他耍了一个小把戏,必须通过自己的阴茎来使用~~~)虽然我做了很多C++,相对来说比较原生,但我对汇编和破解的理解有限。去年,我的朋友也来找我,因为我正忙着换公司,所以我向另一位朋友求助。这次我最好花点时间研究一下。工具?看来风笛只能

朋友所托,要帮忙破解一个MFC的小程序,他急等着用 (背景:几个人合伙创业,其中一个负责写这个有点小核心的项目,为了巩固自己的”地位“搞的小把戏,给加了密,要用必须通过他 - 我艹~~~)。

虽说自己搞C++比较多,相对来讲native一点,但是对于汇编与破解,了解相当有限,去年这朋友也找过我,因为当时刚换公司比较忙,是求助另外一好友才搞定的。这次还是自己花点时间研究研究吧。工具吗,用windbg貌似只能看,softice与ollydbg之间,选择了ollydbg。

一、基础知识

ollydbg是一个动态反汇编分析调试工具,其功能强大的令人发指,而且居然还是免费的,其官方地址为:http://www.ollydbg.de/,下载与介绍都在上面。

要用ollydbg做破解,最好先过一遍下面的知识点:

  1. 了解汇编语言的基本结构,特别是函数的调用与返回,参数传递等,可以参考这篇文章:反汇编深入分析函数调用, 简短却又清晰,切中要点,我配合visualstudio的反汇编窗口执行了几遍,基本掌握了其结构。(我自己也维护了一个分析:https://gist.github.com/2904354)
    另外,Intel这三大卷:Intel® 64 and IA-32 Architectures Software Developer Manuals也是非常经典的参考资料,没必要读,但不理解时可以查查,尤其是第一卷中的基本结构介绍和第二卷的指令集介绍。
  2. OllyDbg入门完全教程(完美排版), 非常详尽的介绍了ollydbg的各个组成部分及功能,40来页的内容,花一个小时过一遍就可以了。
  3. OD入门系列图文详细教程-破解做辅助起步,通过一个例子详细解释了破解的全过程,非常有用。其中文中用到的看雪《加密与解密》书中的程序crackme可以在这里下载到:http://download.csdn.net/detail/tokey003/3672236

二、实例操作

先是一个非常简单的helloworld程序,源码如下:

复制代码
 1 #include <cstdio>
 2 #include <windows.h>
 3 
 4 #pragma comment(lib, "user32.lib")
 5 
 6 void printHelloWorld(int a)
 7 {
 8         MessageBox(NULL, "Hello, World", "Greetings", MB_ICONWARNING);
 9 }
10 
11 int main()
12 {
13         bool bMsgBox = false;
14         if(bMsgBox)
15         {
16             printHelloWorld(10);
17         }
18         else
19         {
20             printf("Hello, World");
21         }
22 }
复制代码

该程序总是在console输出"Hello, World",现在要修改其binary,使其总是弹出一个MessageBox。

编译并使用ollydbg打开,因为我知道要传一个参数10到printHelloWorld函数中去,可以肯定会有一个指令:PUSH 0A,关键代码在其附近,在反汇编窗口搜索定位:

用OllyDbg做破解[转]第3张

可以看到,在PUSH 0A前面是一个条件判断,对应源代码中的那个判断,于是不难推出,Mov BYTE PTR SS:[LOCAL.1+3],0就是给bool型变量bMsgBox赋值的指令,0就是false。

于是,在这里双击该指令,把0改成1,运行便看到程序弹出了messagebox。

注意,为了保存修改过的可执行文件,你需要:

  • 右键-Edit-Copy to executable, 弹出该二进制文件的内容窗口
  • 右键 - Save file

三、破解

需要破解的程序,其行为是:在任何一台机器上使用该程序,你需要输入一个授权码,该授权码由特定程序通过系统信息产生,其工作流程为:

  1. 在客户电脑上运行该程序,获取系统信息(一个字符串)
  2. 将该字符串发给授权人,他有一个工具会产生授权码,并发给使用者
  3. 使用者输入该授权码,程序验证,如通过则可使用。

单从行为上分析,突破口在于授权验证这一步,该程序要验证输入的授权码是否正确,也就是说它肯定知道正确的验证码,也就是说由系统信息产生授权码的算法也是内置在客户程序这边的,我们只不过需要一个办法把它读出来。

该验证步骤是:获取系统信息,并个根据该信息产生正确的授权码,然后从某文本文件读入用户输入的验证码,对两者进行对比,如果成功,则弹出一个messagebox:output(true), 否则就是output(false)。根据以上信息,设置以下断点:

  • 菜单View-executable modules - show names,找到ReadFile和MessageBoxA,打上断点
  • 在反汇编窗口右键,Search for - all referenced strings, 找到output字符串,并设断点

有了这几个断点,你就可以在运行中观察寄存器/栈/内存等内容,以及汇编指令来了解整个程序的运作机理。多走几遍,多观察思考,适当添加断点与注释。特别注意哪些条件测试指令与call指令,确定其行为后继续跟进去。

这样,就找到了其内部获取系统信息的函数调用,与根据系统信息算出授权码的函数调用,从而得到了正确的授权码,结束。

当然,要做的好一点的话,还可以:

  • 分析其授权码产生函数的算法,自己写一个产生器
  • 或者,动态修改其可执行文件,将其产生的授权码用一个MessageBox输出。

但对于第一项,这需要阅读很多汇编代码,我没时间;对于第二项,需要插入对windows API函数的调用,这比简单的修改一个指令要复杂,暂时还不会,也不打算仔细研究。毕竟,是朋友所托,完成任务即可,不打算仔细研究 - 我还有很多其他重要的事情要做。

四、技巧总结

  • 你可以通过猜测可能调到的Windows API函数,设置断点作为突破口
  • 你也可以通过可能reference到的字符串设置断点
  • 查到指令也是一个方法,但估计不是很有用 - 在没有源代码的情况下你很难预测一个特殊的指令被调用到了
  • 选中指令后,你可以右键-help on command来查到汇编指令帮助
  • 你可以双击汇编指令进行修改
  • 你可以添加注释 - 在一个漫长的破解过程中,记下你发现的是蛮重要的
  • 选中指令后,你可以看到其跳转关系
  • 我还很初级,这个强大的工具有更多技巧去发现。

免责声明:文章转载自《用OllyDbg做破解[转]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇利用Python将excel数据读取到word表格ClickHouse 简单使用(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SAP 增强篇 Method1 BADI增强的查找方法

查找BADI的方法:(1)通过SE24,输入CL_EXITHANDLER,然后在方法GET_INSTANCE中设置断点,然后运行事务代码判断 exit_name的值,操作过程如下:输入se24,然后输入cl_exithandler 找到 GET_INSTANCE 方法,双击get_instance设置断点查看exit_name的值:   示例:  我们...

[转]iOS高级调试&amp;amp;逆向技术-汇编寄存器调用

前言 本文翻译自Assembly Register Calling Convention Tutorial 序言 通过本教程,你会可以看到CPU使用的寄存器,并探索和修改传递给函数调用的参数。还将学习常见的苹果计算机架构以及如何在函数中使用寄存器。这就是所谓架构的调用约定。 了解汇编是如何工作的,以及特定架构调用约定是如何工作是一项极其重要的技能。它可以...

PIC中档单片机汇编指令详解(7)完

GOTO 程序无条件跳转到指定的地址 语法形式:GOTO m 操作数:m为11位立即数指定的目标地址 执行时间:2个指令周期 执行过程: m→PC【10:0】 PCLATH【4:3】→PC【12:11】 状态标志影响:无 说明:程序无条件立即强行跳转到目的地址处继续执行。目的地址由本指令内含的11位地址码和特殊寄存器PCLATH中的【4:3】一起构成完整的...

基于python3.x IDAPython第二讲 段 函数 汇编指令等操作

目录 IDA Python 之 汇编指令丶 段丶 函数 一丶简介 二丶汇编中的指令操作 三丶IDA中的段操作 四丶IDA中的函数操作 IDA Python 之 汇编指令丶 段丶 函数 一丶简介 ​ 在IDA中我们常见的就是汇编. 段. 交叉引用. 这一讲我们就介绍一下汇编指令与段操作.前面文章导航[第一讲地址操作字节操作][https://www...

Xcode基本操作

[From] http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码编辑窗口(Standard/Primary Editor)”。...

【转】针对Android上的ROP攻击剖析

引言ROP(Return-oriented programming),即“返回导向编程技术”。其核心思想是在整个进程空间内现存的函数中寻找适合指令片断(gadget),并通过精心设计返回堆栈把各个gadget拼接起来,从而达到恶意攻击的目的。构造ROP攻击的难点在于,我们需要在整个进程空间中搜索我们需要的gadgets,这需要花费相当长的时间。但一旦完成了...