dengwb1 发表于 2015-7-22 15:24

下来看看,谢谢分享啊

408116102 发表于 2015-7-27 08:07


感谢楼主的教程

botanycc 发表于 2015-7-29 11:50

进来看看,吸取经验

herowuking 发表于 2015-8-7 22:28

楼主分析的不错!这个CrackME以前我也做过注册机(Python写的),有一点点和楼主分析的不一样,贴出来跟大家交流:
Cruehead.3.exe我是在看雪下的哈,但是看楼主分析应该是一样的~
00401311/$33C9          xor ecx,ecx                              ;关键CALL1-计算前14个字符
00401313|.33C0          xor eax,eax                              ;kernel32.BaseThreadInitThunk
00401315|.8B7424 04   mov esi,dword ptr ss:         ;esi里面存储从文件读取的18位序列号字符串
00401319|.B3 41         mov bl,0x41                              ;大写字母A的ASCII,存入bl
0040131B|>8A06          /mov al,byte ptr ds:                ;循环取字符
0040131D|.32C3          |xor al,bl                               ;与'A'的ASCII做异或,下一个循环'A'++
0040131F|.8806          |mov byte ptr ds:,al                ;最终结果存回去,逆向成功后显示用户名
00401321|.46            |inc esi                                 ;取下一个字母
00401322|.FEC3          |inc bl                                  ;'A'++
00401324|.0105 F9204000 |add dword ptr ds:,eax         ;加上每一轮循环的结果,并存入ds:
0040132A|.3C 00         |cmp al,0x0
0040132C|.74 07         |je short Cruehead.00401335            ;al==0 则跳出,否则cl++,bl != 0x4F (大写字母O)继续循环
0040132E|.FEC1          |inc cl
00401330|.80FB 4F       |cmp bl,0x4F                           ;字母'O'
00401333|.^ 75 E6         \jnz short Cruehead.0040131B             ;只计算前14个字符 4F-41
00401335|>890D 49214000 mov dword ptr ds:,ecx
0040133B\.C3            retn
0040133C/$8B7424 04   mov esi,dword ptr ss:         ;关键CALL2-取后四个字符值
00401340|.83C6 0E       add esi,0xE                              ;字符串指针偏移14
00401343|.8B06          mov eax,dword ptr ds:               ;将后面4个字符的ASCII值小端序放入EAX
00401345\.C3            retn


Python注册机代码(支持中文用户名):
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
#########################
# Cruehead.3.keygen.py
# By Herowuking

import sys        #使用sys模块,标准输入

def CalcKeyFileString(name):
        arr = range(0x41,0x50)       
        name14 = "{0: <14}".format(name)                #用空格补全14个字符
        nameNew = ""                                                        <font color="#ff0000">#用来存储加密后的用户名</font>
        #print "{0}:{1}".format(name14,len(name14))
        nameXOR = 0                                                                #用来存储用户名异或运算结果
        i=0
        for c in name14:
                nameNew += chr(ord(c)^arr)
                nameXOR += ord(c)                                        #nameNew中的字符与arr异或运算之后,得到的是加密之前用户名对应的字符,因此直接加ASCII即可
                i += 1                                                                # name14 = nameNew^arr = (name14^arr)^arr
        nameXOR ^= 0x12345678
        namekey = nameNew
        HEXkey = "{0:x}".format(nameXOR)
        #print HEXkey
        for i in range(8,0,-2):
                #print HEXkey
                asc = int(HEXkey,16)                        #16进制字符串转整数
                namekey += chr(asc)
        return namekey
       
nameStr = raw_input(u"请输入用户名,不要超过14个字符或7个中文:\n".encode("GBK"))
nameLen = len(nameStr)
while nameLen<=0 or nameLen>14:
        nameStr = raw_input(u"输入无效,请重新输入用户名,不要超过14个字符或7个中文:\n".encode("GBK"))
keyStr = CalcKeyFileString(nameStr)
KEYFILE = open('CRACKME3.KEY','w+')
KEYFILE.write(keyStr)
KEYFILE.flush()
KEYFILE.seek(0)
print "The KEYFILE string is:%s" % KEYFILE.readline()
print u"授权文件CRACKME3.KEY创建成功!".encode("GBK")
KEYFILE.close()

落泪~伤 发表于 2015-8-11 09:09

你这转发人家某逆向的真不要脸

BattleHeart 发表于 2015-8-20 16:02

落泪~伤 发表于 2015-8-11 09:09
你这转发人家某逆向的真不要脸

我转发谁的了?我靠~~~

易支烟 发表于 2015-8-28 18:34

必须的嘛要支持

垚森 发表于 2015-9-4 14:56

这个怎么用?

帝皇 发表于 2015-9-5 20:41

虽然看不懂,但是会努力学的!保存下来以后学习!

王树全 发表于 2015-11-16 09:11

谢谢侬啦,真心等待
页: 1 2 [3] 4 5
查看完整版本: 160个CrackerMe之34