crackMe的逆向分析
//源文件下載:http://pan.baidu.com/s/1geK6oQB 密碼:nup1
下面是程序的DialogFunc的回調(diào)函數(shù):
紅色的為下斷點(diǎn)的位置,為Register按鈕的處理過程,調(diào)用了checkAll(我自己改的)函數(shù)來驗(yàn)證用戶名和密碼,還有那些nop指令本來是程序檢查是否在GetDlgItemTextA函數(shù)下斷點(diǎn),下了的化就程序自己退出,我把它nop掉了
上面就是checkAll函數(shù)的代碼(IDA按F5就可以得到C的偽代碼;先去用戶名文本框的內(nèi)容保存到name(我自己改的名字)字符數(shù)組里,再取輸入的密碼到pwd字符數(shù)組里;
接著調(diào)用checkPwd()函數(shù)來檢查pwd變量;
這一個(gè)循環(huán)檢查pwd字符數(shù)組是否全部為大寫字母,如果不是就把flag(我自己重命名的)變量設(shè)置為40h
接下來一個(gè)循環(huán)是把name字符數(shù)組的字符的Ascii碼全部相加,保存在變量sum(我自己重命名的,ida里N為重命名標(biāo)識(shí)符)里面;
然后就是 name24 = sum % 24;再檢查flag變量,如果為40h,就代表不是全部的大寫,程序彈出失敗窗口;
調(diào)用check_0函數(shù)檢查pwd變量的第二個(gè)字母是否為'E';到這里checkPwd函數(shù)就結(jié)束了;
接下來是調(diào)用crypt函數(shù):
這個(gè)是主要的檢查name和pwd;
先用strlen計(jì)算輸入的pwd的長度,必須為10,不是則退出;
再用一個(gè)while循環(huán)把pwd的所有的Ascii碼全部相加,保存在v2里面,再把v2/9保存在變量keyResult(我自己重命名的),pwd的最后一個(gè)字母就是keyResult的值。
key的值為:a:00403053 aZwatrqlcghpsxy db 'ZWATRQLCGHPSXYENVBJDFKMU',0在data段里面有;
name24是在上一個(gè)函數(shù)chedPwd里面引入的name24 = sum%24,sum位name的Ascii碼的和;與24取模是因?yàn)閗ey的長度為24,為了防止訪問越界;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?JUMPOUT(*(_BYTE *)((unsigned __int8)v4 + key), pwd, &failed);//檢查 pwd的第一個(gè)字符是否與key[v4]的值相等;
因?yàn)榈诙辉赾heckPwd函數(shù)里面已經(jīng)知道是'E'了;
?v7 = *(&pwd + 2);
? JUMPOUT(*(_BYTE *)(v5 + key), v7, &failed);//檢查 pwd的第三個(gè)字符(也就是v7)是否與key[v5]相同,v5 = name24+v4;
下面是檢查后面的6個(gè)字符是否滿足一定的條件;
最后還剩下最后一個(gè)字符沒有檢查;
在最后一個(gè)show()(我自己改名的)函數(shù)里有檢查;
在這里檢查pwd的最后一位是否為keyResult的值,keyResult的值等于pwd的全部Ascii碼的和除以9;
下面是python寫的注冊機(jī):
? ? ? ? key='ZWATRQLCGHPSXYENVBJDFKMU'
? ? ? ? sum = 0
? ? ? ? for i in '12345': #用戶名為12345,也可以改為其他的
? ? ? ? ? ? sum+=ord(i) #計(jì)算用戶名的Ascii碼之和
? ? ? ? flag=[]
? ? ? ? result=sum%24
? ? ? ? t = result
? ? ? ? print t
? ? ? ? if result>24:
? ? ? ? ? ? t = result-24 #防止訪問越界
? ? ? ? flag.append(key[t])#第一位?
? ? ? ? v5 = result + t
? ? ? ? if v5>24:
? ? ? ? ? ? v5 = v5-24
? ? ? ? flag.append('E')#第二位
? ? ? ? flag.append(key[v5])#第三位
? ? ? ? v6=2
? ? ? ? v7=flag[2]
? ? ? ? while v6 < 8:
? ? ? ? ? ? v6+=1
? ? ? ? ? ? v5=ord(v7)-65+v5
? ? ? ? ? ? if v5>24:
? ? ? ? ? ? ? ? v5=v5-24
? ? ? ? ? ? flag.append(key[v5])
? ? ? ? ? ? v7=key[v5]
? ? ? ? sum=0
? ? ? ? for i in flag:
? ? ? ? ? ? sum+=ord(i)
? ? ? ? flag.append(chr(sum/9)) #求出最后一位
? ? ? ? print ''.join(flag) #打印出密碼
總結(jié)
以上是生活随笔為你收集整理的crackMe的逆向分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python向图片里添加文字
- 下一篇: 一个含有crc32算法的CrackMe分