在分析報告的開始之前,這是我的MachineCode以及調(diào)試時采用的SerialNumber
一固翰、 采用DestroyWindow方式進(jìn)行破解。
此時MachineCode為9385C461
輸入序列號12345678
點擊Register,出現(xiàn)彈窗Bad
Ctrl+G惠昔,輸入DestroyWindow.
在,此處設(shè)置一個斷點挑势。
點擊Ok镇防。
此時來到
用F8,回到上一次函數(shù)調(diào)用潮饱。此時來到這里
向上翻沒有發(fā)現(xiàn)什么特別的東西来氧。于是再回到上一次函數(shù)調(diào)用。來到這里
我先前調(diào)用了004A4068香拉,是破壞的啦扬。前面發(fā)現(xiàn)了一個je,并且跳開了中間的函數(shù)凫碌。有點可疑扑毡,于是在je前設(shè)置斷點。
再次注冊盛险,發(fā)現(xiàn)依舊彈出了Bad瞄摊⊙郑可見這個函數(shù)并沒有什么特別的東西,還是在判斷失敗以后换帜。所以直接離開這一塊內(nèi)容楔壤。再回到上級調(diào)用。此時來到
發(fā)現(xiàn)上面并沒有跳開什么地方惯驼,于是繼續(xù)回到上一級蹲嚣。此時來到
此時這個地方相當(dāng)可疑。注意到直接跳開了我們斷開的函數(shù)跳座。
在這里我再次設(shè)置了一個斷點端铛,跑起來之后發(fā)現(xiàn)還是產(chǎn)生了錯誤,故繼續(xù)下一級調(diào)用疲眷,此時來到
再回到上一級禾蚕,來到
向上翻發(fā)現(xiàn)可疑點
發(fā)現(xiàn)jump跳開了函數(shù)。
設(shè)下斷點狂丝。點擊注冊换淆,發(fā)現(xiàn)沒有彈出Bad,而是挺住了几颜。同時倍试,我令下處的跳轉(zhuǎn)不實現(xiàn),點擊run蛋哭。發(fā)現(xiàn)彈出了Good
那么我們就追究這個函數(shù)跳轉(zhuǎn)的原因县习。觀察
此時有
這個值為軟盤指紋的值。
那么對函數(shù)上面代碼進(jìn)行分析谆趾。分析結(jié)果如下躁愿。
首先我們看到最后的一個異或
也就是[ebp-3C]^0x13572468 = Machine Code
同時我也查看了此時的ebp-3C指向的數(shù)據(jù)
第一步的逆向、
[ebp-3C] = Machine Code ^ 0x13572468.
代碼如下
緊接著向上看沪蓬,
關(guān)注到上面的這一系列代碼彤钟。運行到004017BA,下面窗口定位到[ebp-3C]
發(fā)現(xiàn)如下情況
跷叉,也就是這一串似乎與我的12345678有點相像逸雹。
基于這個情況,我再向上找云挟,找到了12345678的完整情況梆砸。
當(dāng)我運行到004017A4時,ebp-3C處的數(shù)據(jù)如下
也就是說园欣,在這中間帖世,發(fā)生了什么事情,使得這一串發(fā)生了改變俊庇。但是有意思的是狮暑,123456并沒有發(fā)生改變。
但是我們先前(在第一步的逆向之前)發(fā)現(xiàn)這一串?dāng)?shù)字是發(fā)生改變了的辉饱。
那么分析這call函數(shù)以后的代碼搬男。
此時,ebp指向原來78的位置彭沼,ebp+1指向56的位置缔逛。依次類推
按F7,56的情況發(fā)生了改變姓惑。
很容易可以明白褐奴,56的改變,發(fā)生于上一個函數(shù)于毙。
此時我們對我圖中倆紅色之間的代碼分析敦冬。
分析結(jié)果是,它將原來1234的順序改為了1324唯沮。
由此我們可以得到
第二步的逆向脖旱、
先獲得result的每一個位吼鳞。取出其相應(yīng)的十六進(jìn)制表示帕识,歸到原來的位置中。
緊接著我們來分析56的情況沙咏。
進(jìn)入函數(shù)
F7過后币旧,在此時這個點時践险,eax出現(xiàn)了我們想要的56
此時情況如下
ecx = 8->(減去edx的2)à6->(edx賦值2)à2
ebx = eax(為56)向左移位6個。
eax向右移位2吹菱。
此處的2來自調(diào)用函數(shù)前的
此時萬分注意巍虫,<u>有一個非非非常重要的點</u>
算術(shù)右移。
然后對結(jié)果進(jìn)行或毁葱。
分析結(jié)果如下:
56位所代表的的8位中
x1x2x3x4y1y2y3y4
à y3y4x1x2x3x4y1y2
但是垫言,y3y4并不一定是y3y4基于算術(shù)右移的可能性,有可能直接變成了11倾剿。故此位置有可能是任何值筷频,這取決于X1的值,因為數(shù)量不多前痘,就不分析X1了凛捏,直接給出所有可能結(jié)果。
第三步的逆向芹缔、
逆向坯癣,將其規(guī)規(guī)矩矩得到
y3y4x1x2x3x4y1y2
再將其進(jìn)行
如果與11進(jìn)行或的話,那么可以得到4個不同的結(jié)果最欠。
如果與00進(jìn)行或的話示罗,那么可以password就是作為結(jié)果惩猫。(其他的意義不大)
———————————————————————————————————————
接下來分析78的情況。
傳入ebp-3C地址蚜点,還有push1轧房,以及al是78的得到。
緊接著我們來到了函數(shù)內(nèi)部绍绘。
分析代碼:
同樣注意到
此處分析結(jié)果是
x1x2x3x4y1y2y3y4
à x2x3x4y1y2y3y4x1
有可能是跟1111111 x1進(jìn)行或的奶镶。
假如和1111111x1進(jìn)行或的話,就依次進(jìn)行陪拘。密碼有2^7種厂镇。我的代碼不作分析。(羅列所有可能情況)左刽,實際取決于x1的結(jié)果捺信。
所以得到
第四步的逆向、
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned temp=0, password=0;
unsigned result=0;
unsigned Machine_Code=0;
unsigned ch1=0, ch2=0, ch3=0, ch4=0;
printf("請輸入Machine Code\n");
scanf("%xu", &Machine_Code);
result = Machine_Code^(0x13572468);
ch4 = result & (0x0FF);
ch3 = (result>>8) & (0x0FF);
ch2 = (result>>16) & (0x0FF);//24狀態(tài)
ch1 = (result>>24) & (0x0FF);//13狀態(tài)
password |= ((ch1&0x0F)<<20);//第三個十六進(jìn)制歸位
password |= ( ((ch1&0x0F0)>>4) << 28);//第一個十六進(jìn)制歸位
password |= ((ch2&0x0F)<<16);//第四個十六進(jìn)制歸位
password |= ( ((ch2&0x0F0)>>4) << 24);//第二個十六進(jìn)制歸位
unsigned password11 = 0;
unsigned password21 = 0;
unsigned password22 = 0;
unsigned password23 = 0;
unsigned password24 = 0;
password |= (ch4>>1);//最后兩位十六進(jìn)制右移一位
password |= (ch4&0x1)<<7;
/*
有兩種情況欠痴,左移后把1弄沒了残黑,那么右移有兩種情況,+0x80或者不加
*/
password |= ((ch3>>6) + ( ((ch3&0x3F) << 2)) )<<8;//56兩位十六進(jìn)制斋否,的78位放在12位上梨水。
password21 = (password&0x0FFFFFFFF);
password22 = (password&0x0FFFFBFFF);
password23 = (password&0x0FFFF3FFF);
password24 = (password&0x0FFFF7FFF);
/*
如果和00或的話,原來的就是結(jié)果茵臭。
如果與11或的話疫诽,那兩位必然就為11
此時有四個可能
*/
printf("注冊碼:Password = %x\n", password);
printf("其他可能也OK的注冊碼如下:\n");
/*printf("Password 1 = %x\n", password21);
printf("Password 2 = %x\n", password22);
printf("Password 3 = %x\n", password23);
printf("Password 4 = %x\n", password24);
*/
system("pause");
}
幾個要點:
一、 在算術(shù)移位的情況下旦委,可能出現(xiàn)并行的注冊碼(多個注冊碼都可以成功)奇徒。
我在代碼中列出了一種類型。
二缨硝、跟蹤分析的時候其實我還跟蹤了關(guān)于將字符串轉(zhuǎn)換成為普通的字符摩钙。本來以為是字符串比較,后來才發(fā)現(xiàn)是直接轉(zhuǎn)化成十六位進(jìn)制的比較查辩。
三胖笛、找到調(diào)用的函數(shù)要逐個分析,不要一棍子打死宜岛。(這里有兩種分析類型长踊,險些出了岔子)。