(持续更新作为日志)看雪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]