简单的CrackMe
三无产品不要爆破,爆破没难度不知道能撑多久.....
本帖最后由 玖公子 于 2019-8-22 19:39 编辑
004B6094 E8 C7B2F4FF call CrackMe.00401360
004B6099 83EC 0C sub esp,0xC
004B609C 894424 04 mov dword ptr ss:,eax
004B60A0 8B85 70FFFFFF mov eax,dword ptr ss:
004B60A6 890424 mov dword ptr ss:,eax
004B60A9 8B8D 24FFFFFF mov ecx,dword ptr ss:
004B60AF E8 8CB4F4FF call CrackMe.00401540
004B60B4 83EC 08 sub esp,0x8
004B60B7 84C0 test al,al
004B60B9 C74424 08 0C000>mov dword ptr ss:,0xC
004B60C1 8B9D 24FFFFFF mov ebx,dword ptr ss:
004B60C7 0F84 9E000000 je CrackMe.004B616B
我OD单步到这段断码时,发现程序此时名字和激活码输入完毕,那么接下来肯定就是比较
两个字符串了,我们经过这个call,然后单步到004B609C 这一行,看信息窗口
eax=003F8980, (ASCII "ccktbtvcqvMaxVjpchda")
堆栈 ss:=003F8920
我猜测这个就是激活码,重启程序,名字不变(jiugongzi),然后激活码输入这个,程序果然提示激活码正确!
接下来在这里我们再按一次F8,来到004B60A0 这一行,看信息窗口
堆栈 ss:=0022FEC0, (UNICODE "6")
eax=003F8980, (ASCII "ccktbtvcqvMaxVjpchda")
那么很明显了,这里把eax的变成6再去和ccktbtvcqvMaxVjpchda比较,那肯定不相等,
所以直接将004B60A0 8B85 70FFFFFF mov eax,dword ptr ss:这一行nop掉,
不让它覆盖eax的正确激活码,那么此时程序就会用ccktbtvcqvMaxVjpchda比较它自己,
百分百正确,程序成功破解!
我们观察发现,这句nop掉后004B60C7 0F84 9E000000 je CrackMe.004B616B这个je就
不会跳转,所以我们也可以直接将这个je语句nop掉,保存出去,程序也是成功破解!
我不会编程,看不懂加密字符串的那个call,所以就没分析算法,水平不行,
只能爆破了! 本帖最后由 梦游枪手 于 2019-8-21 17:33 编辑
贴个keygen代码吧,照着伪代码搬了不少,不要在意变量名这些细节。还有就是这个算法效率有点低。{:1_909:}数字类的用户名还好,字符类的用户名生成注册码耗时太久了。
import math
def gencode(num1,num2,num3):
dsum=num1
xn=num2
ps=num3
result=''
strtable="Q!W@E#R$T%Y^U&I*O(P)A:S;D+F=G?H/J~K`LZXCVBNMplmoknijbuhvygctfxrdzeswaq"
while(len(result)<0x14):
i=ps*(dsum+xn)
while(len(strtable)<=i):
i-=dsum
dsum-=5
if dsum<=0:
dsum=30
dsum+=2
result+=strtable
xn+=3
ps-=4
return (result,dsum,xn,ps)
def powsqrt(dsum,x):
tmp1=x*(dsum-1)
tmp2=tmp1+1
result=pow(tmp2,1.5)
result+=math.sqrt(tmp1+x*dsum/2+1)+tmp2
return int(result)
def xornum(dsum,num):
return dsum^(dsum+2-num)
def getnumf(num):
return int(str(num))
if __name__=='__main__':
text=raw_input()
dsum=0
for i in text:
dsum+=ord(i)
nf=getnumf(dsum)
xn=xornum(dsum,nf)
ps=powsqrt(dsum,nf)
code,dsum,xn,ps=gencode(dsum,xn,ps)
code,dsum,xn,ps=gencode(dsum,xn,ps)
code,dsum,xn,ps=gencode(dsum,xn,ps)
print code
对了,这个CM本质还是明文比较,在关键跳之前是可以看到明文注册码的。 本帖最后由 GCM 于 2019-8-21 15:18 编辑
小白很有压力不知道字符串经历了什么
最终,惨烈的失败了..
对不对,{:1_904:} 本帖最后由 legendary666 于 2019-8-21 16:15 编辑
GCM 发表于 2019-8-21 15:09
小白很有压力不知道字符串经历了什么
最终,惨烈的失败了..
你是不是名字输长了,有限制,但是按理说不可能崩溃啊 hqf159 发表于 2019-8-21 15:58
对不对,
对对对,就是这样,大佬能分享一下过程吗 梦游枪手 发表于 2019-8-21 17:32
贴个keygen代码吧,照着伪代码搬了不少,不要在意变量名这些细节。还有就是这个算法效率有点低。 ...
Keygen中文出来的激活码不正确啊
... GCM 发表于 2019-8-21 17:40
Keygen中文出来的激活码不正确啊
...
我没对中文做处理,也不想做处理了{:1_909:} 梦游枪手 发表于 2019-8-21 17:43
我没对中文做处理,也不想做处理了
呃...好吧..... GCM 发表于 2019-8-21 17:44
呃...好吧.....
CM是用signed char来接收字符的,python又不好把unsigned类型转成signed,就只能这样了。
页:
[1]
2