日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

crackMe的逆向分析

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 crackMe的逆向分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//源文件下載:http://pan.baidu.com/s/1geK6oQB 密碼:nup1


下面是程序的DialogFunc的回調函數:


紅色的為下斷點的位置,為Register按鈕的處理過程,調用了checkAll(我自己改的)函數來驗證用戶名和密碼,還有那些nop指令本來是程序檢查是否在GetDlgItemTextA函數下斷點,下了的化就程序自己退出,我把它nop掉了



上面就是checkAll函數的代碼(IDA按F5就可以得到C的偽代碼;先去用戶名文本框的內容保存到name(我自己改的名字)字符數組里,再取輸入的密碼到pwd字符數組里;

接著調用checkPwd()函數來檢查pwd變量;


這一個循環檢查pwd字符數組是否全部為大寫字母,如果不是就把flag(我自己重命名的)變量設置為40h


接下來一個循環是把name字符數組的字符的Ascii碼全部相加,保存在變量sum(我自己重命名的,ida里N為重命名標識符)里面;

然后就是 name24 = sum % 24;再檢查flag變量,如果為40h,就代表不是全部的大寫,程序彈出失敗窗口;



調用check_0函數檢查pwd變量的第二個字母是否為'E';到這里checkPwd函數就結束了;

接下來是調用crypt函數:


這個是主要的檢查name和pwd;

先用strlen計算輸入的pwd的長度,必須為10,不是則退出;

再用一個while循環把pwd的所有的Ascii碼全部相加,保存在v2里面,再把v2/9保存在變量keyResult(我自己重命名的),pwd的最后一個字母就是keyResult的值。

key的值為:a:00403053 aZwatrqlcghpsxy db 'ZWATRQLCGHPSXYENVBJDFKMU',0在data段里面有;

name24是在上一個函數chedPwd里面引入的name24 = sum%24,sum位name的Ascii碼的和;與24取模是因為key的長度為24,為了防止訪問越界;

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

?JUMPOUT(*(_BYTE *)((unsigned __int8)v4 + key), pwd, &failed);//檢查 pwd的第一個字符是否與key[v4]的值相等;


因為第二位在checkPwd函數里面已經知道是'E'了;

?v7 = *(&pwd + 2);
? JUMPOUT(*(_BYTE *)(v5 + key), v7, &failed);//檢查 pwd的第三個字符(也就是v7)是否與key[v5]相同,v5 = name24+v4;

下面是檢查后面的6個字符是否滿足一定的條件;

最后還剩下最后一個字符沒有檢查;

在最后一個show()(我自己改名的)函數里有檢查;


在這里檢查pwd的最后一位是否為keyResult的值,keyResult的值等于pwd的全部Ascii碼的和除以9;


下面是python寫的注冊機:

? ? ? ? key='ZWATRQLCGHPSXYENVBJDFKMU'
? ? ? ? sum = 0
? ? ? ? for i in '12345': #用戶名為12345,也可以改為其他的
? ? ? ? ? ? sum+=ord(i) #計算用戶名的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) #打印出密碼



《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的crackMe的逆向分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。