109-Jony-crackme

文章详细描述了对一个无壳Delphi程序的动态和静态分析过程,通过OD调试器和IDA反汇编工具,解析了一段关键的字符串处理算法,该算法基于输入的name字符串生成serial。算法涉及字符串ASCII码的按位或操作、循环和长度计算,最终用于生成序列号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们使用Exeinfo查壳,发现并没有壳,是Delphi编译的程序
在这里插入图片描述
我们OD附加这个程序,字符串搜索,找到关键的位置,分析附近的逻辑代码。OD在函数头下断,单步运行。
找到这个函数地址之后,我们配合IDA的静态分析,F5功能生成C语言代码,我们提前用Shift+F5添加Delphi函数的库函数识别,帮助我们更快的分析。
在这里插入图片描述
发现一开始都是一些写入的操作。结合OD,我们分析。
在这里插入图片描述
在这里插入图片描述
我们分析得到,有一个关键算法call,应该是根据name计算出serial字符串的算法,下方有一个数字转10进制字符串的过程。进入这个00408388call分析。
同时结合IDA.
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
总结这个函数,一开始根据name字符串长度计算循环的次数,接着进行循环,这个算法
就是取出每次nEsi^2和nEsi ^2 -1的下标的字符串ascii码,进行按位或操作,再把结果和字符串长度相加。再通过字符串拼接赋值到一个字符串缓冲区里。
KeyGen:

#include <iostream>
using namespace std;

int main()
{
	char szName[10] = { 0 };
	cin >> szName;
	int nLen = strlen(szName);
	int nEsi = 0;
	//计算循环次数
	int nCount = nLen >> 1;
	unsigned char szSerial[10] = { 0 };
	for (int i = 0,j=0; i < nCount; i++)
	{
		int nEdx = nEsi;
		nEdx ^= 2;
		int nbl = szName[nEdx];
		nEdx -= 1;
		int nal = szName[nEdx];
		nbl |= nal;
		nbl += nLen;
		szSerial[j++] = nbl;
	}
	printf("%d\n", szSerial[0]);
	return 0;
}

执行结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值