程序:

这个窗口显示这是一个需要去除的 Nag 窗口

点击“确定”

用 PEiD 看一下

这是一个用汇编语言写的程序

逆向:

用 OD 载入程序

Nag 窗口的标题和文本

右键 -> 查找 -> 所有参考文本字串

只有这两条

下一个断点,跑一下程序

该 NAG 窗口还是弹出来了

点击“确定”

然后关掉程序,始终没有停在断点处

说明该处只是干扰项

往上拉

看到一些奇怪的字符,这些是 OD 识别不了的一些代码

右键 -> 分析 -> 从模块中删除分析

代码就变得正常了

第一个 call 语句获取模块的句柄

往下走

把 00401011 存在 edi 中

按 F7 步入该 call 语句

这是一个循环,循环结束后 retn 返回

mov eax,ReverseM.00401000 把 ReverseM.00401000 上的值赋值给 eax

xor byte ptr ds:[eax],0x5A 把 eax 的值按字节跟 0x5A 进行异或

看一下地址 00401000 上是什么内容

00401000 所处的位置为代码段,对它进行异或操作就是修改它的代码

在十六进制窗口看地址 00401000 的变化

按 F8 往下走,可以在十六进制窗口看 00401000 值的变化

inc eax 就是循环一次,递增 eax,也就是递增代码段的地址

直到代码段的地址为 00401218 的时候才结束循环

也就是对 00401000 到 00401218 这一段代码指令与 0x5A 按字节进行异或操作

而这段代码就是 OD 识别不出来的这段代码

所以该异或操作可能是对这段代码进行解密

F8 往下走,通过 retn 返回

然后按 F7 步入该 call 指令

xor eax,eax 将 eax 清零

将 0x6A 赋值给 edi

他修改了自己的代码,将 xor eax,eax 改为了 push 0x0

继续往下走

此时 edi 的值为 00401024

0x44EB 覆盖了 00401024 和 00401025,所以代码从 00401011 开始被改到 00401025

执行完 sub 指令后变为 00401000

右键 -> 分析 -> 分析代码

这里多出了个 MessageBox 函数,内容都是乱码

按 F7 步入那个 call edi 指令

这是一个循环

这段指令像刚才的指令一样,是一段解密代码,对从 00403000 到 00401005 的代码进行解密

当走完这个解密循环,刚才的乱码就变成了可以看懂的字符串

往下走,走到调用 MessageBox 函数处

弹出 NAG 窗口

接着往下走,是 jmp 指令

跳转到该处

add edi,0x11 使 edi 的值加 11

mov word ptr ds:[edi],0xA6A 对 edi 进行覆盖

接着往下走

0x2CEB 覆盖了 00401026 和 00401027,所以代码从 00401011 开始被改到 00401027

步入该 call 函数

往下走,调用 call

出现了 NAG 窗口

关掉 NAG 窗口后,程序到下一条语句

接着往下走

它会直接跳到该 call 指令上

按 F7 步入

这可能又是一个解密的过程

从 00403000 开始,00403000 是数据段区域

这些是 NAG 窗口的字符串

执行该过程

数据变为乱码,看来这是一个加密的过程

接着往下走,走出该 call 区域

步入该 call 指令

调用 ExitProcess 函数结束进程

走完程序就退出了

破解:

方法一:

修改 hOwner 的值,指定一个无效的父进程

运行完 call 语句之后不会弹出 NAG 窗口

重新载入程序,看一下程序在哪里修改了 0040101D 和 0040101E

步入该 call 指令

edi 从 00401011 开始

往下走,找到修改 0040101D 和 0040101E 的地方

在这里修改了 0040101D,mov word ptr ds:[edi],0x6A,这里的 0x6A 就是 6A00

在这里,要把 6A00 修改为 6A01

这里不能直接修改,因为这段代码要跟 0x5A 进行异或操作,所以 01 是跟 0x5A 进行异或后的结果

0x5A 跟 z 进行异或得到 1,那么 0x5A 跟 1 进行异或得到 z

5A xor 1 = 5B

要修改的 00 地址为 00401039

查找它在内存中的位置

改为 5B

点击“确定”

代码处也被修改了

保存程序,运行

程序只弹出了这个窗口

方法二:

将调用 MessageBox 函数之前的一条语句改为 jmp 跳转语句,直接跳过调用 MessageBox 函数,调转到原先需要跳转到的地方

执行

它直接跳转到该地方来了,没有弹出 NAG 窗口

机器码为 EB 57,地址为 00401011 和 00401012

重新载入程序,找到修改这两个地址的地方

这里需要对 6A00 进行修改,地址分别为 00401016 和 00401017

EB xor 5A = B1,57 xor 5A = 0D

修改完后为

保存程序,运行

程序报错

我们得在内存中修改

双击修改

分别改为 B1 0D

接下来保存程序

选中修改的地方,右键 -> 复制到可执行文件

右键 -> 保存文件

运行程序

OD 实验(十九) - 对多态和变形程序的逆向的更多相关文章

  1. OD 实验(十六) - 从对话框入手对程序的逆向

    对话框: 对话框从类型上分为两类:modal 对话框和 modeless 对话框,就是模态对话框和非模态对话框,也有叫成模式和非模式 模态对话框不允许用户在不同窗口间进行切换,非模态对话框允许用户在不 ...

  2. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十九:SDRAM模块② — 多字读写

    实验十九:SDRAM模块② — 多字读写 表示19.1 Mode Register的内容. Mode Register A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A ...

  3. 【iCore3 双核心板_FPGA】实验十九:基于双口RAM的ARM+FPGA数据存取实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1pLReIc7 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  4. 【iCore4 双核心板_FPGA】实验十九:使用JTAT UART终端打印信息

    实验指导书及源代码下载地址: 链接:https://pan.baidu.com/s/1c3mqDkW 密码:4x9h iCore4链接:

  5. OD 实验(十八) - 简单注册机的编写

    程序: 运行 这是一个注册机 随便输入点内容,点击 Check 弹出错误的对话框 逆向: 用 OD 载入程序 在文本框处下断点 按 Alt+B 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...

  6. OD 实验(十五) - 对一个程序的逆向

    程序: 打开程序 出现一个 NAG 窗口 这是主界面 点击 Exit 程序出现 NAG 窗口,然后退出 用 PEiD 看一下 是用 VC++ 6.0 写的程序 逆向: 用 OD 载入程序 跑一下程序 ...

  7. OD 实验(十四) - 内嵌补丁

    内嵌补丁(inline patch): 内嵌补丁指在程序文件中把补丁代码写入文件里面达到破解的目的 如果修改某行语句会影响后面的语句,例如某语句占用 3 个字节,修改完变为 5 个字节,会覆盖后面的语 ...

  8. OD 实验(十二) - 对一个 Delphi 程序的逆向

    程序: 运行程序 界面显示的是未注册 点击 Help -> About 点击 Use Reg Key 这里输入注册码 用 PEiD 看一下 该程序是用 Delphi 6.0 - 7.0 写的 逆 ...

  9. OD 实验(十) - 对一个 VB 程序的逆向

    前话: VB 程序用 OD 进行逆向的话,可以先查找相关的变量和字符串,以寻找突破口 变量: __vbaVarTstEq __vbaVarCompEq __vbaVarTstNe __vbaVarCo ...

随机推荐

  1. Java基础面试题 (一)

    1.面向对象的三个特征 封装,继承,多态.这个应该是人人皆知,有时候也会加上抽象. 2.多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息 ...

  2. win8 ie10 debug flex

    win8 ie10 使用flash debug方法: 删除c:\WINDOWS\system32\Macromed\Flash.c:\WINDOWS\SysWOW64\Macromed\Flash里面 ...

  3. PHP 关于empty和isset对于参数的判断结果

    <?php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = ...

  4. matlab 相关系数的计算

    1. 首先说说自相关和互相关的概念.     这 个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号 x(t),y ...

  5. Hadoop常见错误问题及解决方法总结二

    问题导读:1.遇到问题该如何排除错误?2.看不到namenode的可能原因是什么?3.地址占用该如何解决?4.could only be replicatied to 0 nodes, instead ...

  6. 使用 openresty 修改请求内容

    1. 目的    动态修改 html 页面内容   2. 使用方式    openresty  在 header_filter 阶段 以及body_filter 阶段进行数据修改   3. 源码  此 ...

  7. 将 PCB 文件转换为可读的文本

    将 PCB 文件转换为可读的文本 将元件转成列表. 坐标也放到列表中. 以元件号为排序. 使用 json 格式,并格式,方便对比. 元件网络转成单独文件. 特殊说明生成单独文件.

  8. php查询mysql数据库 查询条件替中文字符串变量时无法查询

    $temp2 ='十年';mysql_query("SET NAMES GBK"); $res = mysql_query("select songer_name fro ...

  9. 关于FPGA供电

    FPGA是一种多电源需求的芯片,主要有3种电源需求: VCCINT:核心工作电压,PCI Express (PCIe) 硬核IP 模块和收发器物理编码子层(PCS) 电源.一般电压都很低,目前常用的F ...

  10. VS2017更新后无法使用stdlib.h

    这几天用VS写代码,每次打开工程就卡死,在网上找不到解决方法,于是想更新下vs碰碰运气. 更新后,打开速度恢复往日那般,但是代码中,提示我找不到 stdlib.h. 于是在电脑中,搜寻stdlib.h ...