加密精靈 (EncryptGenie) 2.61
加密精靈序號產生器演算法分析:
請各位大俠多多指點!謝謝!
軟體:加密精靈加密精靈
(EncryptGenie) 2.61 版
工具:trw1.22娃娃修正版,VC++6.0,fi2.5。
軟體簡介:
加密精靈 (EncryptGenie)
2.61 版是一個功能強大非常方便和
容易使用的加密檔案和郵件的軟體,
安裝後的軟體為未註冊版本,有兩個功能限制:
1. 未註冊版最多隻可以輸入10個字元長的密碼。註冊版最多可以輸入128個字元長的密碼。
2. 未註冊版軟體不能儲存編輯的加密規則。
首先用fi檢視有無殼,結果無殼,並且是用VC++6.0編寫的。
執行加密精靈,彈出註冊對話方塊,輸入姓名:crackerboy
註冊碼:7878787878
執行trw1.22
Ctrl+N撥出trw
下斷點bpx
hmemcpy
bc *
pmodule
來到下面的程式碼:
:004018C1
6A1E push
0000001E
:004018C3 68E84E4400 push
00444EE8
:004018C8 6815040000 push
00000415
:004018CD 53
push ebx
:004018CE FFD6
call esi/*得到註冊名*/
:004018D0 50
push eax
:004018D1
FFD7 call
edi/*得到註冊碼*/
:004018D3 6A02
push 00000002
:004018D5 6A00
push 00000000
:004018D7 E844CE0100
call 0041E720
:004018DC 6A00
push 00000000
:004018DE
68E84E4400 push 00444EE8
:004018E3
68EC594400 push 004459EC
*
Reference To: Rule.CheckRegister, Ord:0000h
|
:004018E8
E82B060300 Call 00431F18/*檢查註冊碼*/
:004018ED
83C414 add esp,
00000014
:004018F0 F7D8
neg eax
:004018F2 1BC0
sbb eax, eax
Rule.CheckRegister顧名思義是檢查註冊,這是關鍵call,按F8跟進去。
004734B0
> 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
004734B4 83EC 28
SUB ESP,28
004734B7 85C0
TEST EAX,EAX
004734B9 57
PUSH EDI
004734BA 74 5A JE
SHORT RULE.00473516
004734BC 8B7C24 34 MOV
EDI,DWORD PTR SS:[ESP+34]
004734C0 85FF
TEST EDI,EDI
004734C2 74 52
JE SHORT RULE.00473516
004734C4 8D4C24 04
LEA ECX,DWORD PTR SS:[ESP+4]
004734C8 51
PUSH ECX
004734C9 50
PUSH EAX
004734CA E8 51000000
CALL RULE.CreateRegisterSerial/*產生註冊碼*/
004734CF 83C4 08
ADD ESP,8
004734D2 85C0
TEST EAX,EAX
004734D4 74 40
JE SHORT RULE.00473516
004734D6 53
PUSH EBX
004734D7 56
PUSH ESI
004734D8 8D7424 0C
LEA ESI,DWORD PTR SS:[ESP+C]
004734DC 8BC7
MOV EAX,EDI
004734DE 8A10
MOV DL,BYTE PTR DS:[EAX]
004734E0
8A1E MOV BL,BYTE PTR DS:[ESI]
004734E2
8ACA MOV CL,DL
004734E4
3AD3 CMP DL,BL
004734E6 75
1E JNZ SHORT RULE.00473506
004734E8
84C9 TEST CL,CL
004734EA
74 16 JE SHORT RULE.00473502
004734EC
8A50 01 MOV DL,BYTE PTR DS:[EAX+1]
004734EF
8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
004734F2
8ACA MOV CL,DL
004734F4
3AD3 CMP DL,BL
004734F6 75
0E JNZ SHORT RULE.00473506
004734F8
83C0 02 ADD EAX,2
004734FB
83C6 02 ADD ESI,2
004734FE 84C9
TEST CL,CL
00473500 ^75 DC
JNZ SHORT RULE.004734DE
00473502 33C0
XOR EAX,EAX
00473504 EB 05
JMP SHORT RULE.0047350B
00473506
1BC0 SBB EAX,EAX
00473508
83D8 FF SBB EAX,-1
0047350B 5E
POP ESI
0047350C 5B
POP EBX
0047350D 85C0
TEST EAX,EAX
0047350F 75 05
JNZ SHORT RULE.00473516
00473511 5F
POP EDI
00473512 83C4
28 ADD ESP,28
00473515 C3
RETN
00473516 B8 01000000
MOV EAX,1
0047351B 5F
POP EDI
0047351C 83C4 28 ADD
ESP,28
0047351F C3
RETN
走到004734CA 時按F8跟進去,它是產生註冊碼的子程式。
按F8後就來到這裡:
00473520
> 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00473524
83EC 2C SUB ESP,2C
00473527
85D2 TEST EDX,EDX
00473529
57 PUSH EDI
0047352A
0F84 B6000000 JE RULE.004735E6
00473530 8B4424 38
MOV EAX,DWORD PTR SS:[ESP+38]
00473534 85C0
TEST EAX,EAX
00473536 0F84 AA000000
JE RULE.004735E6
0047353C 8BFA
MOV EDI,EDX
0047353E 83C9 FF
OR ECX,FFFFFFFF
00473541 33C0
XOR EAX,EAX
00473543 F2:AE
REPNE SCAS BYTE PTR ES:[EDI]
00473545 F7D1
NOT ECX
00473547 49
DEC ECX /*得到使用者名稱長度*/
00473548 83F9
03 CMP ECX,3
0047354B 0F8C 95000000
JL RULE.004735E6/*小於3則跳走*/
00473551 53
PUSH EBX
00473552 55
PUSH EBP
00473553 56
PUSH ESI
00473554 B3 41
MOV BL,41
/*
00473556 885C04 14
MOV BYTE PTR SS:[ESP+EAX+14],BL /*
0047355A FEC3
INC BL
/*
0047355C 40
INC EAX
0047355D 83F8 1A
CMP EAX,1A
/*
00473560 ^75 F4
JNZ SHORT RULE.00473556 /*
這裡產生密碼錶:從A到Z
00473562
B3 30 MOV BL,30
/*
00473564
885C04 14 MOV BYTE PTR SS:[ESP+EAX+14],BL /*
00473568
FEC3 INC BL
/*
0047356A
40 INC EAX
/*
0047356B
83F8 25 CMP EAX,25
/*
0047356E ^75
F4 JNZ SHORT RULE.00473564
/*
產生0到9
00473570
33ED XOR EBP,EBP/*清ebp*/
00473572
33C0 XOR EAX,EAX/*清eax*/
00473574
85C9 TEST ECX,ECX
00473576
896C24 10 MOV DWORD PTR SS:[ESP+10],EBP
0047357A
7E 10 JLE SHORT RULE.0047358C/*長度小於零則跳走*/
0047357C
33DB XOR EBX,EBX/*ebx清零*/
0047357E
8A1C10 MOV BL,BYTE PTR DS:[EAX+EDX]/*把註冊碼的第一個字元送給Bl*/
00473581
03EB ADD EBP,EBX/*
00473583
40 INC EAX/*
00473584
3BC1 CMP EAX,ECX/*
00473586
^7C F4 JL SHORT RULE.0047357C/*
從47357c到473586是這樣的:它把註冊名的所有註冊名累加,並送入ebp儲存。
00473588
896C24 10 MOV DWORD PTR SS:[ESP+10],EBP
0047358C
33FF XOR EDI,EDI
0047358E
33DB XOR EBX,EBX
00473590
BE 08184800 MOV ESI,RULE.00481808
00473595
EB 08 JMP SHORT RULE.0047359F
00473597
8B6C24 10 MOV EBP,DWORD PTR SS:[ESP+10]
0047359B
8B5424 40 MOV EDX,DWORD PTR SS:[ESP+40]
0047359F
33C0 XOR EAX,EAX
004735A1
8A0417 MOV AL,BYTE PTR DS:[EDI+EDX]/*送註冊名的字元給al*/
004735A4
03C5 ADD EAX,EBP/*與所有註冊名的ascii值相加*/
004735A6
8B2E MOV EBP,DWORD PTR DS:[ESI]/*送常數陣列給esi*/
004735A8
03C1 ADD EAX,ECX
004735AA
03C5 ADD EAX,EBP
004735AC
3BF9 CMP EDI,ECX/*比較是否超過了註冊名長度*/
004735AE
7C 04 JL SHORT RULE.004735B4/*沒超過就跳*/
004735B0
33FF XOR EDI,EDI
004735B2
EB 01 JMP SHORT RULE.004735B5/*跳*/
004735B4
47 INC EDI/*指向下一個註冊名*/
004735B5
99 CDQ
004735B6
BD 24000000 MOV EBP,24
004735BB 83C6 04
ADD ESI,4
004735BE F7FD
IDIV EBP/*除以0x24即36*/
004735C0 8B6C24 44
MOV EBP,DWORD PTR SS:[ESP+44]
004735C4 43
INC EBX
004735C5 81FE 48184800
CMP ESI,RULE.00481848 /*是否超過了常數陣列*/
004735CB 8A4414 14 MOV AL,BYTE
PTR SS:[ESP+EDX+14]/*dl是除數,這樣就在密碼錶中定位了
註冊碼*/
004735CF 88442B FF
MOV BYTE PTR DS:[EBX+EBP-1],AL/*存註冊碼*/
004735D3 ^7C
C2 JL SHORT RULE.00473597/*沒超過就繼續*/
004735D5
C6042B 00 MOV BYTE PTR DS:[EBX+EBP],0
004735D9
5E POP ESI
004735DA
5D POP EBP
004735DB
5B POP EBX
004735DC
B8 01000000 MOV EAX,1
004735E1 5F
POP EDI
004735E2 83C4 2C
ADD ESP,2C
004735E5 C3
RETN
註冊碼的長度等於常數陣列的長度,也是16位。
序號產生器的VC源程式如下(關鍵部分):
void
CPatch0Dlg::OnOK()
{ UpdateData();
int length=m_hstr0.GetLength();
m_hcode="";
//
TODO: Add extra validation here
GetDlgItem(IDC_EDIT1)->SetFocus();
char password[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//密碼錶
int count[]={0x16,0x1e,0x13,0x0c,0x09,0x04,0x19,0x1a,0x24,0x20,0x13,0x07,0x36,0x0e,0x32,0x3c};//常數陣列
int name1[17],flag0=0,flag1=1,flag2=0,countnum=0,i,j,k=0,l=0;
if((length<0)||(length<4))
{MessageBox("輸入名字不能是空或者名字少於4個字元!!",0,MB_OK);
flag2=1;
}
else
{for(i=0;i<length;i++)
{name1[i]=(int)m_hstr0[i];
flag1=isupper(m_hstr0[i])|isdigit(m_hstr0[i])|islower(m_hstr0[i]);
if(!flag1)
{flag0=1;
flag2=1;
};
}
if(flag0)
MessageBox("你輸入的字元有非ASCII字元,請重新輸入!!",0,MB_OK);
else if(!flag2)
{ for(i=length;i<17;i++)
name1[i]=0;
for(i=0;i<length;i++)
countnum+=name1[i];
i=0;
CString temp;
m_hcode+=temp;
for(j=0;j<16;j++)
{if(k>length)//k是當前的註冊名長度
k=0;
i=countnum+length+name1[k++]+count[j];
l=i%0x24;
temp.format("%c",password[l]);//定位註冊碼
m_hcode+=temp;
i=0;
}
GetDlgItem(IDC_EDIT2)->SetWindowText(m_hcode);
}
}
if(flag2)
{GetDlgItem(IDC_EDIT2)->SetWindowText("");
GetDlgItem(IDC_EDIT1)->SetWindowText("");
}
//CDialog::OnOK();
}
相關文章
- 申請加入BCG破文3--加密精靈EncryptGenie22註冊碼破解及序號產生器制作 (5千字)2001-10-28加密
- 加密精靈V2.2破解過程 (9千字)2001-10-28加密
- SF精靈 for Chrome2014-07-21Chrome
- 《幻想精靈》精靈系統及圖鑑技能說明攻略2017-01-03
- SpriteSheet精靈動畫引擎2014-02-26動畫
- SpriteAtlas精靈圖集2024-04-18
- sicp每日一題[2.61]2024-10-29每日一題
- CSS精靈圖技術2018-11-25CSS
- 按鍵精靈 使用教程2017-07-06
- 驅動精靈是幹嘛的 驅動精靈怎麼安裝驅動2021-06-07
- 自動精靈 2.00 破解教程2004-12-17
- UNIX中的精靈程式 (轉)2007-12-29
- 可愛精靈在球裡養著玩?《精靈之境》IOS預約開啟!2021-08-25iOS
- 學習 PixiJS — 動畫精靈2019-01-14JS動畫
- CSS基礎定位與精靈圖2017-12-04CSS
- 360健康精靈工具怎麼用?詳解360健康精靈在電腦中使用的方法2019-03-29
- 學習 PixiJS — 精靈狀態2019-01-19JS
- pixi的使用之建立和操作精靈2018-10-31
- jQuery實現圖示特效(精靈圖)2020-10-20jQuery特效
- Niantic:《精靈寶可夢GO》僅完成10%2016-10-12Go
- 英語會話精靈 V2.02015-11-15會話
- 英語會話精靈V1.02015-11-15會話
- 惠普暗影精靈6遊戲本震撼首發2020-07-10遊戲
- 學習 PixiJS — 小精靈冒險2019-03-11JS
- 按鍵精靈——指令碼流程結構(3)2020-12-17指令碼
- 精靈筆記-第二章:慘叫2017-09-22筆記
- 《精靈寶可夢 GO》:機遇大於挑戰2016-08-10Go
- 解除安裝精靈 V4.1 破解教程2004-12-18
- win10如何強制解除安裝驅動精靈_win10解除安裝驅動精靈的方法2019-12-17Win10
- 惠普光影精靈4代綠刃144Hz螢幕評測 光影精靈4綠刃值得買嗎?2018-06-05
- win10系統如何使用一鍵刷機精靈_win10使用一鍵刷機精靈的步驟2020-07-02Win10
- 精靈小巧的 Jsonpath 萬精油:Snack32020-08-11JSON
- Python 精靈模組_迷宮房間類遊戲2019-12-31Python遊戲
- 天貓精靈的自定義語音技能建立流程2022-05-12
- Cocos2dx中精靈(CCSprite)、動畫建立2018-06-25動畫
- mac系統怎麼安裝驅動精靈2016-10-15Mac
- 按鍵精靈指令碼筆記:基本語法2017-10-22指令碼筆記
- quick-cocos2d-x :加入精靈背景2014-07-23UI