legendary666 发表于 2019-8-21 13:54

简单的CrackMe

三无产品不要爆破,爆破没难度
不知道能撑多久.....

玖公子 发表于 2019-8-22 19:34

本帖最后由 玖公子 于 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:32

本帖最后由 梦游枪手 于 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:09

本帖最后由 GCM 于 2019-8-21 15:18 编辑

小白很有压力不知道字符串经历了什么

最终,惨烈的失败了..

hqf159 发表于 2019-8-21 15:58

对不对,{:1_904:}

legendary666 发表于 2019-8-21 16:06

本帖最后由 legendary666 于 2019-8-21 16:15 编辑

GCM 发表于 2019-8-21 15:09
小白很有压力不知道字符串经历了什么

最终,惨烈的失败了..
你是不是名字输长了,有限制,但是按理说不可能崩溃啊

legendary666 发表于 2019-8-21 16:09

hqf159 发表于 2019-8-21 15:58
对不对,

对对对,就是这样,大佬能分享一下过程吗

GCM 发表于 2019-8-21 17:40

梦游枪手 发表于 2019-8-21 17:32
贴个keygen代码吧,照着伪代码搬了不少,不要在意变量名这些细节。还有就是这个算法效率有点低。 ...

Keygen中文出来的激活码不正确啊
...

梦游枪手 发表于 2019-8-21 17:43

GCM 发表于 2019-8-21 17:40
Keygen中文出来的激活码不正确啊
...

我没对中文做处理,也不想做处理了{:1_909:}

GCM 发表于 2019-8-21 17:44

梦游枪手 发表于 2019-8-21 17:43
我没对中文做处理,也不想做处理了

呃...好吧.....

梦游枪手 发表于 2019-8-21 17:56

GCM 发表于 2019-8-21 17:44
呃...好吧.....

CM是用signed char来接收字符的,python又不好把unsigned类型转成signed,就只能这样了。
页: [1] 2
查看完整版本: 简单的CrackMe