Lc3&Lc4 註冊演算法分析及序號產生器的製作

看雪資料發表於2004-06-18

破解加序號產生器編寫篇

作者: KernelKiller
使用工具: W32Dasm DebuggerKiller1.1(內部測試版) vc++6.0
系統平臺: Windows 2000 Server
軟體名字: 世界著名破解WINNT密碼工具 Lc3/Lc4  (從來都是它去破解別人..而今天卻要被我給破了)
日期    : 2004-06-17

破解宣告: 作者只是教大家破解和從複雜的反彙編裡面找註冊演算法並做出自己的序號產生器。注:破別人收費軟體總是不太好(最好不要破中國人的).


個人宣告: Lc3/Lc4此軟體已經是作者N年前破好,N年前寫好的序號產生器了.  為什麼還要翻老帳重寫教程?當年是用世界著名的核心偵錯程式Softice,可現在作者用的是自己設計的核心偵錯程式DebuggerKiller1.1(內部測試版)爆破軟體。 感覺就是不一樣!!!!   爽!! 


內容:
   哎~!Lc3/Lc4雖然是幾年前的東西了,但現在依然是最強的破NT密碼工具(速度一流)。可惜軟體限制只能用15次,好東西只能用15次太少了,就讓這個限制見鬼去吧!!! 作者我將帶領你們一步一步從反彙編程式碼裡找到爆破地方,和註冊演算法。     現在Lc5已經出來了,大家看了這篇文章就自己做個Lc5序號產生器吧。作者祝福你們!!

破解動態分析:Lc3
   他的註冊方法是,程式給出序列號,使用者輸入開鎖碼。。現在我們輸入一串假開鎖碼"KernelKiller",選擇OK, 程式彈出錯誤對話方塊"You have entered an invalid code,Please try again " 註冊失敗。 好。大概註冊過程分析就這樣

   載入核心除錯DebuggerKiller1.1(Ctrl + Y)
   用命令 addr 程式名 載入到程式空間 ,為了讓大家習慣採用和Softice一樣命令。
   設定斷點 bpx  GetWindowTextA
   輸入一串假開鎖碼"KernelKiller",選擇OK
  好我的核心偵錯程式截獲斷點。現在我們來到GetWindowTextA 首地址,因為現在是在系統的GetWindowTextA函式里,所以我們要跳出這個函式進入Lc3程式碼,可惜我沒有設計像Softice那樣的F11跳出CALL
只好找到RET 在這裡設定斷,按F5跳來到這個斷點RET,單步跟蹤,來到Lc3程式碼,併到了下面類似程式碼,我們就退出偵錯程式,X 進行靜態分析


破解靜態分析:Lc3

    現在進行靜態分析,開啟W32Dasm載入Lc3進行反彙編分析來到
:004201E7 8D8D00FFFFFF            LEA ECXDWORD PTR [EBP+FFFFFF00]    ~~~~~~~~~~~~~~~~~~~~~~~~~~
:004201ED 53                      PUSH EBX                                                      |
:004201EE E853E90300              CALL 0045EB46                                                 |
:004201F3 8D8DA4FEFFFF            LEA ECXDWORD PTR [EBP+FFFFFEA4]                             |
:004201F9 8B85A4FEFFFF            MOV EAXDWORD PTR [EBP+FFFFFEA4]                             |
:004201FF 8B80B8000000            MOV EAXDWORD PTR [EAX+000000B8]                             |
:00420205 FFD0                    CALL EAX                                                      |    不需要關心
:00420207 83F801                  CMP EAX, 00000001                                             |
:0042020A 0F859E000000            JNE 004202AE                                                  |
:00420210 8D8504FFFFFF            LEA EAXDWORD PTR [EBP+FFFFFF04]                             |
:00420216 50                      PUSH EAX                                                      |
:00420217 8B4DE0                  MOV ECXDWORD PTR [EBP-20]                                   |
:0042021A E827E90300              CALL 0045EB46                                                 |
:0042021F 8B45E4                  MOV EAXDWORD PTR [EBP-1C]           ~~~~~~~~~~~~~~~~~~~~~~~~~
:00420222 8B880C010000            MOV ECXDWORD PTR [EAX+0000010C];獲得程式的序列號                     
:00420228 8D55C8                  LEA EDXDWORD PTR [EBP-38] ;一個緩衝區 相當於 char cpBuf[BUF_MAX];用來儲存真實的開鎖碼
:0042022B 52                      PUSH EDX  ;作為引數壓棧 ;緩衝區
:0042022C 51                      PUSH ECX  ;作為引數壓棧  ;序列號
:0042022D E8DED9FEFF              CALL 0040DC10  ;呼叫這個函式功能計算真實的開鎖碼。待會我才解釋 GetUnLockCode
:00420232 83C408                  ADD ESP, 00000008  ;堆疊平衡
:00420235 8B45E4                  MOV EAXDWORD PTR [EBP-1C]
:00420238 8B8810010000            MOV ECXDWORD PTR [EAX+00000110]   ;獲得我輸入的開鎖碼
:0042023E 8D55C8                  LEA EDXDWORD PTR [EBP-38]         ;獲得程式真實的開鎖碼
:00420241 52                      PUSH EDX ;作為引數壓棧  //我輸入的開鎖碼
:00420242 51                      PUSH ECX ;作為引數壓棧  //程式真實的開鎖碼
:00420243 E884700200              CALL 004472CC   ;呼叫這個函式功能比較2個引數是不是相等 相當於strcmp
:00420248 83C408                  ADD ESP, 00000008 ;堆疊平衡
:0042024B 85C0                    TEST EAXEAX     ;比較返回值 1失敗,0成功
:0042024D 7533                    JNE 00420282      ;1失敗就跳 否則執行下面進入程式提示註冊成功
:0042024F 8B4DE4                  MOV ECXDWORD PTR [EBP-1C]         ~~~~~~~~~~~~~~~~~~~~~~~~~~~   
:00420252 C7811401000000000000    MOV DWORD PTR [EBX+00000114], 00000000                        |
                                  ;[EBX+00000114] 地址是1代表要註冊,清0代表註冊成功
:0042025C 8B8110010000            MOV EAXDWORD PTR [ECX+00000110]                             |
                                  ;[ECX+00000110] 地址是使用者輸入的開鎖碼
:00420262 50                      PUSH EAX                                                      |
:00420263 6820486D00              PUSH 006D4820                                                 |
:00420268 6800486D00              PUSH 006D4800                                                 |    不需要關心
:0042026D E8C0D80400              CALL 0046DB32   ;寫登錄檔                                     |
:00420272 33C0                    XOR EAXEAX    ;清0   作為對話方塊風格引數                     |
:00420274 50                      PUSH EAX        ;對話方塊風格引數                               |
:00420275 50                      PUSH EAX        ;對話方塊風格引數                               |
:00420276 68C0496D00              PUSH 006D49C0   ;要顯示的字串                               |
:0042027B E8009B0400              CALL 00469D80  ;彈出對話方塊                                    |
:00420280 EB0E                    JMP 00420290                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~


省略 ...............................

|:0042024D(C)    ;是錯誤跳轉到這裡
|
:00420282 33C0                    XOR EAXEAX
:00420284 50                      PUSH EAX  ;對話方塊風格引數
:00420285 50                      PUSH EAX  ;對話方塊風格引數
:00420286 68004A6D00              PUSH 006D4A00  ;要顯示的字串 
:0042028B E8F09A0400              CALL 00469D80 ;呼叫這個函式抬出對話方塊 提示註冊失敗。


(Ctrl + Y),設定Ring3斷點 Bpx 0042024B 
                              來到斷點把EAX改成0註冊成功

//好。到這裡你應該知道怎麼硬破解了。我就不多說啦。  下面我來研究註冊演算法,做自己的序號產生器

註冊演算法分析:Lc3

call 0040DC10  呼叫這個函式是獲得真實的開鎖碼   
                GetUnlockCode(char *cpSerial,char *cpUnlockCode) 返回真實的開鎖碼到cpUnlockCode裡


:0040DC10 55                      PUSH EBP
:0040DC11 8BEC                    MOV EBPESP
:0040DC13 83EC10                  SUB ESP, 00000010
:0040DC16 83C4F0                  ADD ESP, FFFFFFF0
:0040DC19 8D45F0                  LEA EAXDWORD PTR [EBP-10]
:0040DC1C 890424                  MOV DWORD PTR [ESP], EAX
:0040DC1F 8B4508                  MOV EAXDWORD PTR [EBP+08]
:0040DC22 40                      INC EAX
:0040DC23 89442404                MOV DWORD PTR [ESP+04], EAX
:0040DC27 C744240808000000        MOV [ESP+08], 00000008
:0040DC2F E8AC7F0300              CALL 00445BE0
:0040DC34 32C0                    XOR ALAL
:0040DC36 8845F8                  MOV BYTE PTR [EBP-08], AL
:0040DC39 8D45F0                  LEA EAXDWORD PTR [EBP-10]
:0040DC3C 890424                  MOV DWORD PTR [ESP], EAX
:0040DC3F C7442404C8FC6C00        MOV [ESP+04], 006CFCC8
:0040DC47 8D45FC                  LEA EAXDWORD PTR [EBP-04]
:0040DC4A 89442408                MOV DWORD PTR [ESP+08], EAX
:0040DC4E E8D7840300              CALL 0044612A
:0040DC53 8B45FC                  MOV EAXDWORD PTR [EBP-04]
:0040DC56 35C1985A71              XOR EAX, 715A98C1
:0040DC5B 8945FC                  MOV DWORD PTR [EBP-04], EAX
:0040DC5E 8B45FC                  MOV EAXDWORD PTR [EBP-04]
:0040DC61 C1E805                  SHR EAX, 05
:0040DC64 8B55FC                  MOV EDXDWORD PTR [EBP-04]
:0040DC67 C1E21B                  SHL EDX, 1B
:0040DC6A 03C2                    ADD EAXEDX
:0040DC6C 8945FC                  MOV DWORD PTR [EBP-04], EAX
:0040DC6F 8B450C                  MOV EAXDWORD PTR [EBP+0C]
:0040DC72 890424                  MOV DWORD PTR [ESP], EAX
:0040DC75 C7442404C0FC6C00        MOV [ESP+04], 006CFCC0
:0040DC7D 8B45FC                  MOV EAXDWORD PTR [EBP-04]
:0040DC80 89442408                MOV DWORD PTR [ESP+08], EAX
:0040DC84 E8D5840300              CALL 0044615E
:0040DC89 83C410                  ADD ESP, 00000010
:0040DC8C 33C0                    XOR EAXEAX
:0040DC8E C9                      LEAVE
:0040DC8F C3                      RET


現在是用VC++6.0 寫個自己的Lc3序號產生器。哎 N年東西了,程式碼有點亂。保持原來的程式碼風格

m_Edit1   EDIT控制元件,m_Edit1代表輸入程式的序列號
m_Edit2   EDIT控制元件,m_Edit2代表輸出的開鎖碼


void CLc3_4KeyDlg::OnChangeEdit1() 
{
    int HighSerial;
    char Serial[20];
    char buf[20];
    char UnlockCode[20];
    DWORD dwSwitchSerial;
    DWORD dwBakSwitchSerial;

    UpdateData(TRUE);
    memset(Serial,0,20);
    memset(UnlockCode,0,20);
    memset(buf,0,20);
    m_Edit2="";
    UpdateData(FALSE);

    sprintf(buf,"%s",m_Edit1);
    strncpy(Serial,buf+1,8);
    sscanf(Serial,"%08x",&dwSwitchSerial);
    dwSwitchSerial = dwSwitchSerial ^ 0x715A98C1;
    dwBakSwitchSerial = dwSwitchSerial;
    _asm{
        pushad
        mov eax,dwSwitchSerial
        mov ecx,dwBakSwitchSerial
        shl ecx,1Bh
        shr eax, 5
        add ecxeax
        mov dwSwitchSerial,ecx
        popad
    }
    _snprintf(UnlockCode,4,"%04x",dwSwitchSerial);
    HighSerial = dwSwitchSerial << 16;
    _snprintf(UnlockCode+4,4,"%04x",HighSerial);

    m_Edit2=UnlockCode;
    UpdateData(FALSE);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////


破解分析:Lc4

  和Lc3差不多.

註冊演算法分析:Lc4

call 00403EB0  呼叫這個函式是獲得真實的開鎖碼   
                GetUnlockCode(char *cpSerial,char *cpUnlockCode) 返回真實的開鎖碼到cpUnlockCode裡


GetUnlockCode: 
:00403EB0 83EC0C                  SUB ESP, 0000000C
:00403EB3 8B442410                MOV EAXDWORD PTR [ESP+10]
:00403EB7 6A08                    PUSH 00000008
:00403EB9 40                      INC EAX
:00403EBA 50                      PUSH EAX
:00403EBB 8D4C2408                LEA ECXDWORD PTR [ESP+08]
:00403EBF 51                      PUSH ECX
:00403EC0 E8AB1E0200              CALL 00425D70
:00403EC5 8D54241C                LEA EDXDWORD PTR [ESP+1C]
:00403EC9 52                      PUSH EDX
:00403ECA 8D442410                LEA EAXDWORD PTR [ESP+10]
:00403ECE 6888FA4600              PUSH 0046FA88
:00403ED3 50                      PUSH EAX
:00403ED4 C644242000              MOV [ESP+20], 00
:00403ED9 E865240200              CALL 00426343
:00403EDE 8B442428                MOV EAXDWORD PTR [ESP+28]
:00403EE2 3552AE376F              XOR EAX, 6F37AE52
:00403EE7 8BC8                    MOV ECXEAX
:00403EE9 C1E11B                  SHL ECX, 1B
:00403EEC C1E805                  SHR EAX, 05
:00403EEF 03C8                    ADD ECXEAX
:00403EF1 51                      PUSH ECX
:00403EF2 894C242C                MOV DWORD PTR [ESP+2C], ECX
:00403EF6 8B4C2430                MOV ECXDWORD PTR [ESP+30]
:00403EFA 6880FA4600              PUSH 0046FA80
:00403EFF 51                      PUSH ECX
:00403F00 E8EC230200              CALL 004262F1
:00403F05 33C0                    XOR EAXEAX
:00403F07 83C430                  ADD ESP, 00000030
:00403F0A C3                      RET



現在是用VC++6.0 寫個自己的Lc4序號產生器。哎 N年東西了,程式碼有點亂 保持原來的程式碼風格

m_Edit3   EDIT控制元件,m_Edit3代表輸入程式的序列號
m_Edit4   EDIT控制元件,m_Edit4代表輸出的開鎖碼

void CLc3_4KeyDlg::OnChangeEdit3() 
{
    int HighSerial;
    char Serial[20];
    char buf[20];
    char UnlockCode[20];
    DWORD dwSwitchSerial;
    DWORD dwBakSwitchSerial;

    UpdateData(TRUE);
    memset(Serial,0,20);
    memset(UnlockCode,0,20);
    memset(buf,0,20);
    m_Edit4="";
    UpdateData(FALSE);

    sprintf(buf,"%s",m_Edit3);
    strncpy(Serial,buf+1,8);
    sscanf(Serial,"%08x",&dwSwitchSerial);
    dwSwitchSerial = dwSwitchSerial ^ 0x6F37AE52;
    dwBakSwitchSerial = dwSwitchSerial;
    _asm{
        pushad
        mov eax,dwSwitchSerial
        mov ecx,dwBakSwitchSerial
        shl ecx,1Bh
        shr eax, 5
        add ecxeax
        mov dwSwitchSerial,ecx
        popad
    }
    _snprintf(UnlockCode,4,"%04x",dwSwitchSerial);
    HighSerial = dwSwitchSerial << 16;
    _snprintf(UnlockCode+4,4,"%04x",HighSerial);

    m_Edit4=UnlockCode;
    UpdateData(FALSE);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

相關文章