夢想圖片螢幕保護V2.6破解簡要分析
標 題:夢想圖片螢幕保護V2.6破解簡要分析
發信人: ShenGe
時 間:2003/05/12 07:36am
詳細資訊:
破解軟體:夢想圖片螢幕保護V2.6
軟體語言:
中文
軟體類別: 國內軟體 / 共享版 /
應用平臺: Win9x/NT/2000/XP
介面預覽:
無
軟體下載: http://count.skycn.com/softdown.php?id=6912&url=http://on165-down.skycn.net/down/dreamssc.zip
破解工具:TRW1.22
作者宣告:初學破解,僅作學習交流之用,失誤之處敬請大俠賜教。
軟體說明:夢想圖片螢幕保護是一個簡易出色的圖片螢幕保護製作工具,使用者只須簡單的設定四個步驟,數分鐘內就可建立出色的Windows
螢幕保護。本軟體輕鬆易用,功能強大,非常適用於製作具有優秀效果的螢幕保護。軟體特點:1.程式操作簡便,美觀精巧,支援換膚功能;2.支援新增Bmp、Jpg和Gif格式圖片,新增Mp3、Wav和Mid格式歌曲,可新增多張圖片和多首歌曲;3.可自定義屏保顯示的動態文字和靜態標題;4.螢幕保護的背景、輪廓都可以定製或選擇;5.建立的螢幕保護具有32大類82種特殊圖片切換效果,7大類22種字型顯示效果。
未註冊最多隻能新增7張圖片來建立螢幕保護,註冊後無圖片數量限制。
唉,又碰上了一個VB的,還是反彙編的,只好動態跟蹤,真是頭痛,反彙編的怎麼去除哇,那位大俠要是知道煩請賜教。填入使用者名稱:ShenGe和假碼:12345-67890,為什麼假碼是這種形式呢,往後看就
知道了,下萬能斷點BPX
HMEMCPY,註冊,程式被中斷,BC *,PMODULE,來到如下程式碼:
0167:00468DE6 CALL
`MSVBVM50!rtcRightTrimVar`
0167:00468DEC MOV EBX,[EBX+0300]
<---程式中斷於此
0167:00468DF2 PUSH ESI
0167:00468DF3
MOV DWORD [EBP+FFFFFAF4],0040F348
0167:00468DFD MOV
DWORD [EBP+FFFFFAEC],8008
0167:00468E07 CALL
EBX
0167:00468E09 MOV [EBP+FFFFFF74],EAX
0167:00468E0F
LEA EAX,[EBP+FFFFFF6C]
0167:00468E15 LEA
ECX,[EBP+FFFFFF5C]
0167:00468E1B PUSH EAX
0167:00468E1C
PUSH ECX
.........(略去)
按F10跟下去,注意各暫存器值的變化,可看到以下程式碼:
0167:00468F26
PUSH DWORD A0
0167:00468F2B PUSH DWORD
004108C0
0167:00468F30 PUSH EBX
0167:00468F31 PUSH
EAX
0167:00468F32 CALL `MSVBVM50!__vbaHresultCheckObj`
0167:00468F38
MOV ECX,[EBP-44] <---[EBP-44]中為輸入的假碼
0167:00468F3B
MOV EBX,[0048239C]
0167:00468F41 PUSH
ECX
0167:00468F42 CALL EBX
<---此Call計算假碼的長度,返回值在EAX中
0167:00468F44
MOV EDX,EAX
0167:00468F46 MOV
EAX,[EBP-48] <---[EBP-48]中為固定字串"4BE43-BI3G8"
0167:00468F49
PUSH EAX
0167:00468F4A MOV [EBP+FFFFF800],EDX
0167:00468F50
CALL EBX <---同上Call,求字串長度
0167:00468F52
MOV ECX,[EBP+FFFFF800] <---[EBP+FFFFF800]中為字串長度
0167:00468F58
XOR EBX,EBX
0167:00468F5A CMP
ECX,EAX <---比較假碼長度與固定字串長度是否相等
0167:00468F5C
LEA EDX,[EBP-48]
0167:00468F5F LEA
EAX,[EBP-44]
0167:00468F62 PUSH EDX
0167:00468F63
SETL BL <---若位數相等則BL=0
0167:00468F66
PUSH EAX
0167:00468F67 PUSH BYTE +02
0167:00468F69
NEG EBX <---EBX=0-EBX
0167:00468F6B
CALL `MSVBVM50!__vbaFreeStrList`
0167:00468F71 ADD
ESP,BYTE +0C
0167:00468F74 LEA ECX,[EBP-50]
0167:00468F77
LEA EDX,[EBP-4C]
0167:00468F7A PUSH
ECX
0167:00468F7B PUSH EDX
0167:00468F7C PUSH
BYTE +02
0167:00468F7E CALL `MSVBVM50!__vbaFreeObjList`
0167:00468F84
ADD ESP,BYTE +0C
0167:00468F87 CMP
BX,DI <---關鍵比較1
0167:00468F8A JNZ
NEAR 0046A35C <---位數不相等則跳,那就沒戲了
0167:00468F90
PUSH ESI
0167:00468F91 CALL NEAR [EBP+FFFFF808]
0167:00468F97
PUSH EAX
0167:00468F98 LEA EAX,[EBP-4C]
0167:00468F9B
PUSH EAX
0167:00468F9C CALL `MSVBVM50!__vbaObjSet`
0167:00468FA2
MOV EBX,EAX
0167:00468FA4 LEA
EDX,[EBP-44]
0167:00468FA7 PUSH EDX
0167:00468FA8
PUSH EBX
0167:00468FA9 MOV ECX,[EBX]
0167:00468FAB
CALL NEAR [ECX+A0]
0167:00468FB1 CMP
EAX,EDI
0167:00468FB3 JNL 00468FC7
0167:00468FB5
PUSH DWORD A0
0167:00468FBA PUSH DWORD
004108C0
0167:00468FBF PUSH EBX
0167:00468FC0 PUSH
EAX
0167:00468FC1 CALL `MSVBVM50!__vbaHresultCheckObj`
0167:00468FC7
MOV EAX,[EBP-44] <---[EBP-44]中為我輸入的使用者名稱
0167:00468FCA PUSH EAX
0167:00468FCB CALL `MSVBVM50!__vbaLenBstr`
<---求使用者名稱的長度
0167:00468FD1 MOV ECX,EAX
<---ECX=EAX=使用者名稱的長度
0167:00468FD3 CALL
`MSVBVM50!__vbaI2I4`
0167:00468FD9 LEA ECX,[EBP-44]
0167:00468FDC
MOV [EBP+FFFFF85C],EAX
0167:00468FE2 MOV
DWORD [EBP-20],01 <---[EBP-20]置值為1
0167:00468FE9 CALL
`MSVBVM50!__vbaFreeStr`
0167:00468FEF LEA
ECX,[EBP-4C]
0167:00468FF2 CALL `MSVBVM50!__vbaFreeObj`
0167:00468FF8
MOV EBX,[00482648]
0167:00468FFE MOV
EDI,[0048248C]
--------------第一個大迴圈----------------------
0167:00469004
MOV CX,[EBP+FFFFF85C] <---[EBP+FFFFF85C]中為使用者名稱長度
0167:0046900B
CMP [EBP-20],CX <---比較是否取完使用者名稱
0167:0046900F
JG NEAR 0046917B
0167:00469015 PUSH
ESI
0167:00469016 CALL NEAR [EBP+FFFFF808]
0167:0046901C
LEA EDX,[EBP-4C]
0167:0046901F PUSH
EAX
0167:00469020 PUSH EDX
0167:00469021 CALL
`MSVBVM50!__vbaObjSet`
0167:00469027 MOV
EAX,[EBP-4C]
0167:0046902A LEA EDX,[EBP-64]
0167:0046902D
MOVSX ECX,WORD [EBP-20] <---ECX=[EBP-20]
0167:00469031
MOV [EBP-5C],EAX
0167:00469034 LEA
EAX,[EBP-74]
0167:00469037 PUSH EAX
0167:00469038
PUSH ECX
0167:00469039 LEA EAX,[EBP+FFFFFF7C]
<---[EBP+FFFFFF7C]中註冊碼位數
0167:0046903F PUSH EDX
0167:00469040
PUSH EAX
0167:00469041 MOV DWORD
[EBP-6C],01
0167:00469048 MOV DWORD [EBP-74],02
0167:0046904F
MOV DWORD [EBP-4C],00
0167:00469056 MOV
DWORD [EBP-64],09
0167:0046905D CALL EDI
0167:0046905F
LEA ECX,[EBP+FFFFFF7C]
0167:00469065 PUSH
ECX
0167:00469066 CALL `MSVBVM50!__vbaStrVarMove`
0167:0046906C MOV EDX,EAX <---EAX中為上面Call呼叫的返回值,為使用者名稱第1個字元
0167:0046906E
LEA ECX,[EBP-44]
0167:00469071 CALL
EBX
0167:00469073 MOV EAX,[ESI+38]
0167:00469076
LEA ECX,[EBP-44]
0167:00469079 PUSH
ECX
0167:0046907A PUSH EAX
0167:0046907B MOV
EDX,[EAX]
0167:0046907D CALL NEAR [EDX+1C]
0167:00469080
TEST EAX,EAX
0167:00469082 JNL 00469096
0167:00469084
MOV EDX,[ESI+38]
0167:00469087 PUSH
BYTE +1C
0167:00469089 PUSH DWORD 00411460
0167:0046908E
PUSH EDX
0167:0046908F PUSH EAX
0167:00469090
CALL `MSVBVM50!__vbaHresultCheckObj`
0167:00469096 LEA
ECX,[EBP-44]
0167:00469099 CALL `MSVBVM50!__vbaFreeStr`
0167:0046909F
LEA ECX,[EBP-4C]
0167:004690A2 CALL
`MSVBVM50!__vbaFreeObj`
0167:004690A8 LEA EAX,[EBP+FFFFFF7C]
0167:004690AE
LEA ECX,[EBP-74]
0167:004690B1 PUSH
EAX
0167:004690B2 LEA EDX,[EBP-64]
0167:004690B5
PUSH ECX
0167:004690B6 PUSH EDX
0167:004690B7
PUSH BYTE +03
0167:004690B9 CALL `MSVBVM50!__vbaFreeVarList`
0167:004690BF
ADD ESP,BYTE +10
0167:004690C2 PUSH
ESI
0167:004690C3 CALL NEAR [EBP+FFFFF804]
0167:004690C9
PUSH EAX
0167:004690CA LEA EAX,[EBP-4C]
0167:004690CD
PUSH EAX
0167:004690CE CALL `MSVBVM50!__vbaObjSet`
0167:004690D4
MOV EAX,[EBP-4C]
0167:004690D7 LEA
ECX,[EBP-64]
0167:004690DA PUSH BYTE +05
0167:004690DC
LEA EDX,[EBP-74]
0167:004690DF PUSH
ECX
0167:004690E0 PUSH EDX
0167:004690E1 MOV
DWORD [EBP-4C],00
0167:004690E8 MOV
[EBP-5C],EAX
0167:004690EB MOV DWORD [EBP-64],09
0167:004690F2
CALL `MSVBVM50!rtcLeftCharVar`
0167:004690F8 LEA
EAX,[EBP-74]
0167:004690FB PUSH EAX
0167:004690FC
CALL `MSVBVM50!__vbaStrVarMove`
0167:00469102 MOV
EDX,EAX
0167:00469104 LEA ECX,[EBP-44]
0167:00469107
CALL EBX
0167:00469109 MOV EAX,[ESI+38]
0167:0046910C
LEA EDX,[EBP-48]
0167:0046910F PUSH
EDX
0167:00469110 LEA EDX,[EBP-44]
0167:00469113
MOV ECX,[EAX]
0167:00469115 PUSH
EDX
0167:00469116 PUSH EAX
0167:00469117 CALL
NEAR [ECX+20] <---根據字元值計算得到一串值
0167:0046911A
TEST EAX,EAX
0167:0046911C JNL 00469130
0167:0046911E
MOV ECX,[ESI+38]
0167:00469121 PUSH
BYTE +20
0167:00469123 PUSH DWORD 00411460
0167:00469128
PUSH ECX
0167:00469129 PUSH EAX
0167:0046912A
CALL `MSVBVM50!__vbaHresultCheckObj`
0167:00469130 MOV
EDX,[EBP-48] <---[EBP-48]中為根據字元計算得到的值
0167:00469133
LEA ECX,[EBP-30]
0167:00469136 MOV
DWORD [EBP-48],00
0167:0046913D CALL EBX
0167:0046913F
LEA ECX,[EBP-44]
0167:00469142 CALL
`MSVBVM50!__vbaFreeStr`
0167:00469148 LEA ECX,[EBP-4C]
0167:0046914B
CALL `MSVBVM50!__vbaFreeObj`
0167:00469151 LEA
EDX,[EBP-74]
0167:00469154 LEA EAX,[EBP-64]
0167:00469157
PUSH EDX
0167:00469158 PUSH EAX
0167:00469159
PUSH BYTE +02
0167:0046915B CALL `MSVBVM50!__vbaFreeVarList`
0167:00469161
MOV EAX,01 <---EAX=1
0167:00469166
ADD ESP,BYTE +0C
0167:00469169 ADD
AX,[EBP-20] <---計數器加1
0167:0046916D JO
NEAR 0046B040
0167:00469173 MOV
[EBP-20],EAX
0167:00469176 JMP 00469004
-------------第一個大迴圈結束---------------------
我的使用者名稱為6位,所以程式在此迴圈6次,得到6組字元
?
N i ? Q
W b ) W f
P x @ P 7
2 i ; 2 l
& A 3 & E
P x
@ P 7
這些是怎麼算出來的呢,有興趣的話跟進上面的那個Call進去看看,我跟了一下,功力不夠
不能詳細的分析出來,所以不寫了。好像是字元值分別與固定串的前五位"4
B E 3 4"計算然後查表得到
在那個Call裡面看到的表如下:
8 x 3 p 7 B e a
b c d f g h i
j
k l m n o q r s
t u v w y z A C
D E F G H I J K
L M N O P Q R
S
T U V W X Y Z .
1 2 4 6 5 9 0 -
` # / \ ! @ $ <
> & *
( ) [ ] {
} ' ; : , ? = +
後面還有一行記不清了,我是用手抄的太亂。誰知道TRW中如何將暫存器中的表值抓圖抓下來
這些字串幹什麼用呢,接著往後看....
0167:0046917B
MOV EDX,[EBP-30] <---使用者名稱字元取完後跳到這
0167:0046917E
LEA ECX,[EBP-1C]
0167:00469181 CALL
`MSVBVM50!__vbaStrCopy`
0167:00469187 MOV ECX,[EBP-1C]
<---[EBP-1C]中為最後1個字元運算得到的字串
0167:0046918A PUSH
ECX
0167:0046918B CALL `MSVBVM50!__vbaLenBstr`
0167:00469191
MOV ESI,EAX
0167:00469193 PUSH
BYTE +00
0167:00469195 MOV EDX,ESI
0167:00469197
LEA EAX,[EBP-18]
0167:0046919A DEC
EDX
0167:0046919B MOV [EBP-24],ESI
0167:0046919E
JO NEAR 0046B040
0167:004691A4 PUSH
EDX
0167:004691A5 PUSH BYTE +01
0167:004691A7
PUSH BYTE +00
0167:004691A9 PUSH EAX
0167:004691AA
PUSH BYTE +01
0167:004691AC PUSH BYTE
+00
0167:004691AE CALL `MSVBVM50!__vbaRedim`
0167:004691B4
MOV ECX,ESI
0167:004691B6 ADD
ESP,BYTE +1C
0167:004691B9 DEC ECX
0167:004691BA
JO NEAR 0046B040
0167:004691C0 CALL
`MSVBVM50!__vbaI2I4`
0167:004691C6 MOV [EBP+FFFFF854],EAX
0167:004691CC
XOR ESI,ESI <---ESI=0
----------------第2個大迴圈-------------------
0167:004691CE CMP
SI,[EBP+FFFFF854] <---[EBP+FFFFF854]中為字串長度
0167:004691D5 JG
NEAR 004692BB 比較是否取完字串
0167:004691DB
MOV AX,SI
0167:004691DE LEA ECX,[EBP-1C]
<---ECX=[EBP-1C]為最後一個字元運算得到的字串
0167:004691E1 INC
AX
0167:004691E3 MOV [EBP+FFFFFAF4],ECX
0167:004691E9
JO NEAR 0046B040
0167:004691EF LEA
EDX,[EBP-64]
0167:004691F2 MOV DWORD
[EBP-5C],01
0167:004691F9 MOVSX ECX,AX
0167:004691FC
PUSH EDX
0167:004691FD LEA EDX,[EBP+FFFFFAEC]
0167:00469203
PUSH ECX
0167:00469204 LEA EAX,[EBP-74]
0167:00469207
PUSH EDX
0167:00469208 PUSH EAX
0167:00469209
MOV DWORD [EBP-64],02
0167:00469210 MOV
DWORD [EBP+FFFFFAEC],4008
0167:0046921A CALL
EDI
0167:0046921C MOV EAX,[EBP-18]
0167:0046921F
TEST EAX,EAX
0167:00469221 JZ
00469252
0167:00469223 CMP WORD [EAX],BYTE +01
0167:00469227
JNZ 00469252
0167:00469229 MOV
EDX,[EAX+14]
0167:0046922C MOVSX ECX,SI
0167:0046922F
SUB ECX,EDX
0167:00469231 MOV
EDX,[EAX+10]
0167:00469234 CMP ECX,EDX
0167:00469236
MOV [EBP+FFFFF878],ECX
0167:0046923C JC
0046924A
0167:0046923E CALL `MSVBVM50!__vbaGenerateBoundsError`
0167:00469244
MOV ECX,[EBP+FFFFF878]
0167:0046924A MOV
[EBP+FFFFF7FC],ECX
0167:00469250 JMP SHORT
0046925E
0167:00469252 CALL `MSVBVM50!__vbaGenerateBoundsError`
0167:00469258
MOV [EBP+FFFFF7FC],EAX
0167:0046925E LEA
ECX,[EBP-74]
0167:00469261 LEA EDX,[EBP-44]
0167:00469264
PUSH ECX
0167:00469265 PUSH EDX
0167:00469266
CALL `MSVBVM50!__vbaStrVarVal`
0167:0046926C PUSH
EAX <---EAX中為上面的Call的返回值為字串第1個字元
0167:0046926D CALL
`MSVBVM50!rtcAnsivalueBstr`
0167:00469273 MOV
ECX,EAX <---ECX=EAX=字元的Hex值
0167:00469275 CALL
`MSVBVM50!__vbaUI1I2`
0167:0046927B MOV ECX,[EBP-18]
0167:0046927E
MOV EDX,[ECX+0C]
0167:00469281 MOV
ECX,[EBP+FFFFF7FC]
0167:00469287 MOV [EDX+ECX],AL
<---將字元的值存到[EDX+ECX]中
0167:0046928A LEA ECX,[EBP-44]
0167:0046928D
CALL `MSVBVM50!__vbaFreeStr`
0167:00469293 LEA
EDX,[EBP-74]
0167:00469296 LEA EAX,[EBP-64]
0167:00469299
PUSH EDX
0167:0046929A PUSH EAX
0167:0046929B
PUSH BYTE +02
0167:0046929D CALL `MSVBVM50!__vbaFreeVarList`
0167:004692A3
MOV EAX,01 <---EAX=1
0167:004692A8
ADD ESP,BYTE +0C
0167:004692AB ADD
AX,SI <---計數器加1
0167:004692AE JO
NEAR 0046B040
0167:004692B4 MOV ESI,EAX
0167:004692B6
JMP 004691CE
---------------第2個大迴圈結束--------------------
上面這段程式其實就是把雙字字串轉換為單字字串存到[EDX]起的地址處
0167:004692BB
MOV ECX,[EBP-24]
0167:004692BE DEC
ECX
0167:004692BF JO NEAR 0046B040
0167:004692C5
CALL `MSVBVM50!__vbaI2I4`
0167:004692CB MOV
[EBP+FFFFF84C],EAX
0167:004692D1 XOR ESI,ESI
---------------第3個大迴圈--------------------
0167:004692D3
CMP SI,[EBP+FFFFF84C] <---[EBP+FFFFF84C]中為轉換後的字串長度
0167:004692DA
MOV [EBP-20],ESI
比較是否取完字串
0167:004692DD JG NEAR 004693C0
0167:004692E3
MOV ECX,[EBP-18]
0167:004692E6 LEA
EDX,[EBP-40]
0167:004692E9 PUSH ECX
0167:004692EA
PUSH EDX
0167:004692EB CALL `MSVBVM50!__vbaAryLock`
0167:004692F1
MOV ECX,[EBP-40]
0167:004692F4 TEST
ECX,ECX
0167:004692F6 JZ 0046931E
0167:004692F8
CMP WORD [ECX],BYTE +01
0167:004692FC JNZ
0046931E
0167:004692FE MOVSX ESI,WORD [EBP-20]
0167:00469302
MOV EDX,[ECX+14]
0167:00469305 MOV
EAX,[ECX+10]
0167:00469308 SUB ESI,EDX
0167:0046930A
CMP ESI,EAX
0167:0046930C JC
00469317
0167:0046930E CALL `MSVBVM50!__vbaGenerateBoundsError`
0167:00469314
MOV ECX,[EBP-40]
0167:00469317 MOV
EAX,ESI
0167:00469319 MOV ESI,[EBP-20]
0167:0046931C
JMP SHORT 00469327
0167:0046931E CALL
`MSVBVM50!__vbaGenerateBoundsError`
0167:00469324 MOV
ECX,[EBP-40]
0167:00469327 MOV ECX,[ECX+0C]
0167:0046932A
LEA EDX,[EBP+FFFFFAEC]
0167:00469330 ADD
ECX,EAX
0167:00469332 LEA EAX,[EBP-64]
0167:00469335
PUSH EDX
0167:00469336 PUSH EAX
0167:00469337
MOV [EBP+FFFFFAF4],ECX
0167:0046933D MOV
DWORD [EBP+FFFFFAEC],4011
0167:00469347 CALL
`MSVBVM50!rtcHexVarFromVar` <---這個Call應該是取字元的Hex值吧
0167:0046934D LEA
ECX,[EBP-40]
0167:00469350 PUSH ECX
0167:00469351
CALL `MSVBVM50!__vbaAryUnlock`
0167:00469357 LEA
EDX,[EBP-64]
0167:0046935A PUSH EDX
0167:0046935B
CALL `MSVBVM50!__vbaStrVarMove`
0167:00469361 MOV
EDX,EAX <---EAX中為字元的Hex值,為雙字形式
0167:00469363
LEA ECX,[EBP-3C]
0167:00469366 CALL
EBX
0167:00469368 LEA ECX,[EBP-64]
0167:0046936B
CALL `MSVBVM50!__vbaFreeVar`
0167:00469371 MOV
EAX,[EBP-3C]
0167:00469374 PUSH EAX
0167:00469375
CALL `MSVBVM50!__vbaLenBstr`
0167:0046937B CMP
EAX,BYTE +01
0167:0046937E JNZ 00469396
0167:00469380
MOV ECX,[EBP-3C]
0167:00469383 PUSH
DWORD 0040F4B8
0167:00469388 PUSH ECX
0167:00469389
CALL `MSVBVM50!__vbaStrCat`
0167:0046938F MOV
EDX,EAX
0167:00469391 LEA ECX,[EBP-3C]
0167:00469394
CALL EBX
0167:00469396 MOV EDX,[EBP-2C]
0167:00469399
MOV EAX,[EBP-3C]
0167:0046939C PUSH
EDX
0167:0046939D PUSH EAX
0167:0046939E CALL
`MSVBVM50!__vbaStrCat` <此Call將轉換後的字串的Hex值連在一
0167:004693A4
MOV EDX,EAX
起組成一個雙字字串,返回值在EAX中
0167:004693A6 LEA ECX,[EBP-2C]
0167:004693A9
CALL EBX
0167:004693AB MOV EAX,01
<---EAX=01
0167:004693B0 ADD AX,SI
<---計數器加1
0167:004693B3 JO
NEAR 0046B040
0167:004693B9 MOV ESI,EAX
0167:004693BB
JMP 004692D3
---------------第3個大迴圈結束--------------------
真是服了作者了,這樣來考驗Cracker的耐心,上面這段迴圈將轉換後的字串"Px@P7"用
它們的Hex值連成一個雙字字串"5
0 7 8 4 0 5 0 3 7"
0167:004693C0 MOV
ECX,[EBP-2C]
0167:004693C3 PUSH ECX
0167:004693C4
CALL `MSVBVM50!__vbaLenBstr` <--求轉換後的雙字字串長度
0167:004693CA
MOV ECX,EAX
0167:004693CC CALL
`MSVBVM50!__vbaI2I4`
0167:004693D2 MOV ESI,[0048260C]
0167:004693D8
MOV [EBP+FFFFF844],EAX
0167:004693DE MOV
DWORD [EBP-20],01
0167:004693E5 MOV EAX,[EBP-20]
---------------第4個大迴圈--------------------
0167:004693E8
CMP AX,[EBP+FFFFF844] <--[EBP+FFFFF844]中為字串長度
0167:004693EF
JG NEAR 00469617 比較是否取完字串
0167:004693F5
CWD
0167:004693F7 MOV CX,03
<---CX=03
0167:004693FB IDIV
CX
0167:004693FE TEST DX,DX
<---其實就是對字串的第3 6 9位採取不同的處理
0167:00469401 JNZ
00469468
0167:00469403
MOV EDX,[EBP-28]
0167:00469406 LEA
EAX,[EBP-2C]
0167:00469409 MOV [EBP+FFFFFAD4],EDX
0167:0046940F
LEA ECX,[EBP-64]
0167:00469412 MOVSX
EDX,WORD [EBP-20]
0167:00469416 MOV [EBP+FFFFFAF4],EAX
0167:0046941C
PUSH ECX
0167:0046941D LEA EAX,[EBP+FFFFFAEC]
0167:00469423
PUSH EDX
0167:00469424 LEA ECX,[EBP-74]
0167:00469427
PUSH EAX
0167:00469428 PUSH ECX
0167:00469429
MOV DWORD [EBP+FFFFFACC],08
0167:00469433 MOV
DWORD [EBP-5C],01
0167:0046943A MOV
DWORD [EBP-64],02
0167:00469441 MOV DWORD [EBP+FFFFFAEC],4008
0167:0046944B
CALL EDI
0167:0046944D LEA EDX,[EBP-74]
0167:00469450
LEA EAX,[EBP-44]
0167:00469453 PUSH
EDX
0167:00469454 PUSH EAX
0167:00469455 CALL
`MSVBVM50!__vbaStrVarVal` <--按位取字串中的每位
0167:0046945B PUSH
EAX
0167:0046945C CALL
`MSVBVM50!rtcAnsivalueBstr`<--求每個字元的Hex值
0167:00469462
ADD AX,12 <---AX=AX+12
對第3 6 9位的Hex加12
0167:00469466 JMP SHORT 004694E1
0167:00469468
MOV AX,[EBP-20]
0167:0046946C MOV
CX,07 <---CX=7
0167:00469470 CWD
0167:00469472 IDIV CX
0167:00469475 TEST
DX,DX <---對字串的第7位採取不同的處理
0167:00469478
JNZ NEAR 00469541
0167:0046947E MOV
EDX,[EBP-28]
0167:00469481 LEA EAX,[EBP-2C]
0167:00469484
MOV [EBP+FFFFFAD4],EDX
0167:0046948A LEA
ECX,[EBP-64]
0167:0046948D MOVSX EDX,WORD [EBP-20]
0167:00469491
MOV [EBP+FFFFFAF4],EAX
0167:00469497 PUSH
ECX
0167:00469498 LEA EAX,[EBP+FFFFFAEC]
0167:0046949E
PUSH EDX
0167:0046949F LEA ECX,[EBP-74]
0167:004694A2
PUSH EAX
0167:004694A3 PUSH ECX
0167:004694A4
MOV DWORD [EBP+FFFFFACC],08
0167:004694AE MOV
DWORD [EBP-5C],01
0167:004694B5 MOV
DWORD [EBP-64],02
0167:004694BC MOV DWORD [EBP+FFFFFAEC],4008
0167:004694C6
CALL EDI
0167:004694C8 LEA EDX,[EBP-74]
0167:004694CB
LEA EAX,[EBP-44]
0167:004694CE PUSH
EDX
0167:004694CF PUSH EAX
0167:004694D0 CALL
`MSVBVM50!__vbaStrVarVal`
0167:004694D6 PUSH
EAX
0167:004694D7 CALL `MSVBVM50!rtcAnsivalueBstr`
0167:004694DD
ADD AX,14 <---AX=AX+14
對字串的第7位的Hex值加14
0167:004694E1 JO NEAR 0046B040
0167:004694E7
MOVSX ECX,AX
0167:004694EA LEA EDX,[EBP+FFFFFF7C]
0167:004694F0
PUSH ECX
0167:004694F1 PUSH EDX
0167:004694F2
CALL `MSVBVM50!rtcVarBstrFromAnsi`
0167:004694F8 LEA
EAX,[EBP+FFFFFACC]
0167:004694FE LEA
ECX,[EBP+FFFFFF7C]
0167:00469504 PUSH EAX
0167:00469505
LEA EDX,[EBP+FFFFFF6C]
0167:0046950B PUSH
ECX
0167:0046950C PUSH EDX
0167:0046950D CALL
ESI
0167:0046950F PUSH EAX
0167:00469510
CALL `MSVBVM50!__vbaStrVarMove`
0167:00469516 MOV
EDX,EAX
0167:00469518 LEA ECX,[EBP-28]
0167:0046951B
CALL EBX
0167:0046951D LEA ECX,[EBP-44]
0167:00469520
CALL `MSVBVM50!__vbaFreeStr`
0167:00469526 LEA
EAX,[EBP+FFFFFF6C]
0167:0046952C LEA ECX,[EBP+FFFFFF7C]
0167:00469532
PUSH EAX
0167:00469533 LEA EDX,[EBP-74]
0167:00469536
PUSH ECX
0167:00469537 LEA EAX,[EBP-64]
0167:0046953A
PUSH EDX
0167:0046953B PUSH EAX
0167:0046953C
JMP 004695F5
0167:00469541 MOV
ECX,[EBP-28]
0167:00469544 LEA EDX,[EBP-2C]
0167:00469547
MOV [EBP+FFFFFAD4],ECX
0167:0046954D LEA
EAX,[EBP-64]
0167:00469550 MOVSX ECX,WORD [EBP-20]
0167:00469554
MOV [EBP+FFFFFAF4],EDX
0167:0046955A PUSH
EAX
0167:0046955B LEA EDX,[EBP+FFFFFAEC]
0167:00469561
PUSH ECX
0167:00469562 LEA EAX,[EBP-74]
0167:00469565
PUSH EDX
0167:00469566 PUSH EAX
0167:00469567
MOV DWORD [EBP+FFFFFACC],08
0167:00469571 MOV
DWORD [EBP-5C],01
0167:00469578 MOV
DWORD [EBP-64],02
0167:0046957F MOV DWORD [EBP+FFFFFAEC],4008
0167:00469589
CALL EDI
0167:0046958B LEA ECX,[EBP-74]
0167:0046958E
LEA EDX,[EBP-44]
0167:00469591 PUSH
ECX
0167:00469592 PUSH EDX
0167:00469593 CALL
`MSVBVM50!__vbaStrVarVal`
0167:00469599 PUSH
EAX
0167:0046959A CALL `MSVBVM50!rtcAnsivalueBstr`
0167:004695A0
MOVSX EAX,AX
0167:004695A3 LEA ECX,[EBP+FFFFFF7C]
0167:004695A9
PUSH EAX
0167:004695AA PUSH ECX
0167:004695AB
CALL `MSVBVM50!rtcVarBstrFromAnsi`
0167:004695B1 LEA
EDX,[EBP+FFFFFACC]
0167:004695B7 LEA
EAX,[EBP+FFFFFF7C]
0167:004695BD PUSH EDX
0167:004695BE
LEA ECX,[EBP+FFFFFF6C]
0167:004695C4 PUSH
EAX
0167:004695C5 PUSH ECX
0167:004695C6 CALL
ESI
0167:004695C8 PUSH EAX
0167:004695C9
CALL `MSVBVM50!__vbaStrVarMove`
0167:004695CF MOV
EDX,EAX <---此時D EDX可看到連結在一起的新字串
0167:004695D1
LEA ECX,[EBP-28]
0167:004695D4 CALL
EBX
0167:004695D6 LEA ECX,[EBP-44]
0167:004695D9
CALL `MSVBVM50!__vbaFreeStr`
0167:004695DF LEA
EDX,[EBP+FFFFFF6C]
0167:004695E5 LEA EAX,[EBP+FFFFFF7C]
0167:004695EB
PUSH EDX
0167:004695EC LEA ECX,[EBP-74]
0167:004695EF
PUSH EAX
0167:004695F0 LEA EDX,[EBP-64]
0167:004695F3
PUSH ECX
0167:004695F4 PUSH EDX
0167:004695F5
PUSH BYTE +04
0167:004695F7 CALL `MSVBVM50!__vbaFreeVarList`
0167:004695FD
MOV EAX,01 <---EAX=1
0167:00469602
ADD ESP,BYTE +14
0167:00469605 ADD
AX,[EBP-20] <---計數器加1
0167:00469609 JO
NEAR 0046B040
0167:0046960F MOV [EBP-20],EAX
0167:00469612
JMP 004693E8
---------------第4個大迴圈結束--------------------
上面的迴圈對第3迴圈後的字串"5
0 7 8 4 0 5 0 3 7"再進行處理,
即對第3 6 9位Hex值加12,第7位Hex值加14,其餘位不變,組成新的字串為
"5
0 I 8 4 B I 0 E 7"
0167:00469617 MOV
EAX,[EBP-28]
0167:0046961A PUSH EAX
0167:0046961B
CALL `MSVBVM50!__vbaLenBstr` <---求字串長度
0167:00469621
CMP EAX,BYTE +05
0167:00469624 JNG NEAR 00469730
0167:0046962A
MOV ECX,[EBP-38]
0167:0046962D LEA
EDX,[EBP-28]
0167:00469630 LEA EAX,[EBP-64]
0167:00469633
MOV [EBP+FFFFFAD4],ECX
0167:00469639 MOV
[EBP+FFFFFAF4],EDX
0167:0046963F PUSH EAX
0167:00469640
LEA ECX,[EBP+FFFFFAEC]
0167:00469646 PUSH
BYTE +01
0167:00469648 LEA EDX,[EBP-74]
0167:0046964B
PUSH ECX
0167:0046964C PUSH EDX
0167:0046964D
MOV DWORD [EBP+FFFFFACC],08
0167:00469657 MOV
DWORD [EBP-5C],05
0167:0046965E MOV
DWORD [EBP-64],02
0167:00469665 MOV DWORD [EBP+FFFFFAEC],4008
0167:0046966F
CALL EDI
0167:00469671 LEA EAX,[EBP+FFFFFACC]
0167:00469677
LEA ECX,[EBP-74]
0167:0046967A PUSH
EAX
0167:0046967B LEA EDX,[EBP+FFFFFF7C]
0167:00469681
PUSH ECX
0167:00469682 PUSH EDX
0167:00469683
MOV DWORD [EBP+FFFFFAC4],0041144C <--0041144C中的為"-"
0167:0046968D
MOV DWORD [EBP+FFFFFABC],08
0167:00469697 CALL
ESI
0167:00469699 PUSH EAX
0167:0046969A
LEA EAX,[EBP+FFFFFABC]
0167:004696A0 LEA
ECX,[EBP+FFFFFF6C]
0167:004696A6 PUSH EAX
0167:004696A7
PUSH ECX
0167:004696A8 CALL ESI
0167:004696AA
PUSH EAX
0167:004696AB CALL `MSVBVM50!__vbaStrVarMove`
0167:004696B1
MOV EDX,EAX
0167:004696B3 LEA
ECX,[EBP-38]
0167:004696B6 CALL EBX
0167:004696B8
LEA EDX,[EBP+FFFFFF6C]
0167:004696BE LEA
EAX,[EBP+FFFFFF7C]
0167:004696C4 PUSH EDX
0167:004696C5
LEA ECX,[EBP-74]
0167:004696C8 PUSH
EAX
0167:004696C9 LEA EDX,[EBP-64]
0167:004696CC
PUSH ECX
0167:004696CD PUSH EDX
0167:004696CE
PUSH BYTE +04
0167:004696D0 CALL `MSVBVM50!__vbaFreeVarList`
0167:004696D6
MOV ECX,[EBP-28]
0167:004696D9 ADD
ESP,BYTE +14
0167:004696DC LEA EAX,[EBP-28]
0167:004696DF
MOV DWORD [EBP+FFFFFAEC],4008
0167:004696E9 PUSH
ECX
0167:004696EA MOV [EBP+FFFFFAF4],EAX
0167:004696F0
CALL `MSVBVM50!__vbaLenBstr`
0167:004696F6 SUB
EAX,BYTE +05
0167:004696F9 LEA EDX,[EBP+FFFFFAEC]
0167:004696FF
JO NEAR 0046B040
0167:00469705 PUSH
EAX
0167:00469706 LEA EAX,[EBP-64]
0167:00469709
PUSH EDX
0167:0046970A PUSH EAX
0167:0046970B
CALL `MSVBVM50!rtcRightCharVar`
0167:00469711 LEA
ECX,[EBP-64]
0167:00469714 PUSH ECX
0167:00469715
CALL `MSVBVM50!__vbaStrVarMove`
0167:0046971B MOV
EDX,EAX <---D EAX可看到註冊碼的前半部分
0167:0046971D
LEA ECX,[EBP-28] 字串"5
0 I 8 4 -"
0167:00469720 CALL EBX
0167:00469722
LEA ECX,[EBP-64]
0167:00469725 CALL
`MSVBVM50!__vbaFreeVar`
0167:0046972B JMP 00469617
<--00469617程式碼中沒有這行啦,可一執行就有了,怎麼實現的?
0167:00469730 MOV
EDX,[EBP-38] <---註冊碼的前半部分"50I84-"
0167:00469733
MOV EAX,[EBP-28] <---註冊碼的前半部分"BI0E7"
0167:00469736
PUSH EDX
0167:00469737 PUSH EAX
0167:00469738
CALL `MSVBVM50!__vbaStrCat` <---連線字串
0167:0046973E
MOV EDX,EAX <---D EDX即可看到正確的註冊碼
0167:00469740
LEA ECX,[EBP-38]
0167:00469743 CALL
EBX
0167:00469745 PUSH DWORD 2710
0167:0046974A
CALL 004203B0
0167:0046974F MOV ECX,[EBP+08]
後面還有好多操作,大概是解除未註冊最多隻能新增7張圖片來建立螢幕保護的限制,才執行到註冊成功與註冊失敗對話方塊,我看不太懂,就不貼出來了。寫得好累,不寫了,反正註冊碼已經跟出來了,各位如果有興趣的話自己跟一下看看吧!
多說兩句,這個軟體破得真是辛苦,因為沒學過VB,所以其中許多Call呼叫一下子沒能看明白,上面還有許多沒註釋,其實是自己不知道該如何說明。還有第1個大迴圈中的0167:00469117
CALL NEAR [ECX+20],跟進去看得一頭霧水,還請各位大俠跟一下看看,以解小弟心頭之惑。唉!真的要好好學學VB了。
註冊碼其實只與使用者名稱的最後一位有關,它是根據使用者名稱的最後一位與固定串"4BE43-BI3G8"的前5位運算再加以轉換得到註冊碼。我的註冊碼只要使用者名稱最後一位為"e"應該都可以用。
我得到的為:
使用者名稱:ShenGe
註冊碼:50I84-BI0E7
---------------------------------ShenGe------------------------------------
貼個笑話,輕鬆一下吧!
孔子的補習班
話說,很久很久以前,有位老兄名叫孔子開了中國史上最大的補習班,影響後世深遠,補習班制度完備,對補習費有詳細規定:
十五志而學:要進補習班,要交十五兩作為報名費。
三十而立:交三十兩的人,只能站著聽課。
四十不惑:交四十兩,老師上課會講到讓你沒有問題為止。
五十知天命:交五十兩,還可以知道明天小考的命題。
六十耳順:交六十兩除了上述優待之外,老師還會講得讓你聽得很舒服。
七十從心所欲:交七十兩的話,上課時隨便你要站著、坐著、趴著、滾來滾去,都不會管你。
相關文章
- 金鋒螢幕保護程式2.0破解2015-11-15
- 夢想CMS(lmxcms)1.4 簡要分析2024-10-15
- Mac簡單時鐘螢幕保護程式2020-10-12Mac
- 呼叫系統螢幕保護 (轉)2007-12-13
- 智取螢幕保護密碼(轉)2007-08-11密碼
- w10螢幕保護怎麼取消_win10關閉螢幕保護的方法2020-02-14Win10
- 在桌面上建立螢幕保護程式圖示(轉)2007-08-12
- Aerial for Mac鳥瞰螢幕保護程式2020-11-23Mac
- 螢幕保護控制工具:ScreenSaverNow for Mac2023-04-11Mac
- 用VB製作螢幕保護程式 (轉)2007-12-10
- 利用VB編寫螢幕保護程式 (轉)2007-12-07
- 讓應用程式禁止Windows螢幕保護 (轉)2007-12-07Windows
- iOS-圖片水印,圖片裁剪和螢幕截圖2016-09-23iOS
- Aerial for Mac(mac最美的鳥瞰螢幕保護程式)2022-07-18Mac
- 螢幕設定成淺綠色可以保護眼睛2008-04-16
- 用C#Builder編寫螢幕保護程式 (轉)2008-01-31UI
- 破解EXCLE保護2010-06-05
- win10螢幕保護時間怎麼設定2021-02-27Win10
- Aerial for Mac(mac高畫質鳥瞰螢幕保護程式)2023-05-15Mac
- win10系統怎麼設定螢幕保護?2016-08-16Win10
- 從任務通知區啟動螢幕保護程式(轉)2007-07-28
- 從任務通知區啟動螢幕保護程式 (轉)2007-12-04
- Access Animation破解的簡要分析2003-05-10
- 保護您的Flutter應用程式:實現隱私螢幕2023-09-19Flutter
- CAD夢想畫圖產品簡介2021-05-18
- 設定背景圖片鋪滿整個螢幕2019-02-14
- BMP圖片的複製#顯示到螢幕2024-05-14
- 微信小程式中圖片佔滿整個螢幕2018-12-04微信小程式
- Word Clock for Mac(mac螢幕保護軟體) v1.0.7啟用版2021-02-09Mac
- 直播app開發,螢幕效果與圖片的處理2022-02-17APP
- 破解Word檔案密碼保護的簡單方法(轉)2007-08-12密碼
- PPT製作電視螢幕播放圖片滾動動畫教程2020-10-22動畫
- 圖片大小自適應手機螢幕程式碼例項2017-03-14
- Android根據螢幕寬度,按比例縮放圖片2015-07-25Android
- BMP格式圖片縮放及在LCD螢幕展示練習2024-05-12
- 如何破解Word文件密碼保護2017-01-16密碼
- EXCEL工作表保護密碼破解2010-06-01Excel密碼
- 簡單演算法---A Speeder
V2.5破解的簡要分析!2015-11-15演算法