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

程序:

运行

这是一个注册机

随便输入点内容,点击 Check

弹出错误的对话框

逆向:

用 OD 载入程序

在文本框处下断点

按 Alt+B 查看断点

这个断点在动态链接库那里

跑一下程序,输入内容,点击 check

程序停在断点处

在动态链接库的断点处不能进行跟踪和修改

按 Alt+F9 让其回到程序的部分

这里上下都有一个文本框

这里的 eax 的值为 4,是 test 的长度

按 F8 往下走

又进入到刚才的地方,这次是从第二个文本框进来的

按 Alt+F9 回去

 这里 eax 的值为 5,是 12345 的长度

按 F8 往下走

这里调用 lstrlenA 函数获取输入的 test 的长度,为 4

这三条指令,xor esi,esi 将 esi 清零,这个 esi 可能有很大的用处

mov ecx,eax 将 eax 的值传给 ecx,而 ecx 是用来循环计数的,mov eax,1 将 eax 赋值为 1

接下来这一段是一个循环

走进这个循环

edx 被赋予 403038 上的值,就是那个 test,edx 中的 74,73,65,74 分别对应 test 的 ASCII 码值

eax+0x403037 等于 403038

就是把 test 的第一个 t 传给 dl

and edx,0xFF 将 edx 和 0FF 进行与运算

0FF 中的 FF 转换为二进制为 1111 1111,也就是后八位为 1,前面的数为 0

0FF 和 edx 进行与运算之后,使得 edx 后八位不变,也就是 74 不变;前面的 24 位全为 0

mov ebx,edx 将 edx 的值传给 ebx,就是把 74 传给 ebx

imul ebx,edx 将 edx 的值乘 ebx 的值再赋给 ebx,就是十六进制的 74 * 74,为 3490,也就相当于 t * t

然后再把 ebx 的结果加到 esi 中

mov ebx,edx 又把 edx 的值传给 ebx

sar ebx,1 对 ebx 进行偏移计算,ebx 向右偏移 1 位,相当于除以 2,74/2 等于 3A

add ebx,0x3 把 ebx 的值加 3,即 3A+3,等于 3D

imul ebx,edx 将 ebx 乘以 edx,再存到 ebx 中,3D * 74 = 1BA4

将 ebx 的值减去 edx 的值,再存入 ebx,1BA4 - 74 = 1B30

然后再把 ebx 的值加到 esi 上,1B30 + 3490 = 4FC0

add esi,esi 将 esi 的值乘以 2

inc eax 将 eax 的值加 1,dec ecx 将 ecx 的值减 1

捋一下,esi 这一次循环的值为 ['t'*'t' + ('t'/2 * 3)*'t' - 't'] * 2

每次循环,esi 的值都会在原本的基础上运算

结束循环之后

循环过后通过 cmp 指令把 esi 的值和地址 403138 上的值进行比较

如果值相等的话就不执行 jnz 跳转,如果不相等的话就执行跳转,如果 jnz 执行跳转的话,将跳过弹出成功的对话框

这个 403138 是 GetDlgItemTextA 函数获取字符串后存放的缓冲区,值为 12345

也就是说,那个 cmp 指令是把循环后 esi 的值和 12345 进行比较

12345 那个文本框是输入注册码的,循环后 esi 的值可能是根据 test 生成的某个注册码,然后进行对比

所以此时 esi 存放的值是根据 test 生成的注册码

接下来要做的就是获取 esi 的值,也就是根据 test 生成的注册码

找个空白区域写内嵌补丁

按 Alt+M 查看数据段的地址

为 439000

把 439000 出开始的数据段作为一个临时存放区

修改 jnz 跳转指令

让其执行跳转的时候跳到内嵌补丁那

在内嵌补丁这添加一条跳转指令,让其跳回到原先 jnz 跳转到的地方

接下来修改 MessageBox 的内容,让其弹出的内容是注册码

第二个参数是消息框的内容,就是这第二个入栈的内容

修改为显示注册码的内容

运行程序

没有显示正确还是错误,而是显示了一个乱码

编写注册机

C:

#include <stdio.h>
#include <string.h>

int main(void)
{
	int i, len, result = 0;
	char str[] = "test";
	
	len = strlen(str);
	
	for (i = 0; i < len; i++)
	{
		result += str[i]*str[i] + (str[i]/2 + 3)*str[i] - str[i];
		result *= 2;
	}
	printf("%d\n",result);

	return 0;
}

运行结果

十进制 571152 的十六进制为 8B710

转载于:https://www.cnblogs.com/sch01ar/p/9751679.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL Developer 是一款集成开发环境,专门面向 Oracle 数据库存储程序单元的开发。 如今,有越来越多的业务逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。 PL/SQL Developer侧重于易用性、代码品质和生产率,以及 Oracle 应用程序开发过程中的重大优势。 报告 ——PL/SQL Developer提供内置的报告功能,您可以根据程序数据或Oracle字典运行报告。PL/SQL Developer本身提供了大量标准报告,而且您还可以方便的创建自定义报告。自定义报告将被保存在报告文件中,进而包含在报告菜单内。这样,运行您自己经常使用的自定义报告就非常方便。您可以使用Query Reporter免费软件工具来运行您的报告,不需要PL/SQL Developer,直接从命令行运行即可。 工程 ——PL/SQL Developer内置的工程概念可以用来组织您的工作。一个工程包括源文件集合、数据库对象、notes和选项。PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单, To-Do条目 ——您可以在任何SQL或PL/SQL源文件中使用To-Do条目快速记录该文件中那些需要进行的事项。以后能够从To-Do列表中访问这些信息,访问操作可以在对象层或工程层进行。 对象浏览器 ——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。此外,该对象浏览器还可以显示对象之间的依存关系,您可以递归的扩展这些依存对象(如包参考检查、浏览参考表格、图表类型等)。 性能优化 ——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息。该统计信息包括CPU使用情况、块I/O、记录I/O、表格扫描、分类等。 HTML指南 ——Oracle目前支持HTML格式的在线指南。您可以将其集成到PL/SQL Developer工作环境中,以便在编辑、编译出错或运行时出错时提供内容敏感帮助。 非PL/SQL对象 ——不使用任何SQL,您就可以对表格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/SQL Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/SQL Developer就将生成相应的SQL,从而创建或转换对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值