吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2833|回复: 0
收起左侧

[CrackMe] (持续更新作为日志)看雪crackme合集拾遗

[复制链接]
风扫春残雪 发表于 2020-7-6 16:49
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 风扫春残雪 于 2020-7-8 10:45 编辑

RT,练练内功,争取每天做一个crackme。
论坛上大部分都是e语言的,我不反对易语言,但是主流应用或恶意程序用易语言的不多。
逆向主要是针对编译器把asm代码自动或人肉成可读代码的过程,小众的编译器尝尝鲜就行了。毕竟二进制相关的内容太多了。
本来是自己本地写的。后来发现整理太麻烦了。发到论坛上来好了,如果有能一起学习的朋友就更好了。

看雪crackme合集我忘了单行版下载地址了,我下的是20周年整合版,其中的crackme.chm就是了。打算先从序列号顺着往下做,每天一个一年后应该内功就差不多了

我主要是用IDA分析的,所以很多细节直接写进注释了。各位要是做这些CM有什么问题我可以把IDA文件糊上来一起研究
  • 7月3日 Bigman's crackme。下载地址:http://bbs.pediy.com/showthread.php?t=11222 。难度:D
  • 7月4日 一只老虎 crackme。下载地址:http://bbs.pediy.com/showthread.php?t=31310 。难度:D (不做解方程)
  • 7月5日 KGM1Tal‘s crackme。下载地址:http://bbs.pediy.com/showthread.php?threadid=25587 难度:D-E

   4. 7月6日 研究https://www.52pojie.cn/thread-1213289-1-1.html,可能会咕一天
                   (看了看http://bbs.pediy.com/showthread.php?threadid=33993 ,要先熟悉tea/base64和crc32。分析了一半就先停了。建议顺着做的同学把这个扔到密码学那一章)
   5. 7月7日 aCaFeeL's CrackMe V2 http://bbs.pediy.com/showthread.php?t=36389   。难度:E 略蠢。以后不做DELPHI了
   6. 7月8日 boonz's Keygenme #1 http://bbs.pediy.com/showthread.php?threadid=30019  难度:F 更蠢了,不写注册机不用F5的话最多20分钟。纯汇编,非常简单。建议萌新从此入门




1. 7月3日 Bigman's crackme。下载地址:http://bbs.pediy.com/showthread.php?t=11222 。难度:D

API GetDlgItemA 重点关注:1)lpBuffer;2)nIDDlgItem(从谁获取)

0X401509-0X401589 难度:E,初中不等式知识求位数。位数在(3,9]范围内
0x401305-0x401508 难度:C,一系列字符串运算循环

[Python] 纯文本查看 复制代码
strInput = input("UserName: ")
intSum = 0
strArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
strOut = ""
for char in strInput:
    intSum += ord(char)
    
for index, char in enumerate(strInput):
    ECX = (index << 2) - index - 1
    if (ECX > 0) :
        ECX = strArr[ECX % 26]
        EDX = ord(char) ^ ord(ECX)
    else:
        ECX = 0
        EDX = ord(char)
    
    ESI = (intSum * (index - 1) ^ -1)
    ESI += 0x14D + EDX
    ECX = len(strInput) * (index + 3) * ord(char)


    myChar = ((ECX + ESI) % 10 + 0x30) ^ 0xADAC
    myChar = myChar * (index + 2)
    myChar = myChar % 10 + 0x30
    strOut += chr(myChar)
strMidResult = "T"+strOut+"-"+str(0x30+len(strInput)*intSum % 0x64)
#30H + (str[index] XOR 20H) % 0AH
strFinal = "?"
for char in strMidResult[1:]:
    strFinal += chr(0x30+(ord(char) ^ 0x20) % 0xA)
print(strFinal)





2. 7月4日 一只老虎 crackme。下载地址:http://bbs.pediy.com/showthread.php?t=31310 。难度:D (不做解方程)
delphi写的程序,最大的难点在于delphi各种奇怪的库。借助IDA和网上搜索得到的库函数功能会很快破解
又:dede也不错,不过可能只有上古的程序才能用

读代码难度:D
代码的难度不难,但要是反过来推注册机的话就比较麻烦。没有做这一项,大概要想30min-1h左右的时间

IDA/Xray在这里的局限在有的时候不能很好处理返回值相关的判断,但是分析核心的汇编算法还是非常稳的
所以这个时候基本上借助动态调试会极大帮助解程序。最明显的比如这里

[Asm] 纯文本查看 复制代码
CODE:0048C7FA                 mov     edi, eax
CODE:0048C7FC                 test    edi, edi
CODE:0048C7FE                 jle     short loc_48C81F
CODE:0048C800                 lea     ebx, [ebp+var_72]
CODE:0048C803
CODE:0048C803 loc_48C803:                             ; CODE XREF: _TForm1_Button1Click+149j
CODE:0048C803                 lea     eax, [ebp+var_7C]
CODE:0048C806                 mov     dl, [ebx]
CODE:0048C808                 call    unknown_libname_65 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0048C80D                 mov     edx, [ebp+var_7C]
CODE:0048C810                 lea     eax, [ebp+var_14]
CODE:0048C813                 mov     ecx, [ebp+var_14]
CODE:0048C816                 call    @System@@LStrCat3$qqrv ; System::__linkproc__ LStrCat3(void)
CODE:0048C81B                 inc     ebx
CODE:0048C81C                 dec     edi
CODE:0048C81D                 jnz     short loc_48C803



看48C800,实际上var_72并不是一个变量,而是var_7C这个字符串的第五个byte(pascal/delphi字符串编码),但是IDA这样翻译以后,XRAY就彻底分析不出来了


[C] 纯文本查看 复制代码
   if ( v9 > 0 )
    {
      v10 = &v18;
      do
      {
        LOBYTE(v8) = *v10;
        unknown_libname_65(&v16, v8);
        System::__linkproc__ LStrCat3(&v19, v16, v19);
        ++v10;
        --v9;
      }
      while ( v9 );
    }



所以关键的细节最好还是调试一下比较好

收获
imul reg--> = edx:eax = eax * reg

[Python] 纯文本查看 复制代码
username = "55555555555"
pwd = "5555555555555555555"
stryizhi = "i am yi zhi lao hu"
username += "i am Bin Lade"

pwd_mid = [" "] * 50
for i, char in enumerate(username):
    for j, char2 in enumerate(stryizhi):
        pwd_mid[j + i] = chr(ord(pwd[j]) * ord(username[i]) % 0x1a + 65)
    print(pwd_mid)

newresult = []
for i in range(5, len(pwd)+5):
    newresult.append(pwd_mid[i])
print("".join(newresult)[::-1]) # done if this string == pwd






3.7月5日 KGM1Tal‘s crackme。下载地址:http://bbs.pediy.com/showthread.php?threadid=25587
汇编写的,无壳,字节码ANTI-DEBUG
难度:D-E,比较烦,读代码不应该超过1h

收获: REPNE/REPNZ... REP WHEN NOT EQUAL/ZERO, CX循环次数
           SCASB 按byte搜索字符,DF控制方向, AL- BYTE OF [EDI]

5. 7月7日 aCaFeeL's CrackMe V2 下载地址:http://bbs.pediy.com/showthread.php?t=36389

delphi写的,还是那个情况,没有库函数指示就很难, 有了就非常简单。难度E
delphi的字符串处理可以看看这一篇,https://www.cnblogs.com/RbtreeLinux/articles/2353454.html
以后delphi要是没啥特别的就不看了。。。有点弱智

[Python] 纯文本查看 复制代码
strUsername = "52pojie"
strPWD = "505125579" #supposed pwd,length should be as same as the calculated strpwd
lstCombo = ['SD','LW','CZ','WN'] #0,1,2,3
if 5<=len(strUsername)<=8:
    print("you should choose %s"%(lstCombo[len(strUsername) - 5]))
else:
    print("username length error")

key = ord(strUsername[4]) * ord(strUsername[2]) + ord(strUsername[5]) * ord(strUsername[1]) + ord(strUsername[6]) * ord(strUsername[0]) 
key2 = key * key ^ ord(strUsername[3])
while len(str(key2))<=6:
    key2 = key2 * key2
finalkey = str(key2)[0:7] + "%s%s"%(len(strUsername), len(strPWD)) #"79 must in this "
print(finalkey)



6. 7月8日 boonz's Keygenme #1 http://bbs.pediy.com/showthread.php?threadid=30019

不用解释。。。这要是做不出来就退坑吧,有史以来最简单的CM
[Python] 纯文本查看 复制代码
username = "52pojie.com"
if (len(username) < 4)or(len(username) > 50):
    print("length error")
intSumUsername = 0xffffffff + 1
for index, char in enumerate(username):
    intSumUsername += -ord(char) + 0x19
strPWD1 = hex(intSumUsername)[2:].upper()
strPWD2 = hex(intSumUsername ** 3)[-8:].upper()
intOffset = 0x40e0f8
strMagic = hex(intOffset ** 2 - intOffset).upper()
strPWD3 = str(strMagic)[-8:].upper()
strPWD4 = "Bon-"

strFinal = strPWD4 + strPWD1 + "-" + strPWD2 + "-" + strPWD3
print(strFinal)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 23:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表