风扫春残雪 发表于 2020-7-6 16:49

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

本帖最后由 风扫春残雪 于 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,一系列字符串运算循环

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
      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 XOR 20H) % 0AH
strFinal = "?"
for char in strMidResult:
    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在这里的局限在有的时候不能很好处理返回值相关的判断,但是分析核心的汇编算法还是非常稳的
所以这个时候基本上借助动态调试会极大帮助解程序。最明显的比如这里


CODE:0048C7FA               mov   edi, eax
CODE:0048C7FC               test    edi, edi
CODE:0048C7FE               jle   short loc_48C81F
CODE:0048C800               lea   ebx,
CODE:0048C803
CODE:0048C803 loc_48C803:                           ; CODE XREF: _TForm1_Button1Click+149j
CODE:0048C803               lea   eax,
CODE:0048C806               mov   dl,
CODE:0048C808               call    unknown_libname_65 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:0048C80D               mov   edx,
CODE:0048C810               lea   eax,
CODE:0048C813               mov   ecx,
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就彻底分析不出来了



   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


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 = chr(ord(pwd) * ord(username) % 0x1a + 65)
    print(pwd_mid)

newresult = []
for i in range(5, len(pwd)+5):
    newresult.append(pwd_mid)
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

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要是没啥特别的就不看了。。。有点弱智


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))
else:
    print("username length error")

key = ord(strUsername) * ord(strUsername) + ord(strUsername) * ord(strUsername) + ord(strUsername) * ord(strUsername)
key2 = key * key ^ ord(strUsername)
while len(str(key2))<=6:
    key2 = key2 * key2
finalkey = str(key2) + "%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

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).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)

页: [1]
查看完整版本: (持续更新作为日志)看雪crackme合集拾遗