錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
[原創] 一款串口調試助手的序列號計算算法分析

作者: 佚名  日期:2018-05-17 06:55:12   來源: 本站整理

本次我花費了大約兩個半小時破解了一款名為“Serial Port Utility”的軟件(又名友善串口調試助手),該軟件的串口調試功能比較強大,今天試著分析了一下其序列號算法,這也是我第一次做序列號分析。 注冊成功截圖如下:  
    
我們首先使用PEID對程序查殼,結果如下:
 
發現是一個叫做“yoda's Protector v1.02 (.dll,.ocx)-> Ashkbiz Danehkar (h) *”的殼,在網上查詢后得知,這個結果有可能是錯誤的。 于是我們更換了另一個工具“ExeinfoPE”,結果如下:
 
這個軟件的結果顯示,這個程序沒有殼。

我們從軟件目錄下看到了大量Qt5開頭的動態鏈接庫,證明其軟件是用Qt5編寫的。
    
現在用OD加載程序,觀察ASCII字符串,我們會注意到這樣一個字符串: 
 
雙擊定位:
 
其中,經過分析可以得知,eax保存的是Qt獨有格式的字符串(輸入的序列號字符串),并且偏移地址0x04處是字符串長度,0x0C處是前導說明信息塊的字節數,或者說是字符串信息的偏移地址。這一段代碼說明,若序列號長度不為0x1D(即29個字符),就會報錯。那么我們任意輸入一個29字符的字符串,出現以下提示:
 
然后我們定位到具體字符串,結果如下:
 
雙擊定位到代碼:
 
這個代碼顯然是通過別的地方的代碼通過跳轉指令跳轉過來的(因為上方有一個jmp,順序執行的流程直接被阻斷),我們發現跳轉來自004150C0:
 
je成立的條件是,al=0,而在test al,al上方是一條call語句,我們知道函數的返回值通常通過eax寄存器返回,因此可以推得,al來自于函數00439F30的返回值,我們跟進去:
 
發現一條call指令,我們跟進去:
 
可見該函數首先判斷長度是否為0x1D(地址0x4399F5處),上方Qt5Core._ZN7QString14trimmed_helperERKS_從名字上就可看出是用于去除字符串兩端空白字符的。如果長度不為0x1D,直接返回0(因為004399F3處有一句xor eax,eax等價于mov eax,0)。我們跟著004399F8處的je來到下面:
剛開始的代碼都是一些和Qt5內核有關的代碼,直接無視,看到下面關鍵代碼:
 
我們注意到這個循環,我發現Qt的程序有一個風格,就是函數傳值的時候,不使用push指令,而是直接通過mov去寫堆棧。
這段匯編代碼等價于下面的代碼:
[C++] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
*edi = 0B217808;//Qt字符串對象地址
eax = *edi;
ebx = 0;
esi = 0;
 
do
{
    edx = eax + ebx * 2;//字符串當前字符位置地址計算
    edx += *(eax + 0xC);//加上字符串信息起始偏移地址
    ecx = 0;
    edx = (unsigned short)*edx;
    eax = (short)dl;
 
    if(dx > 0xFF)
    {
        eax = ecx;
    }
 
    ecx = *(ebp - 0x5C);
    sub_00438680(eax);
    esi += eax;//校驗和計算
    eax = *edi;
    ebx++;
    ecx = *(eax + 4);
    edx = ecx - 2;
}while(edx > ebx)

我們看一下00438680函數:
 
其中有一個jmp.&libstdc++-6._ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEcj引起了我們的注意,從名稱上我猜測是char_trait的find函數,經過百度查詢如下:
 
詳見:https://msdn.microsoft.com/zh-cn/library/y33bd1yh.aspx
可見,這是一個字符串定位函數,這個call的作用是將在一個字符串中查找某一個字符并返回該字符的索引。
那個字符串經過研究測試是“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”。
該函數的作用:如果輸入的字符是”-”,那么直接返回0,否則返回索引。
我們回到之前調用該函數的代碼,可以發現計算的校驗和就是序列號前27個字符對應字符串中的索引之和,除了”-”符號。 我們繼續往下看:
 
作者沒有刪除代碼中的調試信息,里面提供了很多信息,這里提醒我們剛才計算的是校驗和,我們將字符串最后兩個字符按照上面校驗和的算法計算,發現這個數值和剛才的校驗和正好相等,說明字符串最后兩個字符就是用于校驗的。
我們往下可以看到大量的信息,這里只挑選一個字段說明:
 
其中,00439F95處的eax是字符串內容開始偏移0x0C處(由00439F78處得到的)的文本(注意該字符串是wchar_t*類型),調用了一個函數,地址位于004386B0,我們跟進去看到如下代碼:
    
我們發現該函數和00438680處的函數類似,除了下面多了一條div指令以外,經過分析可以得到,其將會將find函數的返回值對一個參數中指定的值取余數。
我們由00439F7D處的代碼,可以看到那個值是9。00439FA0處,把轉換后的值保存到了[ebp-0xB0]的位置。
右邊的說明提醒我們這個字段是”License Version”,類似的還有”Product Name”,”Product Version”,”Active Mode”,”Language”,”SoftwareType”,”Valid Period”,其中前兩個參數的轉換后的值分別保存到了[ebp-0xB4]和[ebp-0xB8]處,其它參數的值轉換完僅供調試信息輸出用。
 
我們繼續跟蹤到這里,在0043A8A8行附近,可以在右邊寄存器窗口eax處看到輸出的調試信息(作者居然忘了刪除掉調試信息輸出代碼,看的一清二楚)。
由0043A8CA到0043A8F2的代碼我們可知,只有當”License Version”等于3,”Product Name”等于1并且”ProductVersion”不等于2,函數才會返回1表示成功。
我們去網上搜索了一個序列號:
SA56W-UR34V-7KY76-XB31F-HZPAU 
有效期:1年 
可以看到序列號的格式類似于這樣,并且我們知道以下信息:
Calculate Sum:390
License Version:3
Product Name:1
Product Version:3
Active Mode:1
Language:1
Software Type:2
Valid Period:2
我們開始嘗試修改Software Type的值,發現其值等于2時表示個人版,為3時表示專業版。
然后我們嘗試修改Valid Period的值,發現其值等于1時表示一個月,2表示一年,3表示3年,4表示5年,5表示終生。
所以最終序列號是這樣的:11111-UR311-85111-11111-1112J
其中“UR311”以及”85”必須固定,其它的隨便寫,校驗碼算對,這樣出來的序列號一定是專業版終生。
軟件下載鏈接:
鏈接:https://pan.baidu.com/s/1T_zvD2aUjn-xJrL5CNATVA 密碼:zyv9 
另附分析程序:
[C++] 純文本查看 復制代碼
01
56
57
58
59
60
// Serial Port Utility破解.cpp: 定義控制臺應用程序的入口點。
//
 
#include "stdafx.h"
 
char *ss = (char *)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sn[29];
 
int GetSSN(char ch)
{
char p[2];
p[1] = 0;
p[0] = ch;
return strstr(ss,p) - ss;
}
 
int sndiv(int x,int p)
{
return x % p;
}
 
 
int main()
{
char *str = (char *)"SA56W-UR34V-7KY76-XB31F-HZPAU";
 
//06 - License Version [ebp - 0xB0] = 3 /9
//07 - Product Name [ebp - 0xB4] = 1 /2
//08 - Product Version [ebp - 0xB8] != 2 /5
//09 - Active Mode /3
//0A - Language /5
//0C - Software Type /5
//0D - Valid Period /6
//char *str = (char *)"11111-UR311-81111-11111-1112F";
 
 
int i;
int sum = 0;
 
for(i = 0;i < 29;i++)
{
if(str[i] != '-')
{
sn[i] = GetSSN(str[i]);
}
else
{
sn[i] = 0;
}
}
 
for(i = 0;i < 27;i++)
{
sum += sn[i];
}
 
printf("Calculate Sum:%d\n",sum);
printf("License Version:%d\nProduct Name:%d\nProduct Version:%d\nActive Mode:%d\nLanguage:%d\nSoftware Type:%d\nValid Period:%d\n",sndiv(sn[0x06],9),sndiv(sn[0x07],2),sndiv(sn[0x08],5),sndiv(sn[0x09],3),sndiv(sn[0x0A],5),sndiv(sn[0x0C],5),sndiv(sn[0x0D],6));
return 0;
}


熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 玖玖资源站无码专区| 亚洲av无码乱码在线观看野外 | 日韩专区无码人妻| 日本精品无码一区二区三区久久久| 日韩精品无码人妻免费视频| 亚洲Av无码国产情品久久| 69天堂人成无码麻豆免费视频 | 中文成人无码精品久久久不卡| 午夜无码伦费影视在线观看| 九九无码人妻一区二区三区| 久久精品成人无码观看56| 国产精品无码久久av不卡 | 人妻丰满熟妇AV无码区免| 国内精品人妻无码久久久影院导航| 亚洲另类无码专区首页| 久久久久亚洲精品无码系列| 国产精品无码DVD在线观看| 99无码人妻一区二区三区免费| 亚洲av永久无码精品网站| 中文字幕精品无码久久久久久3D日动漫 | 亚洲Av永久无码精品三区在线| 精品一区二区三区无码视频| 中文字幕无码亚洲欧洲日韩| 无码国内精品久久人妻蜜桃| 国产在线拍揄自揄拍无码| 国产亚洲?V无码?V男人的天堂 | 无码国内精品久久人妻麻豆按摩 | 亚洲AV无码国产精品色| 麻豆aⅴ精品无码一区二区| 国产成人无码久久久精品一| 无码国产成人午夜电影在线观看 | 亚洲av无码不卡私人影院| 无码人妻丰满熟妇啪啪网站牛牛 | 精品无码一区二区三区爱欲| 久久青草亚洲AV无码麻豆| 亚洲av激情无码专区在线播放| 熟妇人妻系列aⅴ无码专区友真希| 丰满少妇人妻无码| 久久无码精品一区二区三区| 国模GOGO无码人体啪啪| 无码137片内射在线影院 |