用“破解除錯”的方法修改序號產生器(SDK)功能――獻給自由的FCG和所有Cracker (23千字)

看雪資料發表於2015-11-15

標 題:用“破解除錯”的方法修改序號產生器(SDK)功能——獻給自由的FCG和所有Cracker (23千字)

發信人:La0Qian  

時 間:2004-02-09 13:07:34

詳細資訊:



【題目】用“破解除錯”的方法修改序號產生器(SDK)功能――獻給自由的FCG和所有Cracker

因為我們FCG的“家”總是居無定所,只好發表在看雪這裡了。

【* * 作者】 laoqian[FCG]
【作者郵箱】 lao-qian@163.com
【作者主頁】 FCGchina.126.com
【使用工具】 Delphi 7 Mini-Edition,Microsoft Visual C++ 6.0,ollydbg 1.09 ,W32DASM10,UltraEdit8.0
【* * 平臺】 Win98se/2000/XP(有小bug)
【軟體名稱】 FCG 序號產生器 SDK

【下載地址】 FCGchina.126.com

【破解宣告】 我是一隻小小鳥,偶得一點心得,願與大家分享:)
------------------------------------------------------------------
【* * 內容】
     本人在做社群遊戲伴侶V1.11(聯眾,邊鋒遊戲牌類記牌器,註冊後全部功能可用,破文詳見看雪論壇精華)的序號產生器時,採用了本組織FCG的序號產生器模板(FCG SDK模板 1.5.1.126 for Delphi,you_known[FCG]開發)。在編制過程中,由於社群遊戲伴侶V1.11需分別註冊聯眾,邊鋒使用者,而此模板只提供一個註冊視窗,當時匆忙中只好寫了2個序號產生器發布。某天無聊又無事,又很懶於破解軟體(也主要因為是讓那幾個CCG的crackme搞得我頭暈對CRACk幾乎喪失信心),突發念頭,把以前的2個序號產生器合併為一。
     仔細看了看you_known[FCG]序號產生器模板(Delphi版SDK),研究發現一些有趣的東東,不敢敝帚自珍,遂寫下這篇拙文。
     首先看到下面you_known[FCG]的宣告瞭嗎?
///////////////////////////////////////////
  名稱: FCG SDK模板 1.5.1.126 for Delphi
  作者: Mystery(you_known[FCG])
  描述: 
           沒有使用VCL,沒有使用類,純API寫成,移植簡單,對資源稍加修改
        即可輕易轉為Visual C,MASM,Borland C等源程式。本原始碼僅供FCG
        成員內部使用,作為FCG成員,你可以自由修改此程式碼(不要移除本說
        明內容),若你修改了其中的不足,請寄我一份(you_known@163.com)。

        嚴禁非法傳播,或者提供給組織外部的人使用!!
        僅以此獻給自由的[FCG]。
        版權: Copyright(C)2000-2003 Mystery Studio.
 ///////////////////////////////////////////       
 $$$$因此我不能釋出全部程式碼!只發布我新增的相關程式碼。!!!!看不明白處,請見諒。
     或者你努力加入FCG,你即可獲得全部原始碼!
     願自由的[FCG]發展壯大!!!自由萬歲!!!
*****************
   說實話,在接觸Crack以前,我基本不會程式設計!中學、大學學過一些basic和fortrun,考完試,就還給老師了。工作後,也只是用計算機而已。而10年之後喜歡了Crack,不知不覺就耳聞目睹,居然能看懂程式了,當然是關於破解的程式!因喜歡Crack,而進而程式設計序,大有人在吧?^_^
   但這次是我第一次真正程式設計,雖然是在別人的基礎上。此前,我甚至不會用Delphi、Visual C+等,這次下來,基本通了一遍。感謝Crack,此後我可以說我會程式設計了!!!
   不說了,再說有灌水之嫌了。
   
 ****************
 廢話少說,言歸正傳:
 ****************
     為什麼叫 用“破解除錯”的方法修改序號產生器功能?
     因為我說過此前我不會程式設計,對API函式程式設計更是一竅不通!而這次我是用除錯(類似設斷點)的方法。
     用過Delphi7的都知道,它有一項Debug功能,其中功能鍵和ollydbg差不多,F9執行,F8單步跟蹤,F5設斷,...,其中還有View CPU除錯視窗,雖不如OD全,但什麼eax,edx等都在,甚至還有彙編視窗!這對於我來說,足夠了,因為我有FCG SDK模板原始碼!
     你會說,為什麼這麼費勁呢?因為這個序號產生器體積小啊!編譯後才幾十kB,你用自己編的試試,少說幾百kB!
     
 第一步,首先來分析資源
    SDK壓縮包中的說明: res15.rc  資源原始檔,只能手工修改。
    好,可我不會手工修改!怎麼辦?我要新增很多東東啊!
   沒辦法,只好先編譯再說!把資源原始檔編譯成res15.res。
   我記得某位大俠說過編譯後的res檔案已經與語言無關了,這時我們用Visual C就可以開啟res15.res看看!列位看官說了,為什麼不用VC6直接開啟res15.rc?這裡的res15.rc是用Delphi處理的,VC6不認,而Delphi卻沒有開啟rc檔案的功能,明白了?
   開啟後,你可以隨便修改了,就這麼簡單!新增,刪除,改風格...不要說你不會用VC6,我也是第一次用!
   但是重要的一點,不要隨便改那些單元屬性的ID,新增更改的都要記住那些ID,VC很方便得到ID。這是後話了。

 第二步,來看看.dpr檔案(Delphi的原始碼)了,這是首先靜態分析,和破解一樣。
    用Delphi7開啟.dpr檔案,看到如下(見後):
    我為了寫方便,就不分別先後了,只是說說我的思路。以下程式碼是我修改過的。
    
   一. 看到“全域性變數、常量資料宣告”,你不難理解,這是為了序號產生器編制方便。
   二. 重點看到“資源常量定義”那裡,發現什麼,這些就是我上面說的各個單元的ID!其中著名增加的是我新增的,就是我在第一步修改資源時得到的ID!
   三. 如果我們只是到這裡,我們的工作幾乎就可以完成了:
      1.我們新增2個註冊碼Edit框,改幾個按鈕值。
      2.增加幾個變數,常量,再把裡面的幾個case of選項改改。
      3.新增序號產生器的子程式。
      4.編譯完工。
   這是地球人都會的!^_^
   
 第三步. 本文核心,動態除錯!
     到了這裡,這裡序號產生器基本已經做好了。
     但是我要給他新增功能:
        1.輸入使用者名稱同時,可實時顯示註冊碼。(如果實現好像很方便,也很...)
        2.增加幾項超級連結效果。(只是表面文章而已)
        3.直接寫入登錄檔,完成註冊。(也是為了方便)
        
     這個可沒有原始碼了,要自己寫。重點是第一項難辦,第二、三項好辦。
     
  解決1.  輸入使用者名稱,可實時顯示註冊碼。 
    仔細觀察,我們可以在//主對話方塊過程函式//發現臭名昭著的window訊息函式WM_COMMAND,它是什麼地球人都知道!而關鍵就在那裡。
    我們在這個WM_COMMAND那裡下面的“case wParam of”那行F5設斷點。F9執行,斷點攔住了,但是F8按了好久,還沒有進入程式。忽然想起來,這個WM_COMMAND訊息函式是誰都用的,關掉斷點。F9進入序號產生器。
    重新在那裡F5設斷點,點選任一按鈕,斷下。
    這時你看一下wParam的值,就是那些按鈕ID!怎樣看?Delphi7提供的,滑鼠在“wParam”上面停留。
    明白了,就是這樣簡單,那按鈕ID我們都看到了,點哪個執行那個ID選項!
    此刻,新增case wParam of的選項,選項是ID為使用者名稱的輸入框(Edit屬性),...
    這時我點選註冊使用者名稱的輸入框(Edit屬性),馬上中斷,可是它卻不執行我們新增的case of的選項!!也就是說,反覆除錯,檢視wParam的值也不是那Edit框的ID,而是亂七八糟的數!
    我們進入Debug功能View CPU除錯視窗,看看,發現eax的值明明是我們的ID(顯示16進位制)啊?但是F8跟蹤下去,就是不執行我們新增的ID項,檢查程式也沒錯。
    什麼原因呢?找啊找,找到一個好朋友――
    開啟看雪的書第一版,找到WM_COMMAND函式的解釋(手頭只有這書),看到了Hiword(wParam),Loword(wParam)的說明,試試改為新增case Loword(wParam) of選項,OK!
    我們點選註冊使用者名稱的輸入框(Edit屬性),這次中斷了!我找到你了
    新增我們的程式碼,再說後面的那些都是多餘了!
    
 解決2. 增加幾項超級連結效果
    超級連結效果SDK裡有子程式,在子程式裡但是他是設的常量(如網站地址等),我要增加幾項,常量就不行了。
    為了利用他的子程式,當然,我也不會編新的!我們還是用上面的思路。
    這次是Text屬性框,設斷,點選馬上中斷,可是無論在case Loword(wParam) of還是case wParam of裡面,都沒有執行我們的ID!我不明白了。
    只好把Text屬性改成Edit屬性,這樣,就中斷了,後面同上理。
    自己看看我的更改程式碼,你會理解我的思路。
     
  解決3.直接寫入登錄檔,完成註冊。
     我們利用它原來的註冊按鈕改造,新增自己的子程式,完成,不用除錯斷點了,程式碼自己看吧。
     btw:如果不是寫入登錄檔,而是寫在其他地方,或者是keyfile等,你都可以如法炮製自己新增。
    
////////////////////////////////////////////////////////////////////*)
{$J+}
program Keygen;

uses Windows, Messages, ShellAPI;
{$R res15.res}

var
  ////////////////////
  //全域性變數資料宣告// ;不要修改全域性變數!^_^明白了可以改!^_^
  ////////////////////
        szName:array[0..54] of char;   //輸入使用者名稱
        szNamebak:array[0..54] of char;   //輸入使用者名稱 新增
        szCode:array[0..54] of char;   //輸出註冊碼
        namelz,namebf,snlz,snbf: PAnsiChar;   //輸出使用者名稱,註冊碼,寫入登錄檔
        Reg_Nag:integer;    //聯眾邊鋒標誌 ,加入標誌是因為有2個序號產生器,寫2個登錄檔!
        S_link: PAnsiChar;    //超鏈變數,增加!!
        flAgree:BOOL =      FALSE; //使用者接受協議標誌
        略....
        h_Icon: HICON;                  //例項控制程式碼

//*lines 60*********以下可以自己修改***************************************
const
  ////////////////
  //常量資料宣告//
  ////////////////
  (*顏色設定*)
clBackground =       $000000 //背景顏色 
略....

  (*主對話方塊*)
                略....
        szBy ='http://www.ptcn.com';//軟體開發者
        szCracker ='laoqian[FCG]';//解密人
        szCrackeremail ='mailto:lao-qian@163.com'; //解密人email
        略....
        szLink ='http://FCGchina.126.com';//主頁地址
        略....

  (*協議對話方塊*)
        szLicenseCaption='終端使用者許可協議'; //協議對話方塊標題
        略....
                        
  (*關於對話方塊*)
        szAboutCaption ='關於'; //關於對話方塊標題
        略....
      '〖模板修改〗'#10'by laoqian[FCG]'#10#10+
'版權所有(C)中國自由破解聯盟';
 //======================================================================
//這是社群遊戲伴侶V1.2序號產生器原始碼,我以前已經發表過,只說說改正的.
//聯眾部分序號產生器程式,
//------------------------------------------------------------
procedure Calculatelz(A:PAnsiChar);
var
s1,s2,s3,s4 : string;
m,n,i,inc     :integer;
c1 : char;
begin
     s1:=A;
     m:=length(s1);
     n:=0;
     for i:=1 to m do
       begin
         c1:=s1[i];
         inc:= ord(c1);
         n:=n+inc*(i+122)+i;
       end;
     n:=n mod 10000;
     str(n,s2);
      case length(s2) of  //這裡說明若不足4位前面補0
       1: s2:='000'+s2;
       2: s2:='00'+s2;
       3: s2:='0'+s2;  
      end;               //
     s3:=s1+s2;
     m:=length(s3);
     n:=1246;
     for i:=1 to m do
       begin
         c1:=s3[i];
         inc:= ord(c1);
         n:=n+(i-1)*m+ inc*(m1)+(i-1)*(i-1);
       end;
     n:=n mod 10000;
     if n<1000 then n:=n+6000;
     str(n,s4);
  lstrcpy(szCode,PAnsiChar(s4+S2));
end;
//--------------------------------------------------------
//////////////////////////////////////////////////////////////////////
//邊鋒部分序號產生器程式
procedure Calculatebf(A:PAnsiChar);
var
s1,s2,s3,s4 : string;
m,n,i,inc     :integer;
c1 : char;
begin
     s1:=A;
     m:=length(s1);
     n:=0;
     for i:=1 to m do
       begin
         c1:=s1[i];
         inc:= ord(c1);
         n:=n+inc*(i+255);
       end;
     n:=n mod 10000;
     str(n,s2);
      case length(s2) of     //這裡說明若不足4位前面補0
       1: s2:='000'+s2;
       2: s2:='00'+s2;
       3: s2:='0'+s2;       //  
      end;
     s3:=s1+s2;
     m:=length(s3);
     n:=3210;
     for i:=1 to m do
       begin
         c1:=s3[i];
         inc:= ord(c1);
         n:=n+(i-1)*m+ inc*(m1);
       end;
     n:=n mod 100000;
     if n<10000 then n:=n+80000;
     str(n,s4);
  lstrcpy(szCode,PAnsiChar(s4+S2));
end;

//--------------------------------------------------------
//////////////////////////////////////////////////////////////////////
//寫入登錄檔程式,這是我增加的直接寫入登錄檔的程式碼
procedure RegCreate(A,B:PAnsiChar;Reg_Nag:integer);
 var
    cbDataB:integer;
    hkey_reg:HKEY;
 begin
      cbDataB:=length(B)+1;  //cbData 引數為儲存鍵值資料的長度,好像W2K,XP有用。
                             //鍵值資料型別為reg_sz時,鍵值資料字串長度+1
      case Reg_Nag of
        1:
          begin
          //建立子鍵
           RegCreateKey(HKEY_CURRENT_USER,'Software\zgsq\lzUser',hkey_reg);
           //寫入鍵值資料
           RegSetValueEx(hkey_reg,A,0,reg_sz,B,cbDataB) 
           // 關閉
           RegCloseKey(hkey_reg);
          end;
        2:
          begin
            RegCreateKey(HKEY_CURRENT_USER,'Software\zgsq\bfUser',hkey_reg);
            RegSetValueEx(hkey_reg,A,0,reg_sz,B,cbDataB);
            RegCloseKey(hkey_reg);
          end;
      end;
  end;


//*lines 130********以上可以自己修改***************************************

const
  ////////////////
  //資源常量定義// ;不要修改!  ^_^明白了可以改!^_^
  ////////////////
        MAINICON             =           100  
        略......
        IDD_MAINDLG          =           2000 
        MAIN_DO1              =          2001     //增加
        MAIN_EXIT            =           2002 
         略......
        MAIN_SOFT            =           2005 
        MAIN_BY              =           2006 
        MAIN_CRACKER         =           2007 
        MAIN_DATE            =           2008 
        MAIN_CODE1           =           2009     //增加
        MAIN_NAME1           =           2010     //增加
        MAIN_LINK            =           2011 
        MAIN_COPY            =           2012 
        MAIN_CODE2           =           2013     //增加
        MAIN_NAME2           =           2014     //增加
        MAIN_DO2             =           2015     //增加
        
         略......

//////////////////////////////////////////////////////////////
//計算字串行數函式
 略......

//////////////////////////////////////////////////////////////
//繪製標題欄函式
 略......

//////////////////////////////////////////////////////////////
//繪製按鈕函式
 略......

//////////////////////////////////////////////////////////////////
//動態顯示窗體函式
 略......

//////////////////////////////////////////////////////////////////
//超連結過程函式
function LinkProc(h_Wnd: HWND; Msg, wParam, lParam: DWORD): LRESULT; stdcall;
var
  l: POINTER;
begin
  Result := 1;
   case Msg of
     WM_LBUTTONUP:
       //滑鼠左鍵點選後開啟瀏覽器,定位到主頁地址
       ShellExecute(0, nil, S_Link, nil, nil, 0);     //原來S_Link是常量,我們改為變數
    WM_NCHITTEST:
      //將 WM_NCHITTEST 返回 TRUE 可以接收滑鼠動作,實現按下功能 !
      Result := 1;
    WM_SETCURSOR:
      //更改滑鼠移動時的樣式
      SetCursor(h_Cur);
    else
      begin
        l :=pointer(GetWindowLong(h_Wnd, GWL_USERDATA));
        CallWindowProc(l, h_Wnd, Msg, wParam, lParam);
      end;
  end;
end;

//////////////////////////////////////////////////////////////////
//字幕滾動過程函式
 略......
//////////////////////////////////////////////////////////////////
//關於對話方塊過程函式
略......
//////////////////////////////////////////////////////////////////
//主對話方塊過程函式
function MainProc(hDlg: HWND; Msg, wParam, lParam: DWORD): LRESULT; stdcall;
const
  rcCaption: TRECT = ();
var
  略....
  h_Link,h_by,h_CRACKER: HWND;   //增加
  略....
  byUser,CRACKERUser: integer;  //增加
begin
  Result := 0;
  case Msg of
    WM_INITDIALOG:
      begin
        //計算標題欄矩形區域大小
        略....

        SetDlgItemText(hDlg, MAIN_LINK, szLink);//顯示主頁連結
        SetDlgItemText(hDlg, MAIN_DATE, szDate);//顯示釋出日期
        SetDlgItemText(hDlg, MAIN_SOFT, szSoft);//顯示軟體名
        SetDlgItemText(hDlg, MAIN_BY, szBy);//顯示軟體開發者
        SetDlgItemText(hDlg, MAIN_CRACKER, szCracker);//顯示解密人
        略....

        //建立並設定超連結字型
        h_LinkFont := CreateFont(略....);

      //顯示FCG主頁超鏈
        h_Link := GetDlgItem(hDlg, MAIN_LINK);
        SendMessage(h_Link, WM_SETFONT, h_LinkFont, 0);
         //為其設定單獨的訊息處理過程,實現超連結效果
        lUser := SetWindowLong(h_Link, GWL_WNDPROC, integer(@LinkProc));
        SetWindowLong(h_Link, GWL_USERDATA, lUser);
        AnimateShow(hDlg);

      //顯示軟體開發者超鏈
        h_by := GetDlgItem(hDlg, MAIN_by);
        SendMessage(h_by, WM_SETFONT, h_LinkFont, 0);
          //為其設定單獨的訊息處理過程,實現超連結效果
        byUser := SetWindowLong(h_by, GWL_WNDPROC, integer(@LinkProc));
        SetWindowLong(h_by, GWL_USERDATA, byUser);
        AnimateShow(hDlg);

      //顯示解密人超鏈
        h_CRACKER := GetDlgItem(hDlg, MAIN_CRACKER);
        SendMessage(h_CRACKER, WM_SETFONT, h_LinkFont, 0);
          //為其設定單獨的訊息處理過程,實現超連結效果
        CRACKERUser := SetWindowLong(h_CRACKER, GWL_WNDPROC, integer(@LinkProc));
        SetWindowLong(h_CRACKER, GWL_USERDATA, CRACKERUser);
        AnimateShow(hDlg);


      end;
    WM_LBUTTONDOWN:
      begin
        //響應滑鼠左鍵按下訊息,若在標題欄內則使窗體移動
        略....
      end;
    WM_PAINT:
      begin
        //響應繪製訊息,繪製標題欄
        略....
      end;

    WM_COMMAND:       //著名的window訊息函式
      begin
        case wParam of     //我們可以在這裡下斷點!!!!
          MAIN_DO1:      //宣告的ID(常量)選項,以下很多同
            begin
              //產生寫註冊碼按鈕按下
              //獲取輸入名
              GetDlgItemText(hDlg, MAIN_NAME1, szName, 55);
              namelz:=szName;
              if (length(namelz)>0) and  (length(namelz)<54) then
               begin
                //計算註冊碼
                Calculatelz(szName);
                snlz:=szCode;
                Reg_Nag:=1;   //計算註冊碼聯眾標誌,加入標誌是因為有2個序號產生器,寫2個登錄檔!
                if szName<>szNamebak  then
                //寫登錄檔
                 RegCreate(namelz,snlz,Reg_Nag);
               end;
            end;
          MAIN_DO2:
            begin
              //產生寫註冊碼按鈕按下
              //獲取輸入名
              GetDlgItemText(hDlg, MAIN_NAME2, szName, 55);
               namebf:=szName;
              if (length(namebf)>0) and  (length(namebf)<54) then
               begin
                 //計算註冊碼
                 Calculatebf(szName);
                 namebf:=szName;
                 snbf:=szCode;
                 Reg_Nag:=2;    //計算註冊碼邊鋒標誌
                 if szName<>szNamebak  then
                 //寫登錄檔
                  RegCreate(namebf,snbf,Reg_Nag);
               end;
            end;
////////////////////////////////////////
//原來模板的是這樣的:
//          MAIN_DO:
//            begin
//              //產生註冊碼按鈕按下
//              //獲取輸入名
//              GetDlgItemText(hDlg, MAIN_NAME, szName, 255);
//             //計算註冊碼子程式
//              Calculate(szName);
//              //顯示註冊碼
//              SetDlgItemText(hDlg, MAIN_CODE, szCode);
 //           end;
 ///////////////////////////////////////                    
             
          MAIN_about :
            begin
              //顯示關於對話方塊
              略....
            end;
          MAIN_EXIT:
            EndDialog(hDlg, 0);
          MAIN_CLOSE:
            EndDialog(hDlg, 0);

        end;
///////////
//重點新增//
//  下面  //
///////////        
                        
        
        case Loword(wParam) of    //我們的斷點在這裡,哈哈,不容易啊!
          MAIN_NAME1:      //我新增的宣告的ID(常量)選項,以下同
            begin
              //獲取聯眾輸入名框內動作
              GetDlgItemText(hDlg, MAIN_NAME1, szName, 55);
              namelz:=szName;
              if (length(namelz)>0) and  (length(namelz)<54) then  //設定上限,防止爆機!
              begin
              if szName<>szNamebak then  
      //你看you_known[FCG]的天才構思,設定szName,szCode為陣列變數為我們提供了巨大方便!!
      //這樣我們實現實時註冊碼顯示,簡直幾乎易如反掌!
      //不只這一個地方!我不得不佩服他的才能,不愧是FCG第一程式設計高手!
                begin
                 //計算
                 Calculatelz(szName);
                 //顯示註冊碼
                 SetDlgItemText(hDlg, MAIN_CODE1, szCode);
                end;
              end
              //提示資訊
              else  SetDlgItemText(hDlg, MAIN_CODE1, '請在上面輸入聯眾使用者ID,小於55位!');
            end;
          MAIN_NAME2:
            begin
              //獲取邊鋒輸入名框內動作
              GetDlgItemText(hDlg, MAIN_NAME2, szName, 55);
               namebf:=szName;
              if (length(namebf)>0) and  (length(namebf)<54) then
              begin
               if szName<>szNamebak then
                begin
                 //計算
                 Calculatebf(szName);
                 //顯示註冊碼
                 SetDlgItemText(hDlg, MAIN_CODE2, szCode);
                end;
             end
            //提示資訊
             else  SetDlgItemText(hDlg, MAIN_CODE2, '請在上面輸入邊鋒使用者ID,小於55位!');
            end;
          MAIN_link:       //連結的EDIT框的ID
            S_link :=  szLink;   //點選哪裡,就賦值對應網址!
          MAIN_By:
            S_link :=  szBy;
          MAIN_Cracker:
            S_link := szCrackeremail;
///////////
// 上面   //
//重點新增//
///////////            
         end;
         Result := 0;
      end;
    WM_DRAWITEM:
      begin
        略....
      end;
    ///////////////////////////////////////////////////
    //響應繪製窗體內容訊息
    略....

    else
      Result := 0;
  end;
end;

//////////////////////////////////////////////////////////////////
//協議對話方塊過程函式

 略......


//////////////////////////////////////////////////////////////////
//程式入口函式
begin
  略....
  //顯示協議對話方塊
  DialogBox(h_Inst, LPCTSTR(IDD_LICENSEDLG), 0, @LicenseProc);
  if (flAgree) then  //如果使用者同意協議則顯示主對話方塊
    DialogBox(h_Inst, LPCTSTR(IDD_MAINDLG), 0, @MainProc); // 主程式
  略....
  //退出程式
  ExitProcess(0);
end.    
                        
--------------------------------------------------------------------------------
【* * 總結】
   感謝you_known[FCG]提供了這麼好的一個程式模板,讓我們受益匪淺。
   你看you_known[FCG]的天才構思,設定szName,szCode為陣列變數為我們提供了巨大方便!!這樣我們實現實時註冊碼顯示,簡直幾乎易如反掌!還有超連結過程函式,堪稱巧妙的構思,至於我不得不隱去的那些函式更是妙不可言,不只這一個地方!我不得不佩服他的才能,不愧是FCG第一程式設計高手!
   如果你理解了我上面的,再加上你對API程式設計的瞭解,你已經可以自己編一個簡單的實時顯示註冊碼的序號產生器!只是介面原始一些罷了。如果不是寫入登錄檔,而是寫在其他地方,或者是keyfile,你都可以如法炮製自己新增。你還能移植到MASM,VC等上,其實ASM程式碼已經在delphi裡可以看到,只是我不會程式設計,如果你完成了或者有好的想法,給我寄一份(lao-qian@163.com)。
   起初是看到國外的一些序號產生器可以輸入使用者名稱同時,可實時顯示註冊碼,覺得很酷,就想知道他是怎樣實現的,但大都是ASM的原始碼,功力太淺看不懂,因此這次鑽研了一番,主要得益於you_known[FCG]的無私奉獻。
   
   完工之後,還有一些體會或許對大家有益:這些對於破解也有新的思路,比如有些軟體註冊是在你輸入使用者名稱同時,實時計算註冊碼,並對比結果,他的原理應該大同小異,一般都會呼叫window訊息函式WM_COMMAND,那我們找斷點豈不是可以在這裡呢?而對於編制CRackme或軟體註冊是否就更有用處呢?你可以改造一番試試。
   
【* * 閒話】  
   我玩Crack也3年了,起初只是在看雪論壇看看,今天看看,自己居然也在裡面有了那麼8、9篇文章入選了精華,也認識了不少朋友,最重要是學到了不少東西。由於日後工作將繁忙,又最近特別是渴望買車,更是抓緊掙錢,對Crack漸漸會接觸的少了,只是偶爾有朋友要求幫忙才破幾個小東東。這很可能是我最後一篇破文了,也是我給FCG和大家的禮物,當然我還會關注Crack,因為我們熱愛Free!
   有時,我也特別想加入CCG,BCG等,除了功力、時間不夠,還有就是覺得:FCG雖然組織鬆散,“家”也居無定所,但Free!因為熱愛Free的人,好像都很友善樂於助人!^_^,因此在FCG裡很快樂,希望它的宗旨繼續發揚光大!
   不過,如果CCG,BCG的老大們看了這篇文章,能破格批准我加入,我也會很欣然的,哈哈,...
   最後,感謝看雪為我們提供這個地方,我以有此同濟師弟為榮!!!

btw:只是那些框框顏色不好,不知道怎樣改。還有序號產生器在XP裡的顯示有些小問題無法解決。
     看來只有請you_known解決了。
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝! 

                            \\\|///
                           \\ - - //
                           (  @ @  )
 +-----------------------o00o-(_)-o00o--------------------+
 |                                                        |
 |        獻給我喜歡遊戲的海,我相信海永遠是藍的           |
 |                       laoqian[FCG]                     |
 +--------------------------------0ooo--------------------+
                           ooo0  (   )
                          (   )   ) /
                           \ (   (_/
                            \_)   

相關文章