[TOC]



【软件名称】：Dope2112.2.exe



【软件大小】：171kb



【下载地址】：自行搜索下载



【加壳方式】：无壳



【保护方式】：Name/Serial



【编译语言】：Delphi



【调试环境】：W10 64



【使用工具】: OD+IDA



【破解日期】：2019-5-28



【破解目的】：纯属兴趣



## 导入符号



首先将程序载入到IDA，导入所有的Delphi签名



![1558999174416](assets/1558999174416.png)



接着生成map文件



![1558999202012](assets/1558999202012.png)



然后在OD中导入



![1558999232923](assets/1558999232923.png)



## 用CE寻找切入点



由于不能用DarkDe，而且无法搜索到字符串，我试了好几个API断点也断不下来，所以只能用CE来搜索地址，首先用OD载入，然后再打开CE，这样可以省去后面再用OD附加的麻烦



由于Delphi中存储的都是ASCII的形式，所以我们直接搜索1111的十六进制ASCII值31313131



![1559001183449](assets/1559001183449.png)



接着变换1111为2222



![1559001325317](assets/1559001325317.png)



可以很明显的看到我们要的地址就是这两个中的一个了



找到上面两个地址，依次对下面两个地址下一个字节的内存访问断点



![1559001400942](assets/1559001400942.png)



![1559001431437](assets/1559001431437.png)



程序断下



![1559001599409](assets/1559001599409.png)



接着点击K，查看调用堆栈



![1559001632618](assets/1559001632618.png)



可以看到当前所在的是memcpy这个函数，而最下面的是GetText获取用户输入，直接记下这个地址0x421DF7



## 分析算法



找到0x421DF7函数头的位置0x00421DC8 ，开始分析整个算法，校验步骤如下



1. 获取序列号



![1559001992856](assets/1559001992856.png)



2. 获取用户名



![1559002026319](assets/1559002026319.png)



3. 比较用户名长度是否大于等于4



![1559002072096](assets/1559002072096.png)



4. 再次获取用户名长度



![1559002137675](assets/1559002137675.png)



5. 循环累加用户名的ASCII值右移9位的和



![1559002319615](assets/1559002319615.png)



![1559002331489](assets/1559002331489.png)



6. 将累加的结果转为字符串



![1559002438408](assets/1559002438408.png)



7. 和序列号进行比较



![1559002477167](assets/1559002477167.png)



下面贴上IDA的伪代码注释



![1559002532606](assets/1559002532606.png)



## 写出注册机



注册机代码如下:



```c++

#define _CRT_SECURE_NO_WARNINGS

#include <windows.h>

#include <stdio.h>





int main()

{

	int result = 0x37;

	char username[20] = { 0 };

	char serial[20] = { 0 };

	printf("请输入用户名：");

	scanf_s("%s", username, 20);

	int usernameLen = strlen(username);

	if (usernameLen>=4)

	{

		for (int i = 0; i < usernameLen; i++)

		{

			result += username[i] << 9;

		}

	}

	printf("%d\n", result);

	system("pause");

	return 0;

}



```



## 校验结果



输入用户名和计算的序列号



![1559003470322](assets/1559003470322.png)



提示成功 破解完成



需要相关文件的可以到我的Github下载：https://github.com/TonyChen56/160-Crackme