Advanced Emailer 2.1 簡單演算法分析+序號產生器原始碼(tc2)

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

Advanced Emailer 2.1 簡單註冊演算法分析+序號產生器原始碼(tc2)

破解目標:Advanced Emailer 2.1
官方主頁:http://www.emailarms.com/
軟體簡介:好像是發垃圾郵件的工具
下載地址:http://www.emailarms.com/downloads/zip/mailer.zip

使用工具:PEiD 0.8、Ollydbg

作者:炎之川[BCG]
時間:2003.5.11
主頁:http://skipli.yeah.net/

========================================================================
宣告: 本文純屬技術交流,無其他任何目的,轉載請註明作者並保持文章的完整。
========================================================================

印象中,論壇上曾經有朋友問過這軟體(或者是同一軟體公司的其他某個軟體),順便看看……

經過 PEiD 檢查,主程式沒加殼,Delphi 寫的。用 OD 裝入程式,中間可能會有幾次異常,按 Shift+F9 跳過。輸入假碼:01234567890123 (14位):
(; 後是 Ollydbg 所分析的內容,// 後是我加的註釋,文中數值均為十六進位制值)

00508920  /$ 55             PUSH EBP   //斷點
00508921  |. 8BEC           MOV EBP,ESP
00508923  |. B9 05000000    MOV ECX,5
00508928  |> 6A 00          /PUSH 0
0050892A  |. 6A 00          |PUSH 0
0050892C  |. 49             |DEC ECX
0050892D  |.^75 F9          \JNZ SHORT mailer.00508928
0050892F  |. 51             PUSH ECX
00508930  |. 53             PUSH EBX
00508931  |. 56             PUSH ESI
00508932  |. 8BF0           MOV ESI,EAX
00508934  |. 33C0           XOR EAX,EAX
00508936  |. 55             PUSH EBP
00508937  |. 68 A18A5000    PUSH mailer.00508AA1
0050893C  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0050893F  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00508942  |. 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
00508945  |. 8B86 3C030000  MOV EAX,DWORD PTR DS:[ESI+33C]
0050894B  |. E8 448FF4FF    CALL mailer.00451894
00508950  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]   //取假碼
00508953  |. 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
00508956  |. E8 5D79FCFF    CALL mailer.004D02B8
0050895B  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]
0050895E  |. B8 54725400    MOV EAX,mailer.00547254
00508963  |. E8 28C1EFFF    CALL mailer.00404A90
00508968  |. E8 93FDFFFF    CALL mailer.00508700   //關鍵call
0050896D  |. 8BD8           MOV EBX,EAX   //ebx=eax
0050896F  |. 84DB           TEST BL,BL   //bl=0?
00508971  |. 0F84 D8000000  JE mailer.00508A4F   //bl=0 就死啦
00508977  |. C686 5C030000 >MOV BYTE PTR DS:[ESI+35C],1
0050897E  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
00508981  |. 50             PUSH EAX
00508982  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
00508985  |. B8 B88A5000    MOV EAX,mailer.00508AB8                  ;  ASCII "B99E9DA78684BA9A97B78E"
0050898A  |. E8 A186FCFF    CALL mailer.004D1030
0050898F  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00508992  |. 50             PUSH EAX
00508993  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
00508996  |. B8 D88A5000    MOV EAX,mailer.00508AD8                  ;  ASCII "BE828B999A8C9F88B1A0848E9F829E828B99B1A9BFA0BFBEB5"
0050899B  |. E8 9086FCFF    CALL mailer.004D1030
005089A0  |. 8B55 EC        MOV EDX,DWORD PTR SS:[EBP-14]
005089A3  |. A1 5C725400    MOV EAX,DWORD PTR DS:[54725C]
005089A8  |. 59             POP ECX
005089A9  |. E8 CEF4FFFF    CALL mailer.00507E7C
005089AE  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
005089B1  |. A1 54725400    MOV EAX,DWORD PTR DS:[547254]
005089B6  |. E8 D985FCFF    CALL mailer.004D0F94
005089BB  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
005089BE  |. 50             PUSH EAX
005089BF  |. 8D55 E4        LEA EDX,DWORD PTR SS:[EBP-1C]
005089C2  |. B8 148B5000    MOV EAX,mailer.00508B14                  ;  ASCII "AC9E95BC9F9BA9819D8EAB95"
005089C7  |. E8 6486FCFF    CALL mailer.004D1030
005089CC  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
005089CF  |. 50             PUSH EAX
005089D0  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]
005089D3  |. B8 D88A5000    MOV EAX,mailer.00508AD8                  ;  ASCII "BE828B999A8C9F88B1A0848E9F829E828B99B1A9BFA0BFBEB5"
005089D8  |. E8 5386FCFF    CALL mailer.004D1030
005089DD  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
005089E0  |. A1 5C725400    MOV EAX,DWORD PTR DS:[54725C]
005089E5  |. 59             POP ECX
005089E6  |. E8 D1F5FFFF    CALL mailer.00507FBC
005089EB  |. 837D FC 00     CMP DWORD PTR SS:[EBP-4],0
005089EF  |. 75 44          JNZ SHORT mailer.00508A35
005089F1  |. E8 7E2DF0FF    CALL mailer.0040B774
005089F6  |. 83C4 F4        ADD ESP,-0C
005089F9  |. DB3C24         FSTP TBYTE PTR SS:[ESP]                  ; |
005089FC  |. 9B             WAIT                                     ; |
005089FD  |. 8D45 DC        LEA EAX,DWORD PTR SS:[EBP-24]            ; |
00508A00  |. E8 9F24F0FF    CALL mailer.0040AEA4                     ; \mailer.0040AEA4
00508A05  |. 8B45 DC        MOV EAX,DWORD PTR SS:[EBP-24]
00508A08  |. 50             PUSH EAX
00508A09  |. 8D55 D8        LEA EDX,DWORD PTR SS:[EBP-28]
00508A0C  |. B8 B88A5000    MOV EAX,mailer.00508AB8                  ;  ASCII "B99E9DA78684BA9A97B78E"
00508A11  |. E8 1A86FCFF    CALL mailer.004D1030
00508A16  |. 8B45 D8        MOV EAX,DWORD PTR SS:[EBP-28]
00508A19  |. 50             PUSH EAX
00508A1A  |. 8D55 D4        LEA EDX,DWORD PTR SS:[EBP-2C]
00508A1D  |. B8 D88A5000    MOV EAX,mailer.00508AD8                  ;  ASCII "BE828B999A8C9F88B1A0848E9F829E828B99B1A9BFA0BFBEB5"
00508A22  |. E8 0986FCFF    CALL mailer.004D1030
00508A27  |. 8B55 D4        MOV EDX,DWORD PTR SS:[EBP-2C]
00508A2A  |. A1 5C725400    MOV EAX,DWORD PTR DS:[54725C]
00508A2F  |. 59             POP ECX
00508A30  |. E8 87F5FFFF    CALL mailer.00507FBC
00508A35  |> 6A 40          PUSH 40
00508A37  |. B9 308B5000    MOV ECX,mailer.00508B30                  ;  ASCII "Information"
00508A3C  |. BA 3C8B5000    MOV EDX,mailer.00508B3C                  ;  ASCII "Registration has been completed successfully!"
00508A41  |. A1 AC595400    MOV EAX,DWORD PTR DS:[5459AC]
00508A46  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
00508A48  |. E8 B79DF6FF    CALL mailer.00472804
00508A4D  |. EB 22          JMP SHORT mailer.00508A71
00508A4F  |> B8 54725400    MOV EAX,mailer.00547254
00508A54  |. E8 E3BFEFFF    CALL mailer.00404A3C
00508A59  |. 6A 10          PUSH 10
00508A5B  |. B9 6C8B5000    MOV ECX,mailer.00508B6C                  ;  ASCII "Error"
00508A60  |. BA 748B5000    MOV EDX,mailer.00508B74                  ;  ASCII "Registration code is invalid!"
00508A65  |. A1 AC595400    MOV EAX,DWORD PTR DS:[5459AC]
00508A6A  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
00508A6C  |. E8 939DF6FF    CALL mailer.00472804
00508A71  |> 33C0           XOR EAX,EAX
00508A73  |. 5A             POP EDX
00508A74  |. 59             POP ECX
00508A75  |. 59             POP ECX
00508A76  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
00508A79  |. 68 A88A5000    PUSH mailer.00508AA8
00508A7E  |> 8D45 D4        LEA EAX,DWORD PTR SS:[EBP-2C]
00508A81  |. BA 08000000    MOV EDX,8
00508A86  |. E8 D5BFEFFF    CALL mailer.00404A60
00508A8B  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
00508A8E  |. E8 A9BFEFFF    CALL mailer.00404A3C
00508A93  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
00508A96  |. BA 02000000    MOV EDX,2
00508A9B  |. E8 C0BFEFFF    CALL mailer.00404A60
00508AA0  \. C3             RETN

------------------------------------------------------------------------
進入 00508700 的關鍵call:

00508700  /$ 53             PUSH EBX
00508701  |. 56             PUSH ESI
00508702  |. 57             PUSH EDI
00508703  |. BF 54725400    MOV EDI,mailer.00547254
00508708  |. 33F6           XOR ESI,ESI
0050870A  |. 33DB           XOR EBX,EBX
0050870C  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]   //取假碼
0050870E  |. E8 E1C5EFFF    CALL mailer.00404CF4   //假碼長度
00508713  |. 83F8 0E        CMP EAX,0E   //填入的註冊碼是否 14 位(0x0E = 14)
00508716  |. 75 67          JNZ SHORT mailer.0050877F   //不是就死
00508718  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]   //再取假碼
0050871A  |. 8038 38        CMP BYTE PTR DS:[EAX],38   //取第一個字元,比較ASCII值是否 38(即“8”)
0050871D  |. 0F94C0         SETE AL
00508720  |. 83E0 7F        AND EAX,7F   //如果這一位相同,則eax&7F=01
00508723  |. 03F0           ADD ESI,EAX   //eax的值加到esi,下同
00508725  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
00508727  |. 8078 02 36     CMP BYTE PTR DS:[EAX+2],36   //第1+2個字元是否為“6”
0050872B  |. 0F94C0         SETE AL
0050872E  |. 83E0 7F        AND EAX,7F
00508731  |. 03F0           ADD ESI,EAX
00508733  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
00508735  |. 8078 03 32     CMP BYTE PTR DS:[EAX+3],32   //第1+3個字元是否為“2”
00508739  |. 0F94C0         SETE AL
0050873C  |. 83E0 7F        AND EAX,7F
0050873F  |. 03F0           ADD ESI,EAX
00508741  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
00508743  |. 8078 04 37     CMP BYTE PTR DS:[EAX+4],37   //第1+4個字元是否為“7”
00508747  |. 0F94C0         SETE AL
0050874A  |. 83E0 7F        AND EAX,7F
0050874D  |. 03F0           ADD ESI,EAX
0050874F  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
00508751  |. 8078 07 39     CMP BYTE PTR DS:[EAX+7],39   //第1+7個字元是否為“9”
00508755  |. 0F94C0         SETE AL
00508758  |. 83E0 7F        AND EAX,7F
0050875B  |. 03F0           ADD ESI,EAX
0050875D  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
0050875F  |. 8078 08 34     CMP BYTE PTR DS:[EAX+8],34   //第1+8個字元是否為“4”
00508763  |. 0F94C0         SETE AL
00508766  |. 83E0 7F        AND EAX,7F
00508769  |. 03F0           ADD ESI,EAX
0050876B  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
0050876D  |. 8078 0A 30     CMP BYTE PTR DS:[EAX+A],30   //第1+0xA個字元是否為“0”
00508771  |. 0F94C0         SETE AL
00508774  |. 83E0 7F        AND EAX,7F
00508777  |. 03F0           ADD ESI,EAX   //eax的值加到esi
00508779  |. 83FE 07        CMP ESI,7   //esi是否等於7?由於上面一共比較7個字元,故此處eax必須為7才能註冊成功
0050877C  |. 0F94C3         SETE BL   //如果eax=7,則bl置1
0050877F  |> 8BC3           MOV EAX,EBX   //ebx的值放入eax
00508781  |. 5F             POP EDI
00508782  |. 5E             POP ESI
00508783  |. 5B             POP EBX
00508784  \. C3             RETN   //返回


演算法總結:
1、註冊碼長度必須為 14 位
2、註冊碼格式為:8-627--94-0---,“-”代表可以為任意字元(包括數字、字母、標點等)
3、在除錯過程中看到的一些奇怪的長字串,原以為是表什麼的,結果發現應該是沒有用處的

至此 Advanced Emailer 2.1 註冊演算法分析完成,隨便舉一個可用的註冊碼:80627009400000

註冊資訊儲存:
註冊成功後,軟體在登錄檔內新增以下鍵值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DRMRSX]
"AsxQrvDlpcFx"="D5C0DBDFDAC0C0D4D9C0DDC0C0C0"
"TspJkiWwzZc"="37752.8389992245"

爆破方法:
00508774  |. 83E0 7F        AND EAX,7F
00508777  |. 03F0           ADD ESI,EAX
00508779  |. 83FE 07        CMP ESI,7
改為:
00508774     BE 07000000    MOV ESI,7   //強制給esi賦值為7
00508779     83FE 07        CMP ESI,7

之後隨便輸入14位註冊碼即可註冊成功。發現檢查註冊碼長度的那個跳轉不能改,改了程式會出錯。


------------------------------------------------------------------------
序號產生器原始碼(TC 2.0)

順便寫一個最簡陋的序號產生器,tc 2.0 編譯透過。

註冊碼中可為任意字元的位使用隨機數填充,其實可以詢問是否要再次生成一個註冊碼,不過好像很麻煩,還要判斷鍵盤輸入的字元什麼的,還是算了吧,要生成更多的註冊碼就多執行幾次吧^^

#include "stdlib.h"

main()
{ int sn1,sn2,sn3;
   printf("\n    -= Advanced Emailer 2.1 keygen =-\n          code by lovefire[BCG]\n\n\n");
   randomize();
   /* 生成隨機數,下面是控制隨機數長度 */
   sn1=random(9);
   sn2=random(99);
   sn3=random(999);
   printf("regkey: 8%d627%d94%d0%d\n",sn1,sn2,sn1,sn3);
   printf("\n\nRun keygen again to get another regkey.\n\nhave fun^^\nwelcome to http://skipli.yeah.net/");
   getch();
}

------------------------------------------------------------------------

炎之川
屬於中國破解組織BCG (BeGiNnEr'S CrAcKiNg Group)

  _/_/_/   _/_/_/   _/_/_/
  _/  _/ _/     _/
 _/_/_/  _/     _/ _/_/
_/  _/ _/     _/  _/
_/_/_/   _/_/_/   _/_/_/

相關文章