易語言------精科電腦算命V3.4版註冊演算法分析

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

n久以前寫的.有些東西已經記不住了.呵呵
沒完過易語言的東東,第一次玩,找了個軟柿子捏捏。寫出來和大家共享,這個軟體的演算法不難.沒其他意思,僅供共享經驗而已
在開始分析之前寫上我的一點心得:對於易語言的東東。程式執行起來向加了一層殼一樣,一切都在庫裡面進行.你如果用OD載入,不執行程式,就開始查詢程式中的某些地址,是找不到的,例如本軟體的關鍵48C00F處。還有易語言的庫程式。而對於易語言,其實一個萬能斷點是GetWindowTextA(個人認為)。因為系統會用這個函式進行其他的操作,所以有可能你在此設斷時,並不是你要的東西。這時我得做法是先將OD視窗話,在設斷,觀察EAX中的值(怎麼用體會一下就知道了)。還有一個特點就是易語言好像喜歡用浮點運算。如果當程式註冊失敗時,出現註冊失敗提示的話,那麼他又保露了一點,那就是MessageBoxA函式。也可在這個函式上設斷,等斷在這裡之後,用F8單步,看看堆疊區裡,看見你輸入的東西了馬。這時可以用記憶體斷點,來跟蹤達到特殊效果。至於如何設斷點,我建議的做法是,當程式執行起來之後用Ctrl+F,來查詢1000000地址,這裡就是易語言的庫函式空間。然後用搜尋當前模組中的函式,就可以找到相應的函式。這樣比直接用BP下斷點感覺好一點。可以避免在系統庫中轉。以上僅是我在分析易語言程式時候的一點心得,至於具體效果如何,各位可以試試,不正確之處,還希望大家指出。。申明這個方法不是萬金油!
0048BEE2   55               PUSH EBP   在這裡設斷
0048BEE3   8BEC             MOV EBP,ESP
0048BEE5   81EC 24000000    SUB ESP,24
0048BEEB   C745 FC 00000000 MOV DWORD PTR SS:[EBP-4],0
下面是一段浮點運算
0048BEF2   DB05 6C050D01    FILD DWORD PTR DS:[10D056C]取機器碼的後幾位
例如我得機器碼是CD1119312,取1119312入棧
0048BEF8   DD5D F4          FSTP QWORD PTR SS:[EBP-C]
FSTP 的功能st(0)儲存倒DEST (mem32/mem64/mem80);然後再執行一次出棧操作
0048BEFB   DD45 F4          FLD QWORD PTR SS:[EBP-C]
FLD src  裝入實數到st(0)  st(0) <- src (mem32/mem64/mem80) 
將1119312到ST0
0048BEFE   DC05 837C4500    FADD QWORD PTR DS:[457C83]
00457C83中的資料為16575065.00000000這裡他是怎麼計算出來的我沒跟出來後來才知道原來是程式中固定的
上一句的作用是將1119312和16575065相加
0048BF04   DD5D F4          FSTP QWORD PTR SS:[EBP-C] 入st7
0048BF07   DD45 F4          FLD QWORD PTR SS:[EBP-C] 裝入到s’t0做下一次加法
0048BF0A   DC25 8B7C4500    FSUB QWORD PTR DS:[457C8B]
取00457C83處的值 2256.000000000000 做減法 這裡也是程式中固定的
0048BF10   DD5D EC          FSTP QWORD PTR SS:[EBP-14]  
0048BF13   DD45 EC          FLD QWORD PTR SS:[EBP-14]
0048BF16   DC05 937C4500    FADD QWORD PTR DS:[457C93]
取00457C93的值1948.291666666667做加法  程式中固定的值
0048BF1C   DD5D E4          FSTP QWORD PTR SS:[EBP-1C]
0048BF1F   68 01030080      PUSH 80000301
0048BF24   6A 00            PUSH 0
0048BF26   68 BB184D00      PUSH 4D18BB
0048BF2B   DD45 E4          FLD QWORD PTR SS:[EBP-1C] 裝入實數到st0
0048BF2E   E8 7028FEFF      CALL jksm.0046E7A3
0048BF33   68 01030080      PUSH 80000301
0048BF38   6A 00            PUSH 0
0048BF3A   50               PUSH EAX
0048BF3B   68 02000000      PUSH 2
0048BF40   BB CC000000      MOV EBX,0CC
0048BF45   E8 F1370000      CALL jksm.0048F73B
略調一部分
0048BFD5   53               PUSH EBX
0048BFD6   E8 6C370000      CALL jksm.0048F747
0048BFDB   83C4 04          ADD ESP,4
0048BFDE   DB45 FC          FILD DWORD PTR SS:[EBP-4] 裝入正確的密碼
0048BFE1   DD5D E4          FSTP QWORD PTR SS:[EBP-1C] 
0048BFE4   DD45 EC          FLD QWORD PTR SS:[EBP-14] 裝入錯誤的密碼
0048BFE7   DC65 E4          FSUB QWORD PTR SS:[EBP-1C] 相減
注意下面這些浮點指令很煩的
0048BFEA   D9E4            FTST 零檢測將ST0與0。0比較,看上面的結果是否為0
0048BFEC   DFE0             FSTSW AX  儲存狀態子到AX
0048BFEE   F6C4 01          TEST AH,1
0048BFF1   74 02            JE SHORT jksm.0048BFF5
0048BFF3   D9E0             FCHS  改變符號
0048BFF5   DC1D 49DE4100    FCOMP QWORD PTR DS:[41DE49]
0048BFFB   DFE0             FSTSW AX
0048BFFD   F6C4 41          TEST AH,41
0048C000   B8 00000000      MOV EAX,0
0048C005   0F95C0           SETNE AL       不等於0或者不相等時置OPRD為1
0048C008   8945 E4          MOV DWORD PTR SS:[EBP-1C],EAX
0048C00B   837D E4 01       CMP DWORD PTR SS:[EBP-1C],1
0048C00F   0F85 0A000000    JNZ jksm.0048C01F  這裡如果跳走的話就失敗了
0048C015   E8 65000000      CALL jksm.0048C07F 這個call是計算註冊碼的跟進

0048C07F   55               PUSH EBP
0048C080   8BEC             MOV EBP,ESP
0048C082   81EC 20000000    SUB ESP,20
0048C088   C745 FC 00000000 MOV DWORD PTR SS:[EBP-4],0
0048C08F   C745 F8 00000000 MOV DWORD PTR SS:[EBP-8],0
0048C096   68 04000080      PUSH 80000004
0048C09B   6A 00            PUSH 0
0048C09D   68 23A84200      PUSH jksm.0042A823
0048C0A2   68 01000000      PUSH 1
0048C0A7   BB 64010000      MOV EBX,164
0048C0AC   E8 8A360000      CALL jksm.0048F73B
0048C0B1   83C4 10          ADD ESP,10
0048C0B4   8945 F0          MOV DWORD PTR SS:[EBP-10],EAX
0048C0B7   8955 F4          MOV DWORD PTR SS:[EBP-C],EDX
0048C0BA   DD05 3CA84200    FLD QWORD PTR DS:[42A83C] 估計這裡的值也是固定的 0042A83C中       44353402.00000000
0048C0C0   DC65 F0          FSUB QWORD PTR SS:[EBP-10]
0048C0C3   DD5D E8          FSTP QWORD PTR SS:[EBP-18]
0048C0C6   DD45 E8          FLD QWORD PTR SS:[EBP-18] 將上面的值裝入ST0
0048C0C9   E8 D526FEFF  CALL jksm.0046E7A3  這個CALL將他轉化成十六進位制值1
0048C0CE   68 01030080      PUSH 80000301
0048C0D3   6A 00            PUSH 0
0048C0D5   50               PUSH EAX
0048C0D6   68 01030080      PUSH 80000301
0048C0DB   6A 00            PUSH 0
0048C0DD   FF35 6C050D01    PUSH DWORD PTR DS:[10D056C]
0048C0E3   68 02000000      PUSH 2
0048C0E8   BB CC000000      MOV EBX,0CC
0048C0ED   E8 49360000      CALL jksm.0048F73B 這裡是計算註冊碼的關鍵跟進去發現程式的作用是將上面的值1與一個固定的值0x111450進行異或運算
0048C0F2   83C4 1C          ADD ESP,1C
0048C0F5   8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
略調一部分
0048C142   74 09            JE SHORT jksm.0048C14D
0048C144   53               PUSH EBX
0048C145   E8 FD350000      CALL jksm.0048F747
0048C14A   83C4 04          ADD ESP,4  上面程式碼將輸入的假碼轉化成浮點形式
0048C14D   DD45 EC          FLD QWORD PTR SS:[EBP-14]
0048C150   E8 4E26FEFF      CALL jksm.0046E7A3  將浮點值轉化成十六進位制
0048C155   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX
0048C158   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
0048C15B   3945 F8      CMP DWORD PTR SS:[EBP-8],EAX 這裡比較十六進位制
0048C15E   0F85 5D040000    JNZ jksm.0048C5C1 跳走則失敗

程式兩次計算時都呼叫了這個地方
100513F0   8B5424 10        MOV EDX,DWORD PTR SS:[ESP+10]
100513F4   8B4424 0C        MOV EAX,DWORD PTR SS:[ESP+C]
100513F8   83F8 01          CMP EAX,1
100513FB   8B0A             MOV ECX,DWORD PTR DS:[EDX]
100513FD   7E 2F            JLE SHORT krnln.1005142E
100513FF   56               PUSH ESI
10051400   8B7424 08        MOV ESI,DWORD PTR SS:[ESP+8]
10051404   57               PUSH EDI
10051405   8D78 FF          LEA EDI,DWORD PTR DS:[EAX-1]
10051408   8BC6             MOV EAX,ESI
1005140A   83C2 0C          ADD EDX,0C
1005140D   83E8 00          SUB EAX,0
10051410   74 0E            JE SHORT krnln.10051420
10051412   48               DEC EAX
10051413   74 07            JE SHORT krnln.1005141C
10051415   48               DEC EAX
10051416   75 0A            JNZ SHORT krnln.10051422
10051418   330A             XOR ECX,DWORD PTR DS:[EDX]  
這裡是計算密碼和註冊碼的關鍵 做一次異或運算就出來了
1005141A   EB 06            JMP SHORT krnln.10051422
1005141C   0B0A             OR ECX,DWORD PTR DS:[EDX]
1005141E   EB 02            JMP SHORT krnln.10051422
10051420   230A             AND ECX,DWORD PTR DS:[EDX]
10051422   4F               DEC EDI
10051423  ^75 E3            JNZ SHORT krnln.10051408
10051425   8B4424 10        MOV EAX,DWORD PTR SS:[ESP+10]
總結:程式先根據取得的安裝號,計算出密碼,只有密碼正確才驗證註冊碼,兩個都正確則註冊成功如果,只有密碼正確程式會給出相應的提示,但是這裡由於和密碼錯誤的提示不同,很容易給破解留下伏筆。這個軟體破解很容易。
註冊資訊儲存在:HKEY_CURRENT_UESRSOFTWAREJSMKKLOGIN裡刪掉該鍵值可重新註冊

相關文章