程序:

运行程序

弹出一个对话框,点击 OK

来到主界面,点击 Help -> Register Now

这是输入注册码的地方

按关闭程序的按钮

会提示剩下 30 天的使用时间

用 Resscope 载入程序

在 Dialog 下找到程序要退出时的那个对话框

在 100 处找到该对话框

103 为 lpTemplateName 对话框模板

逆向:

用 OD 载入程序

右键 -> 查找 -> 所有命令

64 为 100 的十六进制

找到很多 push 0x64 的指令

右键 -> 在每个命令上设置断点

跑一下程序

程序停在该断点处,此时程序还没运行起来,而且那个对话框是在程序被关闭的时候弹出的

按 F9 继续运行

程序运行起来后,直接关闭程序

此时停在该断点处,该处就是要弹出对话框的地方,可以把其它断点都去掉了

这个 call 指令就是显示模态对话框的指令

往上拉一点

这里有个 je 跳转指令,如果执行跳转的话,将跳过那个 call 指令

je 指令上面的 cmp 指令把 eax 和 1 进行比较,如果 eax 等于 1,就能执行跳转

而 eax 的值是 call 指令调用的函数返回的值

在 call 指令下一个断点,跑一下程序

按退出程序的按钮之后,停在了 call 断点处

按 F7 步入

按 F8 往下走

在这里调用了一个 API 函数 RegOpenKeyEx,这个 API 函数用于打开一个注册表的键,注册表键值不区分大小写

该函数如果调用成功,则返回0(ERROR_SUCCESS)。否则,返回值为文件 WINERROR.h 中定义的一个非零的错误代码

按 F8 接着往下走

这条指令把 API 函数 RegQueryValueEx 的地址传给 esi

按 F8 接着往下走

这里有个 call esi,就是调用 RegQueryValueEx 函数

RegQueryValueEx 用于检索一个已打开的注册表句柄中,指定的注册表键的类型和设置值

函数调用成功的话返回 0,如果失败返回错误代码

函数原型:

LONG WINAPI RegQueryValueEx(
HKEY hKey, // 一个已打开项的句柄,或者指定一个标准项名
LPCTSTR lpValueName, // 要查询注册表键值的名字字符串,注册表键的名字,以空字符结束
LPDWORD lpReserved, // 未用,设为零
LPDWORD lpType, // 用于装载取回数据类型的一个变量
LPBYTE lpData, // 用于装载指定值的一个缓冲区
LPDWORD lpcbData // 用于装载lpData缓冲区长度的一个变量,一旦返回,它会设为实际装载到缓冲区的字节数
);

RegQueryValueEx 会把找到的键的值存放到数据缓冲区

它的参数按反依次对应

该函数要拿到 RegName3 键的值,把结果存到 edx 的地址中

edx 对应 lpData,ecx 对应 lpcbData

edx、ecx 分别为这两个地址

调用完该函数后,该函数返回 2,也就是调用失败,因为在注册表中找不到 RegName3

按 F8 接着往下走

走到一个跳转已实现的跳转指令

如果该跳转指令实现跳转的话就会跳到函数的末尾

如果该跳转指令不实现跳转,接着往下走

就会再一次调用 RegQueryValueEx 函数,这次是要查找 RegCode3 键的值

会存放到 edx 的地址中

按 F8 接着往下走

这个跳转指令也是跳转到函数的末尾

让其不跳转

这两句把这两个地址传给 edx 和 ecx,而这两个地址刚才都传给 edx 过,用来存放 RegName3 和 RegCode3 的结果

分别将 ecx 和 edx 入栈,然后通过 call 调用一个函数来验证他们

按 F7 步入

该函数有两个返回值

一个为 1,一个为 0

按 F8 往下走

有个已实现的跳转

如果跳转将跳过返回值为 1 的 retn

不让其跳转,接着往下走

接下来的三条跳转指令都是跟第一条语句一样的跳法,看来返回值为 1 才是我们想要的

让这三条语句不跳,继续往下走

这是最后一个跳转指令,让它不跳

接着往下走

函数返回了 1

接着往下走,一路默认

走到 retn 指令,此时 eax 的值还是为 1

eax 的值为 1,cmp 指令把 eax 的值 和 1 比较,如果相等,je 就执行跳转

跳转就跳过了调用对话框的那个 call 指令

OD 实验(十七) - 对一个程序的逆向分析的更多相关文章

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

    程序: 运行程序 点击 Start,它就会进行对系统的扫描 点击 About -> Enter Registration Code 随便输入一下内容,点击 OK,会弹出该弹窗 用 PEiD 看一 ...

  2. OD 实验(八) - 对一个程序的逆向

    程序: 运行 弹出 NAG 窗口,提示要花 20 美元注册 然后会进入主窗口 提示剩余 5 天的使用时间 点击,菜单栏 -> Help -> About 显示未注册版本 逆向: 用 OD ...

  3. OD 实验(七) - 对一个程序的破解和去广告

    程序: 这里有很多的动态链接库 双击运行程序 这个程序有次数限制 按钮也在隐藏处 主界面 退出程序,会弹出一个广告 目的: 让程序的使用次数不受限制,且没有显示次数的窗口 去除程序关闭时候的广告 逆向 ...

  4. OD 实验(十一) - 对一个程序的破解

    程序: 点击安装程序 这是一个拼图程序 点击 Options -> Flash Sizes 程序会提示是未注册版本 点击一些选项的时候会提示该程序只给注册的用户 点击 Register 随便输入 ...

  5. OD 实验(九) - 对一个程序的破解

    程序: 运行程序 点击 About 这是要注册的 点击 Register 输入邮箱和注册码,点击 Register Now 逆向: 用 OD 打开程序 右键 -> 查找 -> 所有参考文本 ...

  6. OD 实验(六) - 对一个程序的破解

    程序: 双击进行安装,安装过程默认就好了 安装完成 运行程序 输入 User 为 sch01ar,点击 Create 点击 Log In 这里显示为未注册版本 看看未注册版本有哪些功能被限制 这里会显 ...

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

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

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

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

  9. .net的程序的逆向分析。

    背景:碰到一个由c#写的exe,由于之前没有分析过.net的程序,记录下分析流程. 1)peid加载判断类型,可以看出没有加壳. 2)搜索c#的反编译以及调试工具. 1.NET.Reflector以及 ...

随机推荐

  1. 《gradle 用户指南中文版》目录

    gradle 用户指南 版权所有©2007-2017 Hans Dockter,Adam Murdoch只要您不对这些副本收取任何费用,并且进一步规定,每个副本都包含本版权声明,无论是以印刷版还是电子 ...

  2. 特征金字塔网络 FPN

    一. 提出背景 论文:Feature Pyramid Networks for Object Detection  [点击下载] 在传统的图像处理方法中,金字塔是比较常用的一种手段,像 SIFT 基于 ...

  3. [置顶] Deep Learning 学习笔记

    一.文章来由 好久没写原创博客了,一直处于学习新知识的阶段.来新加坡也有一个星期,搞定签证.入学等杂事之后,今天上午与导师确定了接下来的研究任务,我平时基本也是把博客当作联机版的云笔记~~如果有写的不 ...

  4. RxJava 1.x 笔记:创建型操作符

    本篇文章是阅读 官方文档 的笔记. 作者:shixinzhang(百度搜索 "shixinzhang CSDN" 即可找到我) RxJava 也用了有段时间,那么多操作符总不想去记 ...

  5. 编程技巧:使用异或操作符(XOR)交换两数值

    异或(exclusive OR)作为4种逻辑操作符之一,相对其他3种(OR/AND/NOT)来说,出场的次数非常少,是因为在日常开发中能用到它的场景本来就不多.对笔者来说,目前接触到场景只有交换两个数 ...

  6. getPropertyValue (实现 js框架中 css 的最终调用的函数)

    ,取得元素最终计算出的css 样式 var a = document.getElementById("content");    alert("style "+ ...

  7. docker学习(一)在centos7上安装与启动docker

    CentOS Docker 安装 1.Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS ...

  8. Java并发--并发容器之CopyOnWriteArrayList

    原文链接:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容, ...

  9. Atcoder Beginner Contest 118

    A: B +/- A 签到题. B: Foods Loved by Everyone 签到题. C: Monsters Battle Royale 怪物的血量一直两两相减,类似于辗转相减法. 可以证明 ...

  10. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...