160個crackme(6)
這是160個crackme的第六道,比較簡單;
一·逆向的軟體及目的:
當我們點選About-Help的時候,就知道了這道crackme是讓我們輸入正確的Nome(我覺得作者是將name打錯了…)和Codice,然後OK鍵和Cancella鍵會消失,顯示出後面的圖示:
二·開始工作:
分析:首先我們發現這個歐卡鍵是被灰度的,不可用,所以猜測應該是先輸入正確的註冊碼後,Cancella鍵消失,然後ok鍵可以用,然後再輸入正確的註冊碼後Ok鍵消失,圖示顯示出來。
正式開始逆向:
- PEID查殼:
沒有殼,是Delphi寫的。
- 因為IDE對Delphi編寫的軟體我覺得沒有DeDe分析的好,所以我喜歡用DeDe檢視一下事件:
一共有10個事件,根據名字我們發現前四個事件應該是關鍵的,我們在OD中將這幾個事件的開始地址00442C78,00442D64,00442E04,00442EA8下斷點並寫上註釋。
NomeChange事件:當我還在輸入的時候就斷在了00442E04的位置,然而我們並沒有點選任何按鈕,說明軟體在輸入的時候就開始判斷對不對了。然後我們F8單步繼續走(注意觀察堆疊和暫存器的變化),當我們走到00442E57的時候,我們發現將我們輸入的name放到暫存器EAX裡了,而下面剛好有一個call,這個call很有可能是驗證name的函式,所以F7單步進入,然後看到這裡:
說明輸入的name必須大於5個字元,然後下面就是關鍵演算法:
00442A93到00442AAC就是判斷name的演算法,翻譯成python就是:
eax=1
name=input(“name”)
a=name
b=len(a)
ebx=b
for i in range(0,b-1):
ecx=ord(a[i])
esi=ord(a[i+1])
ecx=ecx*esi
ecx=ecx*eax
ebx=ebx+ecx
eax=eax+1
print(hex(ebx))
然後通過name用上面演算法算出來的一個值減去通過codice用另一個演算法算出來的值,如果等於0x29A,那麼cancella鍵就會消失
CodeChange事件:當我們輸入codie時,程式斷下來了,然後F8繼續執行,同樣觀察堆疊和暫存器,在00442EE3的地址處,codice放入EAX中,所以進入下面的call,剛好是codice的演算法。
判斷codice的演算法:
可以看出輸入的codice必須是數字,然轉換為python程式碼就是:
for i in codie:
ecx=10*eax+int(i)
eax=ecx
print(hex(eax))
其實就是將codie字串轉換為unicode編碼
codeclik事件:點選cancella鍵時,在00442EA8斷了下來,然後00442EE7位置的call進入,這裡就是讓cancella鍵消失的關鍵函式了:
取name的第五位a[4],然後除以0x7取餘數後加0x2的值的階乘儲存下來,然後減去name計算出來的值如果等於0x7A69,就消去cancella鍵。
所以消去cancella鍵的序號產生器可以這樣寫:
name=input("輸入name:")
eax=ord(name[4])%0x7+0x2 #對應0x0442B35
ebx=1
for i in range(1,eax+1): #call 0x042A20
ebx=ebx*i
eax=0
for i in name:
eax=eax+ord(i)*ebx #對應0x0442B54
ebx=eax-0x7a69 #反推密碼 對應0x0442B65
key=ebx
print(u"cancella鍵消失的密碼:%d"%key)
okclik事件:用上面同樣的方法,找到時ok鍵消失的演算法的位置00442BF9:
密碼從後往前獲取密碼一位的平方乘以(下標+1),除以0x19,餘數加0x41,替換掉原來的密碼位置,然後和name比較一不一樣,如果一樣就將ok鍵消失掉。
所以用python寫序號產生器可以這樣寫:
先輸入codice然後再根據codice反算出name:
codice=input("輸入codice:")
a=codice
ecx=len(a)
eax=0
x=0
key=" "
for i in range(0,ecx):
x=ord(a[i])*ord(a[i]) #對應0x0442C0E
if(x>0xffff): #對應0x0442C10
x=0xffff
eax=x*(i+1)%0x19+0x41 #對應0x0442C1B和0x0442C1D
if(eax>0xff):
eax=0xff
key=key+chr(eax) #對應0x0442C21
print("OK鍵消失的name:%s"%key)
總結:將使ok鍵消失的程式碼和cancella消失的程式碼分開寫,也就是讓cancella的程式碼是通過name算出codice,讓ok鍵消失的程式碼是通過codice去算name,這樣要簡單一點!
相關文章
- 160個CrackMe(4)
- 160個CrackMe之108 mfc程式 尋找按鈕事件,程式碼還原(上)C程式事件
- 160個CrackMe之108 mfc程式 尋找按鈕事件,程式碼還原(下)C程式事件
- 2021虎符ctf(Re)-CrackMe
- 破解練習-CRACKME001
- 精讀《用160行js程式碼實現一個React》JSReact
- 2018年以來,Facebook刪除了近160億個假帳戶
- MU5IN160 – Parallel ProgrammingParallel
- BUUCTF-Misc(151-160)
- PostgreSQL DBA(160) - pgAdmin(prepare transaction)SQL
- ASE160N08-ASEMI低壓N溝道MOS管ASE160N08
- Leetcode 160. Intersection of Two Linked ListsLeetCode
- 圖表控制元件LightningChart 新版本,160 億個實時資料點!控制元件GC
- 每日leetcode——160. 相交連結串列LeetCode
- 車用晶片TPS2H160BQPWPRQ1(TPS2H160)雙通道智慧高側開關晶片
- 福州廈門160家遊戲公司盤點遊戲
- 6個有趣的Linux命令Linux
- ES6 Async/Await 完爆Promise的6個原因AIPromise
- (資料科學學習手札160)使用miniforge代替miniconda資料科學
- 6 個方便的 Git 指令碼Git指令碼
- 20 個 .NET 6 新增的 APIAPI
- abc160E 吃蘋果能得到的最大美味度蘋果
- 三年入賬160億,Airbnb還能躺贏多久?AI
- 想要面試BATJ,先做完這160道Java面試題~BATJava面試題
- 紅米6和紅米6A區別對比 紅米6和紅米6A哪個好
- 6個提升PostgreSQL效能的小技巧SQL
- 伺服器重點清理6個點伺服器
- 盤點6個Kubernetes監視工具
- Async/Await替代Promise的6個理由AIPromise
- 6 個 Python 的日期時間庫Python
- ES6 的幾個小技巧
- 6個跡象表明你的公司需要一個ERP
- 小米6X和紅米6 Pro區別對比 紅米6 Pro和小米6X哪個好?
- 科技愛好者週刊(第 160 期):中年碼農的困境
- NPD:2020年4月北美主機銷量同比增長160%
- NRF:2019年美國人父親節支出達160億美元
- 微服務架構實戰160講-楊波-極客時間微服務架構
- Linux工作站加固的6個方法Linux