最近一直在對某個用VB做的軟件(出於敬意不說名字)開刀,本人對VB編的軟件是極爲不屑的,認爲那是懶豬乾的活。但經過這次經歷,發現VB有個好處就是,反彙編的時候簡直就是天書中的天書,如果還加了幾道殼的話,哭吧。不過我這次練手的軟件只加了一道殼,而且有專門的脫殼機。掉外殼後,就開始分析代碼。
這個程序可能在多個地方有檢註冊的,所以暫時不考慮爆破。
這是一個重起註冊的軟件,也就是說它的註冊碼記錄在某個地方,結果它在註冊表裏記錄運算後的註冊碼。
註冊碼運算過程。
首先,把從公司拿到的外部註冊碼輸入(數字字符串),然後計算得到內部註冊碼(數字字符串),記錄到註冊表。
等到下次軟件重起,然後從內部註冊碼裏邊取某些數位,組成如a、bc、def一些數,然後取兩個 兩個的乘積,然後對這些乘積進行正弦(SIN)運算得到一條實數的字符串,再在這條數字字符串的小數部分取連續的三個數字組成內部比較碼。然後在判斷註冊的地方使用。
經過一番努力,暫時可以從內部比較碼推出註冊碼了。只貼出少量相關函數。
int zjm3(double x, int pos);
//得到比較的中間碼,x的正弦字符串的pos位置以(C風格排序第一個位置爲0),默認長度3。
int zjm3(double x, int pos)
{
char tmp[20], *cptr;
int i;
sprintf(tmp,"%.15f",sin(x));
cptr=tmp+pos;
*(cptr+3)='\0';
sscanf(cptr,"%d",&i);
return i;
}
這就是軟件把註冊碼轉換爲內部比較碼的函數,如果大家覺得有用就拿去吧,呵呵。