crackme4算法分析记录
博客专区 > enimey 的博客 > 博客详情
crackme4算法分析记录
enimey 发表于4年前
crackme4算法分析记录
  • 发表于 4年前
  • 阅读 94
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

下载地址:http://pan.baidu.com/s/1jGv9FO6

软件界面如下:

image

验证成功后,返回success!

软件是加壳了的,用esp定律+单步,很容易完成脱壳。

由于是win32控制台程序,和之前的窗口程序稍微有点不同。很明显,我们需要在获取用户输入的api处下断点,用 bpx gets(在所有调用gets函数的地方下断点)下断。

算法很简单,这次我没有仔细用od跟算法,是在od找到算法的地址,然后直接用ida的f5看的伪代码。

直接贴一下注册算法,留以备用:

#coding=gbk
userName = input('请输入用户名(只能输入5位字母):')
mid1Passwd = ''
passwd = ''
index = 0
tuple = (0x76, 0x03, 0x40, 0x70, 0x02, 0x55, 0x5B, 0x5B, 0x05, 0x64)
al = 0
dl = 0
if len(userName) != 5 :
	print('用户名输入错误!')
	exit()
for i in userName :
	if ord(i) <= 96 or ord(i) > 122 :
		if ord(i) > 64 and ord(i) <= 90 :
			mid1Passwd += chr(((ord(i) - 65) * 7 + 13) % 26 + 65)
		else :
			print('用户名输入错误!')
			exit()
	else :
		mid1Passwd += chr(((ord(i) -97) * 7 + 13) % 26 + 65)
print(mid1Passwd)
		
for i in mid1Passwd :
	dl = (((((0x00280000 +ord(i)) * 0x67) & 0x0000ffff) >> 0x8) & 0x000000ff) >> 0x2
	al = ord(i) >> 0x7
	passwd += chr((dl -al + 0x30) ^ tuple[index])
	index += 1
	passwd += chr((ord(i) - (((dl - al) << 0x2) + (dl - al)) * 2 + 0x30) ^ tuple[index])
	index += 1
print('密码为:' + passwd)

PS:虽然算法很简单,但是还是一些小技巧:1,算法并没有在开始检查用户名的长度,而是在后面验证密码时,通过验证的循环次数控制了用户名的长度;2,算法为了不直接将"success"字符串硬编码到程序中,而是采取了将其他乱码形式的字符串以某种算法而生成"success"、“sorry”等提示信息。

共有 人打赏支持
粉丝 16
博文 18
码字总数 12299
×
enimey
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: