沈陽電腦維修網,沈陽上門維修電腦服務
當前位置: 主頁 > 程序數據代碼>SRS Audio Sandbox破解紀實 >

SRS Audio Sandbox破解紀實

時間:2017-5-23來源:www.jdflqf.live 作者: 沈陽電腦維修網點擊:
沈陽電腦維修,上門維修電腦
  沈陽電腦維修上門服務13889116605:   最近挺忙的,本來需要各種為前路做準備,無奈自己天生屬于低血壓型的人,偏偏就是提不起勁兒來干正事兒,卻把大好的一天光陰全交代到SRS的分析工作上了。雖然說這多少算不務正業,不過由于本人有...   最近挺忙的,本來需要各種為前路做準備,無奈自己天生屬于低血壓型的人,偏偏就是提不起勁兒來干正事兒,卻把大好的一天光陰全交代到SRS的分析工作上了。雖然說這多少算不務正業,不過由于本人有著嚴重的軟件新版本強迫癥,故這算是給自己的一個開脫理由吧。   這款軟件的破解工作展開比較容易,沒有加殼,直接上工具分析之。首先請出OllyDBG來,通過查找字符串引用和查找APIMessageBox引用的老法子,很容易就定位了大概的關鍵代碼位置。   找到關鍵位置后,順手又記錄了一下函數調用棧,然后打開了神器IDA。用IDA載入后,跳轉到之前找到的關鍵代碼RVA處,著手分析。說起來,我自己喜歡將動態和靜態調試方法結合起來用,不如果不愿意太費神分析匯編代碼,有時候直接看運行時結果便是最直觀和省時的。載入后發覺之前判斷的關鍵點實際上是CWinApp::ShowAppMessageBox函數,繼續沿著剛才記錄的函數運行時調用棧往上找,依次順藤摸瓜:AfxMessageBox--->Sub44D240,這才到了SRS程序的代碼領空,于是正是著手分析。(IDA這個靜態分析功能實在是強大,它可以根據二進制代碼特征判斷出其是否是庫函數代碼。這大大節省了我的時間,應為對這類代碼我只需要看SDK文檔就行了,而不需要去分析其實際的代碼行為)   進一步根據線索判斷(Sub44D240里包含了SendMessage、AfxMessageBox、GetWindowText等函數,足以說明該函數的關鍵作用),我鎖定在了Sub44D240函數的Sub4430F0調用上,繼續追蹤到Sub442FF0上,繼而是Sub44B9E0過程,最終到了Sub44BC30過程上。在該過程中,我同時追蹤到了用戶輸入的ProductID以及SerialNumber等信息,這進一步是我確認了我的判斷。   該過程具體代碼如下: .text:0044BC30 .text:0044BC30;===============SUBROUTINE======================================= .text:0044BC30 .text:0044BC30;Attributes:bp-basedframe .text:0044BC30 .text:0044BC30check_PID_SNprocnear;CODEXREF:realCheckSN+182p .text:0044BC30 .text:0044BC30productId_segs_temp=dwordptr-14h .text:0044BC30new_ProdectID=dwordptr-10h .text:0044BC30sn_lowerDWord=dwordptr-4 .text:0044BC30SN=dwordptr8 .text:0044BC30 .text:0044BC30pushebp .text:0044BC31movebp,esp .text:0044BC33andesp,0FFFFFFF8h .text:0044BC36subesp,14h .text:0044BC39pushebx .text:0044BC3Apushesi .text:0044BC3Bpushedi .text:0044BC3Cpush14h;unsignedint .text:0044BC3Emovebx,eax;ebx指向ProductID首位置 .text:[email protected]@Z;operatornew(uint) .text:0044BC45movesi,eax .text:0044BC47leaeax,[esi+6] .text:0044BC4Apusheax .text:0044BC4Bmoveax,[ebp+SN] .text:0044BC4Eleaecx,[esi+4] .text:0044BC51pushecx .text:0044BC52leaedx,[esi+2] .text:0044BC55pushedx .text:0044BC56pushesi;新申請的14h的空間 .text:0044BC57pushoffseta4x4x4x4x;"%4x-%4x-%4x-%4x" .text:0044BC5Cpusheax;SN首地址 .text:0044BC5DcallString2Integer;將字符串SN轉換為數組,比如 .text:0044BC5D;“E6E9-24CB-2968-09BC”變為 .text:0044BC5D;E9E6... .text:0044BC62movecx,[esi+4];ECX為后半部分SN .text:0044BC65movedi,[esi];EDI為前半部分SN .text:0044BC67pushesi;void* .text:0044BC68mov[esp+40h+sn_lowerDWord],ecx .text:0044BC6Ccallj__free .text:0044BC71leaedx,[esp+40h+productId_segs_temp] .text:0044BC75pushedx .text:0044BC76pushoffseta4x;"%4x" .text:0044BC7Bpushebx .text:0044BC7CcallString2Integer;將ProductID第一段轉換為Word .text:0044BC81movesi,[esp+4Ch+productId_segs_temp];esi儲存productId_1 .text:0044BC85leaeax,[esp+4Ch+productId_segs_temp] .text:0044BC89pusheax .text:0044BC8Aleaecx,[ebx+0Ah] .text:0044BC8Dpushoffsetasc_48C804;"%x" .text:0044BC92pushecx .text:0044BC93callString2Integer .text:0044BC98movedx,[esp+58h+productId_segs_temp];EDX儲存ProductId_2 .text:0044BC9Caddesp,38h .text:0044BC9Fxoreax,eax .text:0044BCA1pusheax .text:0044BCA2pushesi .text:0044BCA3pusheax .text:0044BCA4pushedx .text:0044BCA5call__allmul .text:0044BCAAmovesi,eax;product_1*product_2乘積的低word放入esi .text:0044BCACleaeax,[esp+20h+productId_segs_temp] .text:0044BCB0pusheax .text:0044BCB1leaecx,[ebx+14h] .text:0044BCB4pushoffsetasc_48C804;"%x" .text:0044BCB9pushecx .text:0044BCBAmov[esp+2Ch+new_ProdectID+4],edx .text:0044BCBEcallString2Integer .text:0044BCC3movedx,[esp+2Ch+new_ProdectID+4] .text:0044BCC7moveax,[esp+2Ch+productId_segs_temp];eax保存productId_3 .text:0044BCCBaddesp,0Ch .text:0044BCCEpushedx .text:0044BCCFpushesi .text:0044BCD0push0 .text:0044BCD2pusheax .text:0044BCD3call__allmul .text:0044BCD8leaecx,[esp+20h+productId_segs_temp] .text:0044BCDCpushecx .text:0044BCDDpushoffsetasc_48C804;"%x" .text:0044BCE2addebx,1Eh .text:0044BCE5pushebx .text:0044BCE6movesi,eax .text:0044BCE8mov[esp+2Ch+new_ProdectID+4],edx .text:0044BCECcallString2Integer .text:0044BCF1movedx,[esp+2Ch+new_ProdectID+4] .text:0044BCF5moveax,[esp+2Ch+productId_segs_temp] .text:0044BCF9addesp,0Ch .text:0044BCFCpushedx .text:0044BCFDpushesi .text:0044BCFEpush0 .text:0044BD00pusheax .text:0044BD01call__allmul;結果edx高位,eax低位 .text:0044BD06movesi,edx .text:0044BD08shresi,10h .text:0044BD0Bmov[esp+20h+new_ProdectID],eax .text:0044BD0Fmov[esp+20h+new_ProdectID+4],edx .text:0044BD13xorebx,ebx .text:0044BD15movcl,10h .text:0044BD17call__allshr;{edx,eax}==new_prodectID>>10h .text:0044BD1Cmovecx,[esp+20h+new_ProdectID+4] .text:0044BD20xoredx,edx .text:0044BD22push1 .text:0044BD24andeax,0FFFF0000h .text:0044BD29pushedx .text:0044BD2Aaddesi,eax .text:0044BD2Cadcebx,edx .text:0044BD2Emovedx,[esp+28h+new_ProdectID] .text:0044BD32pushecx .text:0044BD33pushedx .text:0044BD34call__allmul;eax=0,edx為new_productID的低位 .text:0044BD39push0 .text:0044BD3Baddesi,eax .text:0044BD3Dpush8475h .text:0044BD42adcebx,edx .text:0044BD44pushebx .text:0044BD45pushesi .text:0044BD46call__alldiv;{edx,eax}=={edx,esi}/0x8475 .text:0044BD4Bpush0 .text:0044BD4Dpush0AE6000h .text:0044BD52pushedx .text:0044BD53pusheax .text:0044BD54call__allmul .text:0044BD59addeax,91F2884Dh .text:0044BD5Eadcedx,2DCh .text:0044BD64movcl,0Ah .text:0044BD66call__allshr .text:0044BD6Bpush0 .text:0044BD6Dpush2046h .text:0044BD72pushedx .text:0044BD73pusheax .text:0044BD74call__allmul .text:0044BD79movecx,0FFFFFFFEh .text:0044BD7Esubecx,eax .text:0044BD80moveax,0FFFFFFFFh .text:0044BD85sbbeax,edx .text:0044BD87movedx,[esp+20h+sn_lowerDWord] .text:0044BD8Bshldedx,edi,1 .text:0044BD8Faddedi,edi .text:0044BD91cmpedi,ecx .text:0044BD93jnzshortloc_44BDA5 .text:0044BD95cmpedx,eax .text:0044BD97jnzshortloc_44BDA5 .text:0044BD99moveax,1 .text:0044BD9Epopedi .text:0044BD9Fpopesi .text:0044BDA0popebx .text:0044BDA1movesp,ebp .text:0044BDA3popebp .text:0044BDA4retn .text:0044BDA5;--------------------------------------------------------------------------- .text:0044BDA5 .text:0044BDA5loc_44BDA5:;CODEXREF:check_PID_SN+163j .text:0044BDA5;check_PID_SN+167j .text:0044BDA5popedi .text:0044BDA6popesi .text:0044BDA7xoreax,eax .text:0044BDA9popebx .text:0044BDAAmovesp,ebp .text:0044BDACpopebp .text:0044BDADretn .text:0044BDADcheck_PID_SNendp 基本思路   通過分析,我了解到,其算法大概思路如下:首先,注冊流程有效輸入為SerialNumber和ProductID,RegistrationNo實際上沒有參與注冊的驗證計算過程。SRS通過系統各種信息生成ProductID,然后用戶需要提供與ProductID匹配的SerialNumber方能注冊。當然,SerialNumber是需要你拿美刀換的。   簡而言之,SRS將ProductID作fp變換,得到一個64bit長的整數,并將用戶輸入的序列號做fs變換同樣得到一個64bit長整數。為了使注冊成功,需要滿足: fp(gen())=fs(SerialNumber)成立   (1)   這其中,gen()的算法我們不需要管,因為其結果在界面ProductID框中已經顯示了。我們需要找到fp和fs的實現算法,并順利推出fs-1的實現。從而:  SerialNumber=fs-1(fp(ProductID))  (2) ProductID變換算法描述   我們首先描述fp的實現。fp基本上是由我不知道原理的各種數值變換組成,為了精確表述,我直接用C語言描述: ProductID變換函數描述 __int64getProductID(char*id){ __int64temp=1; DWORDelem; for(inti=0;i<4;i++){ sscanf(id+(i*5),"%x",&elem); temp*=elem; } //高地位變換 DWORDlowerDWord=temp; DWORDupperDWord=temp>>0x20; WORDlower=upperDWord; WORDupper=upperDWord>>0x10; upperDWord=lower; upperDWord<<=0x10; upperDWord|=upper; temp=lowerDWord; temp<<=0x20; temp|=upperDWord; temp/=0x8475; temp*=0xAE6000; temp+=0x2DC91F2884D; temp>>=0xA; temp*=0x2046; temp=0xfffffffffffffffe-temp; returntemp; } SerialNumber變換算法描述     接下來描述fs函數的實現。我們稱變換后的ProductID為TransPID,并且LowerDW和HighDW表示一個64bit整數的低雙字和高雙字,shld表示對應匯編指令的函數,TransSerialNumberHighDW和TransSerialNumberLowDW分別表示變換后的序列號高雙字和低雙字。則有:   TransSerialNumberHighDW(SerialNumber)= shld(UpperDW(SerialNumber),LowerDW(SerialNumber),1); (3)   TransSerialNumberLowDW(SerialNumber)= LowerDW(SerialNumber)+ LowerDW(SerialNumber);     (4)   fs(SerialNumber)= TransSerialNumberHighDW<<32|TransSerialNumberLowDW;           (5)   SerialNumber逆向變換算法描述   了解了fs的實現,我們接下來需要著手研究實現fs-1的思路。由于fs高雙字和低雙字分別由不同的方式變換的(3)、(4),所以我們需要分別求出SerialNumber的高低雙字。得到SerialNumber的低雙字很簡單,由(4)可知,我們只要將LowerDW(fp(ProductID))除以2就行。但需注意的是,整個雙字值域中,LowerDW(fp(ProductID))/2+(2<<31)同樣能滿足條件(由于溢出導致的相等),www.it165.net這點很重要!   再來考慮高位的算法。我們需要把HighDW(fp(ProductID))往右移一位,這是左邊補入的一位可以任意。這時需要注意,考慮到shld性質,有以下兩種情況: ①如果HighDW(fp(ProductID))最低位是1則需要LowerDW(SerialNumber)的最高位為1 ②如果HighDW(fp(ProductID))最低位是0則需要LowerDW(SerialNumber)的最高位為0   考慮到LowerDW(fp(ProductID))/2和LowerDW(fp(ProductID))/2+(2<<31)均可滿足條件,若是情況①則選取后者,因為此時可保證LowerDW(SerialNumber)的最高位為1。同理,若是情況②則需選擇前者。   該算法的C語言描述如下: voidgetSerialNumber(__int64productId,char*buffer){ DWORDupper=productId>>0x20; DWORDlower=productId; assert((lower&1)==0);//lower=snLower+snLower因此lower必須為偶數 DWORDsnUpper=upper>>1; DWORDsnLower=0; if((upper&1)==1){ snLower=lower/2; snLower+=(1<<31); }else{ snLower=lower/2; } DWORDLONGsn=snUpper; sn<<=0x20; sn|=snLower; WORD*p=(WORD*)&sn; sprintf(buffer,"%04x-%04x-%04x-%04x",p[0],p[1],p[2],p[3]); } 小結   IDA很強大,Crack很費時間,收獲的免費SRS使用權和投入的大量時間不成正比。結論:以后還是盡量少搞Crack吧。
上一篇:用于保護應用程序安全的DataSecure解決方案
查看[SRS Audio Sandbox破解紀實]所有評論
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼:
推薦內容
關于我們 服務價格 聯系我們 企業網站優化 沈陽網站建設 沈陽維修電腦
超联赛赛程时间表