安裝製作Setup2Go演算法淺析!
軟體大小: 990 KB
軟體語言: 英文
軟體類別: 國外軟體 / 共享版 / 安裝製作
應用平臺: Win9x/NT/2000/XP
介面預覽: 無
加入時間: 2003-06-30 18:25:26
下載次數: 1513
推薦等級: ☆☆☆☆
軟體下載: http://count.skycn.com/softdown.php?id=10630&url=http://on165-http.skycn.net:8080/down/setup2go.exe
軟體簡介: Setup2Go 是一個很不錯的安裝程式製作工具,易於使用且互動性強,它不需要使用者具備多少程式設計知識和程式設計經驗就可在極短的時間內輕鬆完成製作,該軟體還支援當前所有的 32 位 Windows 作業系統的程式,包括 Windows 95、98、ME、NT4、2000、XP 等。軟體還自帶工程嚮導幫助你快速生成安裝專案,像建立快捷方式、寫入登錄檔、檔案型別關聯、定製對話方塊及螢幕樣式、使用外部工具、修改 INI 檔案、新增安裝密碼、測試執行等等這些功能它都具備,並且你還可以利用 Setup2Go 製作出支援多國語言的安裝程式,便於你向外國人出售自己的軟體產品。
破解工具:OllyDbgV1.09,TRW1.22
作者宣告:初學破解,僅作學習交流之用,失誤之處敬請大俠賜教!
這個軟體檢測無殼,可是用Wdasm反彙編的程式碼和用OD載入看到的程式碼不一樣,不知何故,是用VC編的.用Bpx hmemcpy找中斷點,OD載入。
【簡要過程】:
使用者名稱:ShenGe[BCG]
試驗碼:1234567890
.................(略)
00417C87 JE SETUP2GO.00417D4A
00417C8D XOR AL, AL
00417C8F JMP SETUP2GO.00417D5A
.................(略)
00417CE0 CALL DWORD PTR DS:[<&USER32.SendMessa>
00417CE6 MOV EDI, EBX
00417CE8 OR ECX, FFFFFFFF
00417CEB XOR EAX, EAX
00417CED LEA EDX, DWORD PTR SS:[EBP-108]
00417CF3 REPNE SCAS BYTE PTR ES:[EDI]
00417CF5 NOT ECX
00417CF7 SUB EDI, ECX
00417CF9 MOV EAX, ECX
00417CFB MOV ESI, EDI
00417CFD MOV EDI, EDX
00417CFF SHR ECX, 2
00417D02 REP MOVS DWORD PTR ES:[EDI], DWORD P>
00417D04 MOV ECX, EAX
00417D06 LEA EAX, DWORD PTR SS:[EBP-108]
00417D0C PUSH EAX
00417D0D AND ECX, 3
00417D10 LEA EAX, DWORD PTR SS:[EBP-20C]
00417D16 REP MOVS BYTE PTR ES:[EDI], BYTE PTR>
00417D18 PUSH EAX
00417D19 CALL SETUP2GO.0043C6D0
00417D1E MOV ECX, EAX
00417D20 CALL SETUP2GO.00415DEC
<---這個是關鍵的Call,跟進!①
00417D25 POP EDI
00417D26 POP ESI
00417D27 TEST AL, AL
00417D29 POP EBX
00417D2A JE SETUP2GO.00417C8D
<---關鍵跳轉!
00417D30 PUSH 80D
00417D35 JMP SHORT SETUP2GO.00417D4F
00417D37 PUSH 410
00417D3C PUSH 1
00417D3E CALL SETUP2GO.0043C79A
00417D43 POP ECX
00417D44 POP ECX
00417D45 JMP SETUP2GO.00417C8D
00417D4A PUSH 801
00417D4F PUSH DWORD PTR SS:[EBP+8]
00417D52 CALL DWORD PTR DS:[<&USER32.EndDialog>
★★★★★★★★★
①跟進那個關鍵的Call,可看到以下程式碼:
00415DEC PUSH EBP
00415DED MOV EBP, ESP
00415DEF PUSH ECX
00415DF0 PUSH ECX
00415DF1 PUSH EBX
00415DF2 PUSH ESI
00415DF3 PUSH EDI
00415DF4 MOV EDI, DWORD PTR SS:[EBP+8]
00415DF7 PUSH DWORD PTR SS:[EBP+C]
00415DFA MOV EBX, ECX
00415DFC PUSH EDI
00415DFD CALL SETUP2GO.00415D99
<---再跟進此Call,
^-^!②
00415E02 TEST AL, AL
00415E04 JE SETUP2GO.00415ECA
<---此處跳就失敗了!
00415E0A XOR ESI, ESI
00415E0C LEA EAX, DWORD PTR SS:[EBP-4]
00415E0F PUSH ESI
00415E10 PUSH EAX
00415E11 PUSH ESI
00415E12 PUSH 0F003F
00415E17 PUSH ESI
.........(省略,是對登錄檔和使按鈕變灰的操作)
00415EBA CALL SETUP2GO.00416CD4
00415EBF MOV BYTE PTR DS:[EBX+6C8], 1
00415EC6 MOV AL, 1
<---AL=1!Good
Luck!
00415EC8 JMP SHORT SETUP2GO.00415ECC
00415ECA XOR AL, AL
<---AL=0!Bad
Boy!
00415ECC POP EDI
00415ECD POP ESI
00415ECE POP EBX
00415ECF LEAVE
00415ED0 RETN 8
★★★★★★★★★
②跟進那個Call:
00415D99 PUSH EBP
00415D9A MOV EBP, ESP
00415D9C PUSH ECX
00415D9D XOR EDX, EDX
<---EDX=0
00415D9F PUSH EDI
<---EDI="ShenGe[BCG]",使用者名稱
00415DA0 CMP DWORD PTR SS:[EBP+8], EDX
<---比較有無輸入使用者名稱
00415DA3 JE SHORT SETUP2GO.00415DE5
00415DA5 CMP DWORD PTR SS:[EBP+C], EDX
<---比較有無輸入註冊碼
00415DA8 JE SHORT SETUP2GO.00415DE5
00415DAA MOV EDI, DWORD PTR SS:[EBP+8]
00415DAD OR ECX, FFFFFFFF
00415DB0 XOR EAX, EAX
00415DB2 REPNE SCAS BYTE PTR ES:[EDI]
<---取使用者名稱長度
00415DB4 NOT ECX
00415DB6 DEC ECX
00415DB7 JE SHORT SETUP2GO.00415DE5
00415DB9 MOV EDI, DWORD PTR SS:[EBP+C]
00415DBC OR ECX, FFFFFFFF
00415DBF REPNE SCAS BYTE PTR ES:[EDI]
<---取註冊碼長度
00415DC1 NOT ECX
00415DC3 DEC ECX
00415DC4 CMP ECX, 0A
<---註冊碼長度必須為10位
00415DC7 JNZ SHORT SETUP2GO.00415DE5
00415DC9 PUSH DWORD PTR SS:[EBP+C]
<---SS:[EBP+C]中為假碼"1234567890"
00415DCC LEA EAX, DWORD PTR SS:[EBP-4]
00415DCF MOV DWORD PTR SS:[EBP-4], EDX
00415DD2 PUSH EAX
00415DD3 PUSH SETUP2GO.0040C560
<---固定串"pasha
and andrey"
00415DD8 PUSH DWORD PTR SS:[EBP+8]
<---SS:[EBP+8]中為使用者名稱"ShenGe[BCG]"
00415DDB CALL SETUP2GO.004284E3
<---顯然這個Call也要跟進了!③
00415DE0 ADD ESP, 10
00415DE3 JMP SHORT SETUP2GO.00415DE7
00415DE5 XOR AL, AL
<---AL=0
00415DE7 POP EDI
00415DE8 LEAVE
00415DE9 RETN 8
★★★★★★★★★
③再跟進此Call,總算來到真正的核心部分了:
004284E3 PUSH EBP
004284E4 MOV EBP, ESP
004284E6 PUSH ECX
004284E7 PUSH EBX
004284E8 MOV EBX, DWORD PTR SS:[EBP+14]
<---EBX="1234567890",假碼!
004284EB PUSH ESI
004284EC PUSH EDI
004284ED MOV EDI, EBX
004284EF OR ECX, FFFFFFFF
004284F2 XOR EAX, EAX
004284F4 REPNE SCAS BYTE PTR ES:[EDI]
<---取假碼位數!
004284F6 NOT ECX
004284F8 DEC ECX
004284F9 MOV EDI, ECX
<---EDI=ECX=假碼位數
004284FB LEA EAX, DWORD PTR DS:[EDI+1]
<---EAX=A+1=B
004284FE PUSH EAX
004284FF CALL SETUP2GO.0045A144
00428504 MOV ESI, DWORD PTR SS:[EBP+10]
00428507 POP ECX
00428508 TEST ESI, ESI
0042850A MOV DWORD PTR SS:[EBP-4], EAX
0042850D JE SHORT SETUP2GO.0042853A
0042850F MOV AL, BYTE PTR DS:[EBX+1]
<---取假碼第2位"2"
00428512 PUSH EAX
00428513 CALL SETUP2GO.004284C1
<---對字元進行轉換(Hex--->Char),我沒有跟進
只是用幾個字元試了一下,若是小寫則轉換成大
寫,然後Hex值減0x30,其餘字元則Hex值減0x07,然後
Hex值減0x30
00428518 MOV EDX, EAX
0042851A MOV AL, BYTE PTR DS:[EBX]
<---取假碼第1位
0042851C PUSH EAX
0042851D MOV DWORD PTR SS:[EBP+10], EDX
00428520 CALL SETUP2GO.004284C1
00428525 POP ECX
00428526 POP ECX
00428527 MOV ECX, DWORD PTR SS:[EBP+10]
<---假碼第2位轉換後的值
0042852A SHL EAX, 4
0042852D ADD ECX, EAX
<---ECX=12,嗬嗬,對數字而言其實上面
這麼多就是"12"-->0x12
0042852F XOR ECX, 0FF
<---ECX=0x12^0xFF=0xED
00428535 SUB ECX, 55
<---ECX=0xED-0x55=0x98
00428538 MOV DWORD PTR DS:[ESI], ECX
0042853A PUSH EDI
0042853B PUSH DWORD PTR SS:[EBP-4]
0042853E PUSH DWORD PTR DS:[ESI]
00428540 PUSH DWORD PTR SS:[EBP+C]
00428543 PUSH DWORD PTR SS:[EBP+8]
00428546 CALL SETUP2GO.004283B5
<---跟進此Call才能看到演算法!④
0042854B PUSH EDI
0042854C PUSH EBX
<---假碼"1234567890"
0042854D PUSH DWORD PTR SS:[EBP-4]
<---真碼"12SSH9R3TQ"
00428550 CALL SETUP2GO.0045BD00
<---真假碼比對的Call,返回值在EAX中
若想註冊成功返回值必須為0
00428555 PUSH DWORD PTR SS:[EBP-4]
---------------------------
00428558 MOV EBX, EAX
0042855A NEG EBX
0042855C SBB BL, BL
0042855E INC BL
---------------------------
00428560 CALL SETUP2GO.00457862
00428565 ADD ESP, 24
00428568 MOV AL, BL
<---AL中的值是由BL中的值確定的
0042856A POP EDI
0042856B POP ESI
0042856C POP EBX
0042856D LEAVE
0042856E RETN
★★★★★★★★★
④跟進演算法Call:
004283B5 PUSH EBP
004283B6 MOV EBP, ESP
004283B8 PUSH ECX
004283B9 PUSH ECX
004283BA PUSH EBX
004283BB MOV EBX, DWORD PTR SS:[EBP+18]
004283BE PUSH ESI
004283BF PUSH EDI
004283C0 LEA ESI, DWORD PTR DS:[EBX+1]
004283C3 PUSH ESI
004283C4 CALL SETUP2GO.0045A144
004283C9 PUSH ESI
004283CA MOV DWORD PTR SS:[EBP-4], EAX
004283CD CALL SETUP2GO.0045A144
004283D2 AND DWORD PTR SS:[EBP+18], 0
004283D6 PUSH EBX
<---EBX=0x0A
004283D7 PUSH DWORD PTR SS:[EBP+8]
<---為使用者名稱"ShenGe[BCG]"
004283DA MOV DWORD PTR SS:[EBP-8], EAX
004283DD PUSH DWORD PTR SS:[EBP-4]
004283E0 CALL SETUP2GO.00428316
<---對使用者名稱進行操作,具體如下:若使用者名稱不足10位則
從第1位開始取迴圈補足,如若使用者名稱為"ShenGe",則操作後
為"ShenGeShen";若大於10位則取前10位,我的
為取使用者名稱"ShenGe[BCG]"的前10位"ShenGe[BCG"
004283E5 PUSH EBX
004283E6 PUSH DWORD PTR SS:[EBP+C]
004283E9 PUSH DWORD PTR SS:[EBP-8]
004283EC CALL SETUP2GO.00428316
<---取固定串"pasha
and andrey"的前10位"pasha and "
004283F1 MOV ESI, DWORD PTR SS:[EBP+10]
<---ESI=0x98,記得怎麼算來的吧!
------------------------------
004283F4 MOV EDI, 0FF
004283F9 AND ESI, EDI
004283FB ADD ESI, 55
004283FE XOR ESI, EDI
00428400 MOV EAX, ESI
00428402 SHR EAX, 4
00428405 PUSH EAX
00428406 CALL SETUP2GO.0042837F
0042840B MOV ECX, DWORD PTR SS:[EBP+14]
0042840E AND ESI, 0F
00428411 PUSH ESI
00428412 MOV BYTE PTR DS:[ECX], AL
00428414 CALL SETUP2GO.0042837F
--------------------------
不會吧!又還原回來了!其實往後看你會發現這麼多隻是軟體給
Cracker放了一個煙霧彈,它會把這前兩位"12"再合併到
計算得到的字串中!即註冊碼前2位任意,關鍵是後8位.
00428419 MOV EDX, DWORD PTR SS:[EBP+14]
0042841C ADD ESP, 28
0042841F XOR ESI, ESI
00428421 TEST EBX, EBX
00428423 MOV BYTE PTR DS:[EDX+1], AL
00428426 JLE SHORT SETUP2GO.0042844E
00428428 MOV EAX, DWORD PTR SS:[EBP+C]
<---SS:[EBP+C]中為"pasha
and "
0042842B MOV ECX, DWORD PTR SS:[EBP+18]
0042842E AND ECX, EDI
<---EDI為0xFF,取低位值
00428430 MOV AL, BYTE PTR DS:[ESI+EAX]
<---按位取"pasha
and "的每個字元
00428433 AND EAX, EDI
00428435 XOR EAX, ECX
00428437 MOV ECX, DWORD PTR SS:[EBP+18]
0042843A SHR ECX, 8
0042843D MOV EAX, DWORD PTR DS:[EAX*4+40D348]
<---查表給EAX賦值,表如下:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
0040D34C 96 30 07 77 2C 61 0E EE BA 51 09 99 19 C4 6D 07
0040D35C 8F F4 6A 70 35 A5 63 E9 A3 95 64 9E 32 88 DB 0E
0040D36C A4 B8 DC 79 1E E9 D5 E0 88 D9 D2 97 2B 4C B6 09
0040D37C BD 7C B1 7E 07 2D B8 E7 91 1D BF 90 64 10 B7 1D
0040D38C F2 20 B0 6A 48 71 B9 F3 DE 41 BE 84 7D D4 DA 1A
0040D39C EB E4 DD 6D 51 B5 D4 F4 C7 85 D3 83 56 98 6C 13
0040D3AC C0 A8 6B 64 7A F9 62 FD EC C9 65 8A 4F 5C 01 14
0040D3BC D9 6C 06 63 63 3D 0F FA F5 0D 08 8D C8 20 6E 3B
0040D3CC 5E 10 69 4C E4 41 60 D5 72 71 67 A2 D1 E4 03 3C
0040D3DC 47 D4 04 4B FD 85 0D D2 6B B5 0A A5 FA A8 B5 35
0040D3EC 6C 98 B2 42 D6 C9 BB DB 40 F9 BC AC E3 6C D8 32
0040D3FC 75 5C DF 45 CF 0D D6 DC 59 3D D1 AB AC 30 D9 26
0040D40C 3A 00 DE 51 80 51 D7 C8 16 61 D0 BF B5 F4 B4 21
0040D41C 23 C4 B3 56 99 95 BA CF 0F A5 BD B8 9E B8 02 28
0040D42C 08 88 05 5F B2 D9 0C C6 24 E9 0B B1 87 7C 6F 2F
0040D43C 11 4C 68 58 AB 1D 61 C1 3D 2D 66 B6 90 41 DC 76
0040D44C 06 71 DB 01 BC 20 D2 98 2A 10 D5 EF 89 85 B1 71
0040D45C 1F B5 B6 06 A5 E4 BF 9F 33 D4 B8 E8 A2 C9 07 78
0040D46C 34 F9 00 0F 8E A8 09 96 18 98 0E E1 BB 0D 6A 7F
0040D47C 2D 3D 6D 08 97 6C 64 91 01 5C 63 E6 F4 51 6B 6B
0040D48C 62 61 6C 1C D8 30 65 85 4E 00 62 F2 ED 95 06 6C
0040D49C 7B A5 01 1B C1 F4 08 82 57 C4 0F F5 C6 D9 B0 65
0040D4AC 50 E9 B7 12 EA B8 BE 8B 7C 88 B9 FC DF 1D DD 62
0040D4BC 49 2D DA 15 F3 7C D3 8C 65 4C D4 FB 58 61 B2 4D
0040D4CC CE 51 B5 3A 74 00 BC A3 E2 30 BB D4 41 A5 DF 4A
0040D4DC D7 95 D8 3D 6D C4 D1 A4 FB F4 D6 D3 6A E9 69 43
0040D4EC FC D9 6E 34 46 88 67 AD D0 B8 60 DA 73 2D 04 44
0040D4FC E5 1D 03 33 5F 4C 0A AA C9 7C 0D DD 3C 71 05 50
0040D50C AA 41 02 27 10 10 0B BE 86 20 0C C9 25 B5 68 57
0040D51C B3 85 6F 20 09 D4 66 B9 9F E4 61 CE 0E F9 DE 5E
0040D52C 98 C9 D9 29 22 98 D0 B0 B4 A8 D7 C7 17 3D B3 59
0040D53C 81 0D B4 2E 3B 5C BD B7 AD 6C BA C0 20 83 B8 ED
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
00428444 XOR
EAX, ECX
00428446 INC ESI
00428447 CMP ESI, EBX
00428449 MOV DWORD PTR SS:[EBP+18], EAX
<---結果存入SS:[EBP+18]中
0042844C JL SHORT SETUP2GO.00428428
<---是否取完字元,我的迴圈完後EAX=DE928F52
這個值也應該是個固定值!
0042844E CMP EBX, 2
00428451 JLE SHORT SETUP2GO.004284A6
00428453 MOV ESI, DWORD PTR SS:[EBP-4]
<---ESI="ShenGe[BCG"
00428456 LEA EAX, DWORD PTR DS:[EBX-2]
<---EAX=A-2=8
00428459 SUB ESI, EDX
0042845B LEA ECX, DWORD PTR DS:[EDX+2]
0042845E MOV DWORD PTR SS:[EBP+8], ESI
00428461 MOV DWORD PTR SS:[EBP+C], EAX
00428464 JMP SHORT SETUP2GO.00428469
00428466 MOV ESI, DWORD PTR SS:[EBP+8]
下面這一段我就不註釋了,同上,這段迴圈從"ShenGe[BCG"
的第3位開始取後面的8位字元參與運算
-----------------------------
00428469 MOV AL, BYTE PTR DS:[ESI+ECX]
<---按位取"enGe[BCG"
0042846C MOV EDX, DWORD PTR SS:[EBP+18]
0042846F AND EAX, EDI
00428471 AND EDX, EDI
00428473 XOR EAX, EDX
00428475 MOV EDX, DWORD PTR SS:[EBP+18]
<---EDX=DE928F52,上面的計算值
00428478 SHR EDX, 8
0042847B MOV EAX, DWORD PTR DS:[EAX*4+40D348]
-----------------------------
00428482 PUSH 24
00428484 XOR EAX, EDX
00428486 XOR EDX, EDX
00428488 POP ESI
<---ESI=0x24
00428489 MOV DWORD PTR SS:[EBP+18], EAX
0042848C DIV ESI
0042848E CMP EDX, 0A
<---餘數值若大於0A,則加0x37,否則加0x30,
確保註冊碼為數字或字母.
00428491 JNB SHORT SETUP2GO.00428498
00428493 ADD DL, 30
00428496 JMP SHORT SETUP2GO.0042849B
00428498 ADD DL, 37
0042849B MOV BYTE PTR DS:[ECX], DL
<---結果存入DS:[ECX]中,就是正確的註冊碼!
0042849D INC ECX
0042849E DEC DWORD PTR SS:[EBP+C]
004284A1 JNZ SHORT SETUP2GO.00428466
<---是否取完字元
004284A3 MOV EDX, DWORD PTR SS:[EBP+14]
004284A6 PUSH DWORD PTR SS:[EBP-4]
004284A9 AND BYTE PTR DS:[EDX+EBX], 0
<---D EDX會看到正確的註冊碼"12SSH9R3TQ"
004284AD CALL SETUP2GO.00457862
004284B2 PUSH DWORD PTR SS:[EBP-8]
004284B5 CALL SETUP2GO.00457862
004284BA POP ECX
004284BB POP ECX
004284BC POP EDI
004284BD POP ESI
004284BE POP EBX
004284BF LEAVE
004284C0 RETN
總結:註冊碼必須為10位,前2位任意,後8位由固定串"pasha and andrey"
的前10位和使用者名稱計算得到.
軟體註冊成功後將註冊資訊儲存在登錄檔的
"HKEY_LOCAL_MACHINE\Software\SDS Software\Setup2Go"下
一個可用註冊碼:
使用者名稱:ShenGe[BCG]
註冊碼:12SSH9R3TQ
Cracked By ShenGe[BCG]
相關文章
- 淺析Buddy演算法2022-07-30演算法
- 淺析雜湊演算法2019-03-10演算法
- win10怎麼製作安裝u盤_win10安裝U盤製作教程2020-04-22Win10
- U盤如何製作win10安裝盤|win10安裝U盤製作方法2021-08-11Win10
- Debian安裝包的簡單製作2018-03-13
- DMG Canvas 4.0.7 DMG安裝包製作2023-11-07Canvas
- Mac 製作 win10 安裝盤2024-08-16MacWin10
- 深入淺析Nodejs的安裝方法與模組系統2021-09-11NodeJS
- kz淺析橋式起重機的選購和安裝2022-03-19
- Linux零複製技術淺析2020-07-19Linux
- 隨身碟如何製作win10安裝盤|win10安裝隨身碟製作方法2021-08-11Win10
- oracle linux使用安裝盤製作本地yum2024-07-09OracleLinux
- Python 模組的製作,釋出,安裝2024-07-07Python
- Flutter佈局和繪製流程淺析2021-04-01Flutter
- 怎樣製作win10的iOS映象安裝U盤_製作win10 iso映象安裝U盤教程2020-03-12Win10iOS
- Linux作業系統記憶體淺析2021-09-09Linux作業系統記憶體
- 使用CheckInstall從原始碼製作RPM安裝包2020-10-29原始碼
- Linux下使用makeself製作一鍵安裝包2024-12-05Linux
- 製作yum源及安裝賽門鐵克2021-03-05
- 淺析vue2.0的diff演算法2019-02-28Vue演算法
- JVM 系列文章之 GC 演算法淺析2018-09-07JVMGC演算法
- 整合學習演算法(Ensemble Method)淺析2018-12-28演算法
- RSA非對稱加密演算法淺析2023-01-18加密演算法
- Java 集合中的排序演算法淺析2023-02-20Java排序演算法
- win10原版ISO映象如何製作安裝光碟_製作win10原版ISO映象安裝光碟圖文詳解2020-04-24Win10
- 怎樣製作win10的iOS映象安裝隨身碟_製作win10 iso映象安裝隨身碟教程2020-03-12Win10iOS
- iOS 富文字常用封裝(NSAttributedString淺析)2019-03-04iOS封裝
- iOS Block淺淺析2019-03-10iOSBloC
- win10系統製作mac10.11安裝u盤的方法_win10如何製作mac os x 10.11安裝u盤2020-04-22Win10Mac
- macOS Big Sur系統製作安裝啟動盤教程2021-01-26Mac
- 淺析 - 阿里巴巴專家教你堅持寫作2020-11-23阿里
- 對話 | 淺析NEO的dBFT共識演算法2019-01-19演算法
- linux/OSX中“DD”命令製作ISO映象作業系統安裝U盤2018-09-02Linux作業系統
- RunLoop 淺析2019-01-17OOP
- 淺析 ReentrantLock2019-04-01ReentrantLock
- Unstated淺析2019-01-23
- 淺析SharedPreferences2018-12-02
- Nginx淺析2018-05-23Nginx
- 淺析Promise2018-06-28Promise