Instant Source 註冊演算法分析+註冊器原始碼
標 題:IrfanView
發信人:東南破佛
時 間:2003年9月23日 02:57
詳細資訊:
Instant Source是一個IE外掛,可以直接看到網頁中的原始碼和Script。
網上能找到現成的註冊器,不過破解前我沒去搜尋 @_@
這個軟體沒加殼,沒暗樁,明碼比較註冊碼,非常適合剛入門的cracker來練練手,作者真是大善人啊。
我在論壇上搜尋了一下,似乎還沒有人寫過這個軟體的破解,可能覺得太簡單了,而不屑一寫吧。
本著回饋論壇,提攜菜鳥,我不入地獄,誰入地獄的大無畏精神,特寫此手記。
Instant Source沒有可執行檔案,只有一個isrc.Dll,所以可以用OllyDbg非常強大的Attach功能來跟蹤。
進入IE後,開啟Instant source的註冊視窗,隨便輸些東東,記住彈出的對話方塊說些什麼:
"Registration code or user name is invalid. Please check all fields and try again!"
當然不用記這麼多,記一些比較有代表的短語就夠了。
開啟OllyDbg, Attach IE, View->Executable modules(Alt-E), 找到isrc.dll,進入其領空,
在彈出選單中選Search for->All referenced text string, 查詢剛才對話方塊的內容,
找到其判斷註冊碼的地方:
0258AA7F |. 52 PUSH EDX ; /String2
0258AA80 |. 50 PUSH EAX ; |String1
0258AA81 |. FF15 64515902 CALL NEAR DWORD PTR DS:[<&KERNEL32.lstrcpyA>] ; lstrcpyA
0258AA87 |. 8B3D 5C515902 MOV EDI, DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; KERNEL32.lstrcatA
0258AA8D |. 8D4C24 2C LEA ECX, DWORD PTR SS:[ESP+2C]
0258AA91 |. 8D5424 38 LEA EDX, DWORD PTR SS:[ESP+38]
0258AA95 |. 51 PUSH ECX ; /StringToAdd
0258AA96 |. 52 PUSH EDX ; |ConcatString
0258AA97 |. FFD7 CALL NEAR EDI ; lstrcat
0258AA99 |. 8D4424 20 LEA EAX, DWORD PTR SS:[ESP+20]
0258AA9D |. 8D4C24 38 LEA ECX, DWORD PTR SS:[ESP+38]
0258AAA1 |. 50 PUSH EAX ; /StringToAdd
0258AAA2 |. 51 PUSH ECX ; |ConcatString
0258AAA3 |. FFD7 CALL NEAR EDI ; lstrcat
0258AAA5 |. 8D5424 08 LEA EDX, DWORD PTR SS:[ESP+8]
0258AAA9 |. 8D4424 38 LEA EAX, DWORD PTR SS:[ESP+38]
0258AAAD |. 52 PUSH EDX ; /StringToAdd
0258AAAE |. 50 PUSH EAX ; |ConcatString
0258AAAF |. FFD7 CALL NEAR EDI ; lstrcat
0258AAB1 |. 8D8C24 A00000>LEA ECX, DWORD PTR SS:[ESP+A0]
0258AAB8 |. 8D5424 6C LEA EDX, DWORD PTR SS:[ESP+6C]
0258AABC |. 51 PUSH ECX
0258AABD |. 68 805D5902 PUSH isrc.02595D80 ; ASCII "2I$q1[05)&Ew*_p["
0258AAC2 |. 52 PUSH EDX ; name
0258AAC3 |. E8 E8FDFFFF CALL isrc.0258A8B0 ; ***** 根據name算註冊碼 *****
0258AAC8 |. 83C4 0C ADD ESP, 0C
0258AACB |. 8D4424 38 LEA EAX, DWORD PTR SS:[ESP+38]
0258AACF |. 8D8C24 A00000>LEA ECX, DWORD PTR SS:[ESP+A0]
0258AAD6 |. 50 PUSH EAX ; /input sn
0258AAD7 |. 51 PUSH ECX ; |real sn
0258AAD8 |. FF15 84515902 CALL NEAR DWORD PTR DS:[<&KERNEL32.lstrcmpiA>] ; lstrcmpiA
0258AADE |. 85C0 TEST EAX, EAX
0258AAE0 |. 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0258AAE2 |. 75 31 JNZ SHORT isrc.0258AB15 ; |
0258AAE4 |. 68 A4A85902 PUSH isrc.0259A8A4 ; |Title = "Registration"
0258AAE9 |. 68 64A85902 PUSH isrc.0259A864 ; |Text = "Registration succeeded. Thank you for choosing Instant Source!"
0258AAEE |. 56 PUSH ESI ; |hOwner
0258AAEF |. FF15 88535902 CALL NEAR DWORD PTR DS:[<&USER32.MessageBoxA>] ; MessageBoxA
0258AAF5 |. 8D5424 38 LEA EDX, DWORD PTR SS:[ESP+38]
0258AAF9 |. 8D4424 6C LEA EAX, DWORD PTR SS:[ESP+6C]
0258AAFD |. 52 PUSH EDX
0258AAFE |. 50 PUSH EAX
0258AAFF |. E8 8CFEFFFF CALL isrc.0258A990
0258AB04 |. 83C4 08 ADD ESP, 8
0258AB07 |. B8 01000000 MOV EAX, 1
0258AB0C |. 5F POP EDI
0258AB0D |. 5E POP ESI
0258AB0E |. 81C4 CC000000 ADD ESP, 0CC
0258AB14 |. C3 RETN
0258AB15 |> 68 50A85902 PUSH isrc.0259A850 ; |Title = "Registration error"
0258AB1A |. 68 FCA75902 PUSH isrc.0259A7FC ; |Text = "Registration code or user name is invalid. Please check all fields and try again!"
0258AB1F |. 56 PUSH ESI ; |hOwner
0258AB20 |. FF15 88535902 CALL NEAR DWORD PTR DS:[<&USER32.MessageBoxA>] ; MessageBoxA
0258AB26 |. 68 2C010000 PUSH 12C ; /Timeout = 300. ms
0258AB2B |. FF15 58515902 CALL NEAR DWORD PTR DS:[<&KERNEL32.Sleep>] ; Sleep
0258AB31 |. 5F POP EDI
0258AB32 |. 33C0 XOR EAX, EAX
0258AB34 |. 5E POP ESI
0258AB35 |. 81C4 CC000000 ADD ESP, 0CC
0258AB3B . C3 RETN
0258AB3C 90 NOP
可以看到程式先把輸入的4段註冊碼合併起來,然後在0258AAC3處的Call 0258A8B0是關鍵,它會根據name算出註冊碼,接著用真的註冊碼與輸入的註冊碼相比較。
看看0258A8B0:
0258A8B0 /$ 53 PUSH EBX
0258A8B1 |. 8B5C24 0C MOV EBX, DWORD PTR SS:[ESP+C]
0258A8B5 |. 55 PUSH EBP
0258A8B6 |. 56 PUSH ESI
0258A8B7 |. 57 PUSH EDI
0258A8B8 |. 8B3D 28515902 MOV EDI, DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; KERNEL32.lstrlenA
0258A8BE |. 53 PUSH EBX ; /"2I$q1[05)&Ew*_p["
0258A8BF |. FFD7 CALL NEAR EDI ; lstrlen
0258A8C1 |. 8BF0 MOV ESI, EAX
0258A8C3 |. 8B4424 14 MOV EAX, DWORD PTR SS:[ESP+14]
0258A8C7 |. 50 PUSH EAX ; /name
0258A8C8 |. 897424 1C MOV DWORD PTR SS:[ESP+1C], ESI ; |
0258A8CC |. FFD7 CALL NEAR EDI ; lstrlenA
0258A8CE |. 8BE8 MOV EBP, EAX
0258A8D0 |. 85ED TEST EBP, EBP
0258A8D2 |. 75 0C JNZ SHORT isrc.0258A8E0
0258A8D4 |. 8B4424 1C MOV EAX, DWORD PTR SS:[ESP+1C]
0258A8D8 |. 5F POP EDI
0258A8D9 |. 5E POP ESI
0258A8DA |. 5D POP EBP
0258A8DB |. C600 00 MOV BYTE PTR DS:[EAX], 0
0258A8DE |. 5B POP EBX
0258A8DF |. C3 RETN
0258A8E0 |> 8B7C24 1C MOV EDI, DWORD PTR SS:[ESP+1C]
0258A8E4 |. 53 PUSH EBX ; /"2I$q1[05)&Ew*_p["
0258A8E5 |. 57 PUSH EDI ; |String1
0258A8E6 |. FF15 64515902 CALL NEAR DWORD PTR DS:[<&KERNEL32.lstrcpyA>] ; lstrcpyA
0258A8EC |. 3BEE CMP EBP, ESI
0258A8EE |. 8BC5 MOV EAX, EBP
0258A8F0 |. 7F 02 JG SHORT isrc.0258A8F4
0258A8F2 |. 8BC6 MOV EAX, ESI
0258A8F4 |> 33C9 XOR ECX, ECX
0258A8F6 |. 894424 1C MOV DWORD PTR SS:[ESP+1C], EAX
0258A8FA |. 85C0 TEST EAX, EAX
0258A8FC |. 7E 39 JLE SHORT isrc.0258A937
0258A8FE |. EB 04 JMP SHORT isrc.0258A904
0258A900 |> 8B7424 18 /MOV ESI, DWORD PTR SS:[ESP+18]
0258A904 |> 8BC1 MOV EAX, ECX
0258A906 |. 8B5C24 14 |MOV EBX, DWORD PTR SS:[ESP+14]
0258A90A |. 99 |CDQ
0258A90B |. F7FE |IDIV ESI
0258A90D |. 8BC1 |MOV EAX, ECX
0258A90F |. 8BF2 |MOV ESI, EDX
0258A911 |. 99 |CDQ
0258A912 |. F7FD |IDIV EBP
0258A914 |. 33C0 |XOR EAX, EAX
0258A916 |. 8A041A |MOV AL, BYTE PTR DS:[EDX+EBX] ; al=name[edx]
0258A919 |. 33D2 |XOR EDX, EDX
0258A91B |. 8A143E |MOV DL, BYTE PTR DS:[ESI+EDI] ; dl=table[esi] table="2I$q1[05)&Ew*_p["
0258A91E |. BB 19000000 |MOV EBX, 19
0258A923 |. 33C2 |XOR EAX, EDX ; 兩數異或
0258A925 |. 99 |CDQ
0258A926 |. F7FB |IDIV EBX ; 除以19
0258A928 |. 8B4424 1C |MOV EAX, DWORD PTR SS:[ESP+1C]
0258A92C |. 80C2 41 |ADD DL, 41 ; +41
0258A92F |. 41 |INC ECX
0258A930 |. 3BC8 |CMP ECX, EAX
0258A932 |. 88143E |MOV BYTE PTR DS:[ESI+EDI], DL
0258A935 |.^ 7C C9 JL SHORT isrc.0258A900
0258A937 |> 8BC7 MOV EAX, EDI
0258A939 |. 5F POP EDI
0258A93A |. 5E POP ESI
0258A93B |. 5D POP EBP
0258A93C |. 5B POP EBX
0258A93D . C3 RETN
如果輸入的name長度大於16,就取前16位,如果小於16,就迴圈取name。
用name裡每個字元與碼錶"2I$q1[05)&Ew*_p[" 異或,再用0x19(英文字母的數量)取模,再加上0x41(變成大寫字母)。真是超級簡單。
附上註冊器原始碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char *argv[])
{
unsigned char name[255];
unsigned char sn[17];
unsigned char table[] = "2I$q1[05)&Ew*_p[";
int i, len;
printf ("Instance Source V1.44 Keygen (written by noword [CCG])
"
"Name: ");
scanf ("%s", &name);
len = strlen (name);
for (i = 0; i < 16; i++)
{
sn[i] = (name[i%len] ^ table[i]) % 0x19 + 0x41;
}
sn[16]=' ';
printf ("sn: %s
", sn);
system ("PAUSE");
return 0;
}
相關文章
- nacos註冊中心原始碼流程分析2020-12-23原始碼
- @angular/router 原始碼分析之註冊路由2018-07-10Angular原始碼路由
- 財智老闆通3.04註冊版---註冊演算法分析2003-03-16演算法
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊2019-03-03原始碼
- supercleaner註冊演算法分析2015-11-15演算法
- 【Java】NIO中Channel的註冊原始碼分析2019-05-17Java原始碼
- Netty原始碼分析--Channel註冊(上)(五)2019-07-02Netty原始碼
- Netty原始碼分析--Channel註冊(中)(六)2019-07-02Netty原始碼
- Nacos(一)原始碼分析Nacos註冊示例流程2020-12-26原始碼
- containerd 原始碼分析:啟動註冊流程2024-05-21AI原始碼
- SpeedFlash註冊演算法分析(VB)2015-11-15演算法
- ffmpeg分析系列之一(註冊該註冊的)2010-11-04
- Theme Builder註冊碼分析2015-11-15UI
- ShadowDefender 註冊碼 分析2024-08-17
- 守財奴1.9註冊分析+序號產生器原始碼2015-11-15原始碼
- Emeditor 註冊碼2017-08-14
- WebStorm註冊碼2014-04-29WebORM
- 進位專家註冊演算法分析及序號產生器C原始碼2004-08-19演算法原始碼
- 【原始碼分析】XXL-JOB的執行器的註冊流程2023-04-22原始碼
- JNI原始碼分析(並實現JNI動態註冊)2017-09-26原始碼
- LanSee 註冊演算法2015-11-15演算法
- Screen Demo Maker 3.0 註冊演算法分析2003-07-15演算法
- <<Anti-Hack>> 2.0註冊演算法分析2003-06-06演算法
- Personal Antispy 1.14 註冊演算法分析2015-11-15演算法
- 冰盾濾鏡註冊演算法分析2015-11-15演算法
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(三)之下線2019-02-19原始碼
- PhpStorm註冊碼2020-04-07PHPORM
- Navicat for MySQL註冊碼2020-04-07MySql
- SecureCRT 7 註冊碼2016-09-02Securecrt
- 今天好多人 phpstrom 編譯器註冊碼失效了,最新可用註冊碼2019-12-24PHP編譯
- Netty原始碼分析--Channel註冊&繫結埠(下)(七)2019-07-04Netty原始碼
- spring-IOC容器原始碼分析(二)BeanDefinition註冊流程2018-11-19Spring原始碼Bean
- Nacos(二)原始碼分析Nacos服務端註冊示例流程2021-01-18原始碼服務端
- 公務員之路3.0註冊分析2015-11-15
- 動態註冊和靜態註冊2018-05-21
- 靜態註冊和動態註冊2013-11-27
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(五)之過期2018-05-25原始碼
- 註冊碼演算法 (2千字)2001-01-14演算法