OllyDbg 使用笔记 (十四)

参考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

示例程序下载地址:http://pan.baidu.com/s/1hqqYZ6c

此程序运行前会有一个nag窗口,运行结束后也有一个nag窗口。破解目的要去除这两个nag窗口。

用OD加载这个程序,按F9运行,当第一个nag窗口出现时,按下暂停。查看 堆栈调用

图片1

观察这些调用,查找产生这个nag窗口的调用,此程序是用VC6.0++写的,使用MFC,可以发现此次dialog非常关键

图片2

点击它的“调用来自”  可以看到下面代码:

图片3

在0042039A处下断点,重新运行程序。可以发现程序运行前的nag窗口,程序窗口,和程序运行后的nag窗口都是由0042039A处的

call    <jmp.&MFC42.#2514_CDialog::DoMod>产生,所以只要第一次跟第三次让程序跳过0042039A处的call    <jmp.&MFC42.#2514_CDialog::DoMod>,让第二次运行0042039A处的call    <jmp.&MFC42.#2514_CDialog::DoMod>。再仔细观察它前后的代码,可以发现je      short 004203BA 很关键,它可以跳过call    <jmp.&MFC42.#2514_CDialog::DoMod>。
我们可以把它改成一个程序对一个变量计数,当变量为1或3时跳过call    <jmp.&MFC42.#2514_CDialog::DoMod>,为2使执行call    <jmp.&MFC42.#2514_CDialog::DoMod>。

我们可以用内嵌补丁,可以在程序代码最后面找到一片空白的区域,例如这里就用00437D70。

先把je      short 004203BA 改成    jmp     00437D70 ,由于原来的代码只占2个字节,改后的代码占用5个字节,lea ecx, dword ptr [esp+4C] 会被覆盖。 在00437D70敲入代码,因为敲 的代码表多,一行一行的改没有效率,可以用NonaWrite这个插件来写代码(下载地址:http://tools.pediy.com/Debuggers/ollydbg/ollydbg1/plugin/NonaWrite/NonaWrite1.2.rar,下载后,直接解压到od目录下的plugin文件夹中),打开插件,敲入

0x00437D70:
lea ecx, dword ptr [esp+4C]
inc byte ptr  [445EE0]
cmp byte ptr [445EE0],2
je 0042037F
jmp 004203BA

图片4

点击Assemble再点击Done(不要忘记点Done,否则运行会有问题),保存修改,即可完成破解。代码中[445EE0]被当做一个变量,相当于 i ,445EE0 这个地址是随便选的,只要是程序的数据区中空白的切不会再运行中用到的地方即可。按alt+M从内存映射表中点击 .data 即可查看数据区,在数据区后面的地方,就可以看到大片空白的地方。如果不缺定空白的地方是否会在程序运行时被使用,只要在想要用的地方下硬件写入断点,运行程序观察是否被断下即可。

时间: 2024-10-11 08:50:10

OllyDbg 使用笔记 (十四)的相关文章

OllyDbg 使用笔记 (四)

参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 RegisterMe程序下载地址:http://pan.baidu.com/s/1gd3l4XH 这个RegisterMe程序,运行前和运行后都会有neg窗口.破解目标,去除这个两个窗口. 用OD直接打开这个程序,我们会发现出错.也可能OD会卡死. 因为这个程序的PE文件被故意修改了. 我们先到 选项---> 调试设置 --> 事件 --> 选择系统断点. 图片1 这样用OD打开就不会卡死. 按 alt + M 来到 m

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一个未知的状态. 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值.以下章节将详细介绍这两种方法. 注意: 当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers). 一.基本语法 class Human{ var name :String init(){ name = "human" } init(n

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

Oracle基础笔记十四

第十四章 高级子查询 1.子查询 子查询 (内查询) 在主查询执行之前执行 主查询(外查询)使用子查询的结果 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM  table); 问题:查询工资大于149号员工工资的员工的信息 SELECT last_name FROM   employees WHERE  salary > (SELECT salary FROM   employees WHERE

《Inside C#》笔记(十四) 反射

通过反射可以在运行时动态地获取一个应用的元数据. 一 反射相关的类和方法 与反射相关的类处在System.Reflection命名空间下,包括Assembly.Module.MethodInfo.FieldInfo.PropertyInfo.EventInfo. a)Type类 System.Type类是反射机制的核心.Type类本身是一个抽象类,代表CTS通用类型系统中的某个类型. 对于已经实例化的对象,可以使用<对象名称>.GetType()来取得Type类.另外也可以使用静态方法Type

TCP/IP详解 笔记十四

TCP/IP协议(二)  连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括连接建立和终止) 标识解释:S 1415531521:1415531521(0) win 4096 <mss 1024> S(SYN):代表建立一个连接 1415531521:1415531521(0) :本次传送的首字节序号是1415531521(这里是ISN),尾字节序号是1415531521

【转】angular学习笔记(十四)-$watch(1)

本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: 需要被检测的对象,可以是以下任意一种: 1. 某个数据,监测这个数据的值是否发生变化 2. 一条angular表达式,监测表达式的结果是否发生变化 3. 函数(),监测函数的返回值是否发生变化 注意,以上三种,无论是哪种,都应该是字符串格式,并且都是在$scope作用域下执行的. 4.函数,非字符

How tomcat works 读书笔记十四 服务器组件和服务组件

之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apache.catalina.Server接口的实例用来表示Catalina的整个servlet引擎. 我们使用Server就是因为,它用一种优雅的方式来启动/关闭整个系统. 下面是启动和停止机制是如何工作的.当服务器启动的时候,它启动它内部的所有组件.然后无限期的等待关闭命令,如果你想要关闭系统,发送

Java笔记十四.深入理解类和对象(1)

Java是一种完全面向对象的编程语言(C是面向过程).所谓面向对象编程(OOP),即是一种编程风格,它通过给程序中加入扩展语句,把函数"封装"进编程所必需的"对象"中.OOP 达到了软件工程的三个主要目标:重用性.灵活性和扩展性.其实,面向对象就是把一切东西看成一个个对象,比如人,车,面包,等等,然后把这些对象拥有的属性变量,比如年龄,民族,工作地点,变质期,寿命,还有操作这些属性变量的函数(方法)打包成一个类来表示,这个类的一个抽象就是一个对象.在Java程序中,