標 題:UltraISO7me註冊方法分析
看雪資料發表於2004-04-25
本來想回復先前的帖子,卻始終沒法發貼,所以重新開了一個帖子。
感謝blowfish的指點,否則我還在暈頭轉向的在找什麼演算法。
這個程式用了RSA和MD5的演算法。具體分析如下:
程式碼:
.text:004017C0 sub_4017C0 proc near ; CODE XREF: WinMain+262p .text:004017C0 .text:004017C0 var_4B0 = dword ptr -4B0h .text:004017C0 s1 = dword ptr -458h .text:004017C0 buffer = byte ptr -448h .text:004017C0 var_344 = dword ptr -344h .text:004017C0 var_340 = byte ptr -340h .text:004017C0 var_33F = byte ptr -33Fh .text:004017C0 var_33E = byte ptr -33Eh .text:004017C0 var_33D = byte ptr -33Dh .text:004017C0 var_33A = byte ptr -33Ah .text:004017C0 var_339 = byte ptr -339h .text:004017C0 var_338 = byte ptr -338h .text:004017C0 var_337 = byte ptr -337h .text:004017C0 var_336 = byte ptr -336h .text:004017C0 var_335 = byte ptr -335h .text:004017C0 var_334 = byte ptr -334h .text:004017C0 var_130 = dword ptr -130h .text:004017C0 var_12A = byte ptr -12Ah .text:004017C0 var_129 = byte ptr -129h .text:004017C0 var_128 = byte ptr -128h .text:004017C0 var_127 = byte ptr -127h .text:004017C0 var_122 = byte ptr -122h .text:004017C0 var_121 = byte ptr -121h .text:004017C0 var_30 = dword ptr -30h .text:004017C0 var_2C = dword ptr -2Ch .text:004017C0 var_28 = dword ptr -28h .text:004017C0 s = dword ptr -1Ch .text:004017C0 var_18 = byte ptr -18h .text:004017C0 var_17 = byte ptr -17h .text:004017C0 var_14 = dword ptr -14h .text:004017C0 var_10 = dword ptr -10h .text:004017C0 var_C = dword ptr -0Ch .text:004017C0 var_8 = dword ptr -8 .text:004017C0 var_4 = dword ptr -4 .text:004017C0 arg_0 = dword ptr 8 .text:004017C0 arg_4 = dword ptr 0Ch .text:004017C0 .text:004017C0 push ebp .text:004017C1 mov ebp, esp .text:004017C3 add esp, 0FFFFFB50h .text:004017C9 xor eax, eax .text:004017CB mov [ebp+var_4], eax .text:004017CE xor edx, edx .text:004017D0 mov [ebp+var_8], edx .text:004017D3 xor ecx, ecx .text:004017D5 mov [ebp+var_C], ecx .text:004017D8 xor eax, eax .text:004017DA mov [ebp+var_10], eax .text:004017DD xor edx, edx .text:004017DF mov [ebp+var_14], edx .text:004017E2 push 5 ; n .text:004017E4 push 30h ; c .text:004017E6 lea ecx, [ebp+s] .text:004017E9 push ecx ; s .text:004017EA call _memset .text:004017EF add esp, 0Ch .text:004017F2 mov byte ptr [ebp+s], 31h .text:004017F6 mov [ebp+var_18], 31h .text:004017FA mov [ebp+var_17], 0 -------->D="10001" .text:004017FE push 10h ; n .text:00401800 push 41h ; c .text:00401802 lea eax, [ebp+var_344] .text:00401808 push eax ; s .text:00401809 call _memset .text:0040180E add esp, 0Ch .text:00401811 mov [ebp+var_335], 31h .text:00401818 mov [ebp+var_336], 44h .text:0040181F mov byte ptr [ebp+var_344+2], 30h .text:00401826 mov byte ptr [ebp+var_344+3], 46h .text:0040182D mov [ebp+var_33F], 46h .text:00401834 mov [ebp+var_340], 38h .text:0040183B mov [ebp+var_33D], 32h .text:00401842 mov [ebp+var_33A], 36h .text:00401849 mov [ebp+var_33E], 36h .text:00401850 mov [ebp+var_339], 45h .text:00401857 mov [ebp+var_338], 39h .text:0040185E mov [ebp+var_337], 37h .text:00401865 mov byte ptr [ebp+var_344+1], 37h .text:0040186C mov [ebp+var_334], 0 ---->N="A70F8F62AA6E97D1" .text:00401873 xor edx, edx .text:00401875 mov dword_52E770, edx .text:0040187B lea ecx, [ebp+var_C] .text:0040187E push ecx .text:0040187F push [ebp+arg_4] ----->讀入註冊碼 .text:00401882 call zhsread .text:00401887 add esp, 8 .text:0040188A mov dword_55DE68, 30h .text:00401894 lea eax, [ebp+var_4] .text:00401897 push eax .text:00401898 lea edx, [ebp+var_344] ------>讀入N .text:0040189E push edx .text:0040189F call zhsread .text:004018A4 add esp, 8 .text:004018A7 lea ecx, [ebp+var_8] .text:004018AA push ecx .text:004018AB lea eax, [ebp+s] ------>讀入D .text:004018AE push eax .text:004018AF call zhsread .text:004018B4 add esp, 8 .text:004018B7 lea edx, [ebp+var_14] .text:004018BA push edx .text:004018BB push [ebp+var_4] .text:004018BE push [ebp+var_8] .text:004018C1 push [ebp+var_C] .text:004018C4 call zexpmod .text:004018C9 add esp, 10h .text:004018CC push [ebp+var_14] .text:004018CF lea ecx, [ebp+var_130] .text:004018D5 push ecx .text:004018D6 call zswrite .text:004018DB add esp, 8 .text:004018DE mov dword_55DE68, 30h .text:004018E8 mov al, byte ptr [ebp+var_130] ------->RSA解密後結果 .text:004018EE mov dl, byte_52F404 .text:004018F4 cmp al, dl ----->第一位是否等於'5' .text:004018F6 jz short loc_401904 .text:004018F8 movsx ecx, byte ptr [ebp+var_130] .text:004018FF cmp ecx, 34h ----->第一位是否等於'4' .text:00401902 jnz short loc_40190A .text:00401904 .text:00401904 loc_401904: ; CODE XREF: sub_4017C0+136j .text:00401904 inc dword_55DE68 .text:0040190A .text:0040190A loc_40190A: ; CODE XREF: sub_4017C0+142j .text:0040190A mov al, byte ptr [ebp+var_130+1] .text:00401910 mov dl, byte_52F405 .text:00401916 cmp al, dl ----->第二位是否等於'5' .text:00401918 jz short loc_401926 .text:0040191A movsx ecx, byte ptr [ebp+var_130+1] .text:00401921 cmp ecx, 36h ----->第二位是否等於'6’ .text:00401924 jnz short loc_40192C .text:00401926 .text:00401926 loc_401926: ; CODE XREF: sub_4017C0+158j .text:00401926 inc dword_55DE68 .text:0040192C .text:0040192C loc_40192C: ; CODE XREF: sub_4017C0+164j .text:0040192C movsx eax, [ebp+var_12A] .text:00401933 cmp eax, 32h ----->第七位是否等於'2’ .text:00401936 jl short loc_401944 .text:00401938 movsx edx, [ebp+var_12A] .text:0040193F cmp edx, 32h .text:00401942 jle short loc_40194A .text:00401944 .text:00401944 loc_401944: ; CODE XREF: sub_4017C0+176j .text:00401944 dec dword_55DE68 .text:0040194A .text:0040194A loc_40194A: ; CODE XREF: sub_4017C0+182j .text:0040194A movsx ecx, [ebp+var_128] .text:00401951 cmp ecx, 35h ----->第九位是否等於'5’ .text:00401954 jnz short loc_40195C .text:00401956 inc dword_55DE68 .text:0040195C .text:0040195C loc_40195C: ; CODE XREF: sub_4017C0+194j .text:0040195C movsx eax, [ebp+var_127] .text:00401963 cmp eax, 33h ----->第十位是否等於'3’ .text:00401966 jnz short loc_40196E .text:00401968 inc dword_55DE68 .text:0040196E .text:0040196E loc_40196E: ; CODE XREF: sub_4017C0+1A6j .text:0040196E movsx edx, [ebp+var_129] .text:00401975 cmp edx, 61h ----->第八位是否等於'a' .text:00401978 jz short loc_40198C .text:0040197A movsx ecx, [ebp+var_129] .text:00401981 cmp ecx, 63h ----->第八位是否等於'c' .text:00401984 jz short loc_40198C .text:00401986 dec dword_55DE68 .text:0040198C .text:0040198C loc_40198C: ; CODE XREF: sub_4017C0+1B8j .text:0040198C ; sub_4017C0+1C4j .text:0040198C movsx eax, [ebp+var_122] .text:00401993 cmp eax, 34h ----->第十五位是否等於'4' .text:00401996 jnz short loc_40199E .text:00401998 inc dword_55DE68 .text:0040199E .text:0040199E loc_40199E: ; CODE XREF: sub_4017C0+1D6j .text:0040199E movsx edx, [ebp+var_121] .text:004019A5 cmp edx, 66h ----->第十六位是否等於'f' .text:004019A8 jnz short loc_4019B0 .text:004019AA inc dword_55DE68 .text:004019B0 .text:004019B0 loc_4019B0: ; CODE XREF: sub_4017C0+1E8j .text:004019B0 mov ecx, dword_55DE68 .text:004019B6 cmp ecx, 36h ----->看看結果是否符合要求 .text:004019B9 jnz loc_401A9D .text:004019BF mov [ebp+var_2C], 86A0h .text:004019C6 mov [ebp+var_30], offset unk_5260C0 .text:004019CD lea eax, [ebp+var_4B0] .text:004019D3 push eax .text:004019D4 call MD5init .text:004019D9 pop ecx .text:004019DA push [ebp+var_2C] .text:004019DD push [ebp+var_30] .text:004019E0 lea edx, [ebp+var_4B0] .text:004019E6 push edx .text:004019E7 call MD5_452710 .text:004019EC add esp, 0Ch .text:004019EF lea ecx, [ebp+var_4B0] .text:004019F5 push ecx .text:004019F6 lea eax, [ebp+s1] .text:004019FC push eax .text:004019FD call MD5_4527f8 ----->把52600c0開始長86a0的資料求MD5 .text:00401A02 add esp, 8 .text:00401A05 push 10h ; n .text:00401A07 push offset unk_52E760 ; s2 .text:00401A0C lea edx, [ebp+s1] .text:00401A12 push edx ; s1 .text:00401A13 call _memcmp ------>看看有沒有被修改 .text:00401A18 add esp, 0Ch .text:00401A1B test eax, eax .text:00401A1D jnz short loc_401A9D .text:00401A1F push [ebp+arg_4] .text:00401A22 push [ebp+arg_0] .text:00401A25 push offset aUtriso ; "UTRISO" .text:00401A2A push offset aSSS ; format .text:00401A2F lea ecx, [ebp+buffer] .text:00401A35 push ecx ; buffer .text:00401A36 call _sprintf ---->連線"UTRISO"和註冊名和註冊碼 .text:00401A3B add esp, 14h .text:00401A3E lea eax, [ebp+buffer] .text:00401A44 push eax .text:00401A45 lea edx, [ebp+s1] .text:00401A4B push edx .text:00401A4C call MD5_40177C ---->求MD5 .text:00401A51 add esp, 8 .text:00401A54 xor ecx, ecx .text:00401A56 mov [ebp+var_28], ecx .text:00401A59 .text:00401A59 loc_401A59: ; CODE XREF: sub_4017C0+2DBj .text:00401A59 push 10h ; n .text:00401A5B mov eax, [ebp+var_28] .text:00401A5E shl eax, 4 .text:00401A61 mov edx, [ebp+var_30] .text:00401A64 add eax, edx .text:00401A66 push eax ; s2 .text:00401A67 lea ecx, [ebp+s1] .text:00401A6D push ecx ; s1 .text:00401A6E call _memcmp .text:00401A73 add esp, 0Ch .text:00401A76 test eax, eax .text:00401A78 jnz short loc_401A90 ----->在剛才的資料區中查詢,找到則 置標誌 .text:00401A7A mov dword_52E770, 1 ******** .text:00401A84 mov dword_55DE68, 6550h ******** .text:00401A8E jmp short loc_401A9D .text:00401A90 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? .text:00401A90 .text:00401A90 loc_401A90: ; CODE XREF: sub_4017C0+2B8j .text:00401A90 inc [ebp+var_28] .text:00401A93 mov eax, [ebp+var_28] .text:00401A96 cmp eax, 86Ah .text:00401A9B jl short loc_401A59 .text:00401A9D .text:00401A9D loc_401A9D: ; CODE XREF: sub_4017C0+1F9j .text:00401A9D ; sub_4017C0+25Dj ... .text:00401A9D lea edx, [ebp+var_10] .text:00401AA0 push edx .text:00401AA1 push [ebp+arg_0] .text:00401AA4 call zshread .text:00401AA9 add esp, 8 .text:00401AAC mov ecx, dword_52E770 .text:00401AB2 test ecx, ecx .text:00401AB4 jnz short loc_401AC0 .text:00401AB6 mov dword_55DE68, 24h .text:00401AC0 .text:00401AC0 loc_401AC0: ; CODE XREF: sub_4017C0+2F4j .text:00401AC0 push [ebp+var_14] .text:00401AC3 push [ebp+var_10] .text:00401AC6 call zcompare .text:00401ACB add esp, 8 .text:00401ACE test eax, eax .text:00401AD0 jz short loc_401AD6 .text:00401AD2 xor eax, eax .text:00401AD4 jmp short loc_401ADB .text:00401AD6 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? .text:00401AD6 .text:00401AD6 loc_401AD6: ; CODE XREF: sub_4017C0+310j .text:00401AD6 mov eax, 1 .text:00401ADB .text:00401ADB loc_401ADB: ; CODE XREF: sub_4017C0+314j .text:00401ADB mov esp, ebp .text:00401ADD pop ebp .text:00401ADE retn .text:00401ADE sub_4017C0 endp
看到這裡想必都明白了,想做序號產生器是不可能了。這個程式只能爆破。
把004019B9 jnz loc_401A9D 改成jz loc_401a7a即可。共有七處,一一修改即可。
我剛學破解不久,有什麼錯誤之處歡迎指正。
再次謝謝blowfish.
相關文章
- 公司寶商標註冊|OPPO註冊OCAR商標被駁回,商標駁回處理方法2021-11-01
- ffmpeg分析系列之一(註冊該註冊的)2010-11-04
- 公司寶商標註冊|你想擁有自己的商標嗎?商標註冊流程解析2021-10-14
- 公務員之路3.0註冊分析2015-11-15
- 財智老闆通3.04註冊版---註冊演算法分析2003-03-16演算法
- Instant Source 註冊演算法分析+註冊器原始碼2015-11-15演算法原始碼
- Theme Builder註冊碼分析2015-11-15UI
- supercleaner註冊演算法分析2015-11-15演算法
- ShadowDefender 註冊碼 分析2024-08-17
- 【問題分析】assm註冊依賴物件頻頻失敗2014-11-27SSM物件
- MyEclipse6.5註冊方法2016-11-28Eclipse
- Macromedia Flex 安裝註冊方法2006-05-17MacFlex
- 實現類的註冊方法2024-04-21
- 批註:智慧指標分析2016-06-22指標
- 需求分析案例 - “自動註冊”功能2020-11-02
- Dubbo 中 Zookeeper 註冊中心原理分析2023-02-02
- nacos註冊中心原始碼流程分析2020-12-23原始碼
- 珠聯跳棋2.27之註冊分析2003-06-09
- spycop5.5簡要註冊分析2015-11-15
- SpeedFlash註冊演算法分析(VB)2015-11-15演算法
- yolo資料標註方法2024-08-15YOLO
- 錢鹿鎖屏APP註冊方法 錢鹿鎖屏怎麼註冊?2016-12-01APP
- Hidownload註冊方法總結2015-11-15
- js 註冊事件的兩種方式詳解,傳統註冊事件與方法監聽註冊事件(addEventListener)2020-10-22JS事件dev
- @angular/router 原始碼分析之註冊路由2018-07-10Angular原始碼路由
- Cleaner 3.2註冊分析 (18千字)2001-12-09
- “正在註冊字型”問題解決2017-10-17
- 網站自動註冊問題2012-12-04網站
- Oracle10g中的靜態註冊及動態註冊問題2010-04-30Oracle
- win10如何解除dll註冊_win10取消註冊dll的方法2020-02-06Win10
- 頁面註冊js的方法比較2009-09-17JS
- 動態註冊和靜態註冊2018-05-21
- 靜態註冊和動態註冊2013-11-27
- Win10系統右鍵選單新增“註冊/反註冊DLL”功能的方法2017-03-08Win10
- 【Java】NIO中Channel的註冊原始碼分析2019-05-17Java原始碼
- Netty原始碼分析--Channel註冊(上)(五)2019-07-02Netty原始碼
- Netty原始碼分析--Channel註冊(中)(六)2019-07-02Netty原始碼
- Nacos 服務註冊與發現原理分析2022-12-08