【软件名称】:美萍反黄专家V4.5(标准版)
【软件限制】:进入美萍反黄专家系统设置时需要密码验证。
【破解声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【操作系统】:Win98
【破解工具】:TRW OllyDbg
【破解的人】:二点 (BrOKeN)
【前面的话】:这是我第一篇破文,也是我的第一次算法分析,由于以前没什么经验,所以分析美萍反黄专家算法花了我不少于10小时的时间,但是由于精力有限,最后还是没有完全分析它的算法,在这个破解的过程中,我有想过要放弃,可是最后我还是大体上把这个算法了解了,做Cracker是一件很辛苦的差事,特别是做为一名不高明的Cracker,但是我想我,我们还是要把Crack
进行到底,这就是Cracker的执着。
【破解过程】:
该软件是用aspack加壳的,用aspackdie脱之,
而且该美萍反黄专家还会侦察trw,所以先用winhex打开美萍反黄专家查找trw和TRW,将其替换为空格。
这样就可以用TRW安心调试了。
【爆破】:
用TRW加载美萍反黄专家,调出密码验证框,输入假密码,CTRL+N回到TRW:
bpx getwindowtexta
CTRL+N回到密码验证框,按确定,没有反应,
再一次;
bpx getdlgitemtext
还是没有反应,
只好用:
bpx hmemcpy
CTRL+N回到密码验证框,按确定,拦截到断点。
执行 bd * 使断点失效,
开始按 F12,
若干次后看见已经来到 004*****
开始用 F10单步跟踪,
经过几个RET后来到这里:
00479C82 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
;EDX=我们输入的假密码,
00479C85 |. 8B15 DCF24700 MOV EDX,DWORD PTR DS:[47F2DC] ;EDX=真的密码,d
edx.
00479C8B |. E8 4CA3F8FF CALL UNPACKED.00403FDC
;真假比较
00479C90 |. 75 07 JNZ SHORT UNPACKED.00479C99
;不相等就跳,
用Winhex的编辑软件将75 07 改为 90 90,保存,输入任意密码就可以进入美萍反黄专家设置界面了,
进入设置界面后我们还可以看到变成***的密码,这可以就是真的密码了,虽然可以用***显示之类的看***的密码,不过这是否麻烦了一点,由于美萍反黄专家是用DELPHI写的,DELPHI里显示为***的密码框属性是这里的:
PasswordChar = '*'
用ResHack打开软件,查找
PasswordChar = '*'
将其删掉。
就可以显示原来真正的密码了,
经过上面的修改后,我们就有了一个可以看密码的美萍反黄专家了。
【算法不完全分析】
用OllyDbg加载美萍反黄专家,由上面我们已经知道,美萍反黄专家在启动后就把密码解密,并将密码放入到一位置,待到要进入设置输入密码时在拿出来比较。
所以用用OllyDbg加载美萍反黄专家后,按F7,F8单步跟踪,来到这里:
***********************************
0047AAC5 |. B1 01 MOV CL,1
0047AAC7 |. BA ACAC4700 MOV EDX,UNPACKED.0047ACAC
; ASCII "SOFTWARE\Mpsoft\killporn"
0047AACC |. E8 9752FDFF CALL UNPACKED.0044FD68
0047AAD1 |. 8B07 MOV EAX,DWORD PTR
DS:[EDI]
0047AAD3 |. BA D0AC4700 MOV EDX,UNPACKED.0047ACD0
; ASCII "SoftAbout"
;美萍反黄专家加密密码键值为SoftAbout。
0047AAD8 |. E8 9F59FDFF CALL UNPACKED.0045047C
0047AADD |. 84C0 TEST AL,AL
0047AADF |. 74 27 JE SHORT UNPACKED.0047AB08
0047AAE1 |. 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
0047AAE4 |. 8B07 MOV EAX,DWORD PTR
DS:[EDI]
0047AAE6 |. BA D0AC4700 MOV EDX,UNPACKED.0047ACD0
; ASCII "SoftAbout"
0047AAEB |. E8 F457FDFF CALL UNPACKED.004502E4
0047AAF0 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
**************************
最后来到这里,算法所在(①为第一次循环,②为二次循环):
0046AE2A |. BE 01000000 MOV ESI,1
0046AE2F |> 8BC6 /MOV EAX,ESI
;①EAX=ESI=1
;②EAX=ESI=2
0046AE31 |. 48 |DEC EAX
;①EAX
=EAX-1=0
;②EAX =EAX-1=1
0046AE32 |. C1E0 02 |SHL EAX,2
;①EAX =
0
;②EAX = 1<<2=4
0046AE35 |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
;①[EBP-4]=17c196c=加密密码,我这里是:ElOaFUx+2k==
0046AE38 |. 8D0402 |LEA EAX,DWORD PTR DS:[EDX+EAX]
;①EAX=0,将加密密码的地址入 EAX.
;②EAX=4,将第五个加密密码开始的地址
入EAX,
0046AE3B |. 8BD3 |MOV EDX,EBX
;②原EBX=0075FDCC,[EBX]=04
25 0E 1A
0046AE3D |. B9 04000000 |MOV ECX,4
0046AE42 |. E8 457AF9FF |CALL UNPACKED.0040288C
0046AE47 |. 8A03 |MOV AL,BYTE PTR
DS:[EBX] ;①EBX--> 加过的密码,取第一个加密密码,这里是E(45).
;②[EBX]=F(46)
0046AE49 |. 3C 40 |CMP AL,40
;①和40比较,小于或等于就跳,这里[EBX]=E(45)>40,不跳
;②46>40不跳
0046AE4B |. 76 09 |JBE SHORT UNPACKED.0046AE56
0046AE4D |. 3C 5B |CMP AL,5B
;①和5B比较,小于或等于就跳,45<5B
;②46<5B,不跳
0046AE4F |. 73 05 |JNB SHORT UNPACKED.0046AE56
;①不小于跳,所以不跳.
0046AE51 |. 802B 41 |SUB BYTE PTR DS:[EBX],41
;①否则就减去41,[EBX]=45-41=4
;②[EBX]=46-41=5
0046AE54 |. EB 2A |JMP SHORT UNPACKED.0046AE80
;①②跳0046AE80-->
0046AE56 |> 8A03 |MOV AL,BYTE
PTR DS:[EBX]
0046AE58 |. 3C 60 |CMP AL,60
0046AE5A |. 76 09 |JBE SHORT UNPACKED.0046AE65
0046AE5C |. 3C 7B |CMP AL,7B
0046AE5E |. 73 05 |JNB SHORT UNPACKED.0046AE65
0046AE60 |. 802B 47 |SUB BYTE PTR DS:[EBX],
0046AE63 |. EB 1B |JMP SHORT UNPACKED.0046AE80
0046AE65 |> 8A03 |MOV AL,BYTE
PTR DS:[EBX]
0046AE67 |. 3C 2F |CMP AL,2F
0046AE69 |. 76 09 |JBE SHORT UNPACKED.0046AE74
0046AE6B |. 3C 3A |CMP AL,3A
0046AE6D |. 73 05 |JNB SHORT UNPACKED.0046AE74
0046AE6F |. 8003 04 |ADD BYTE PTR DS:[EBX],4
0046AE72 |. EB 0C |JMP SHORT UNPACKED.0046AE80
0046AE74 |> 3C 2B |CMP AL,2B
0046AE76 |. 75 05 |JNZ SHORT UNPACKED.0046AE7D
0046AE78 |. C603 3E |MOV BYTE PTR DS:[EBX],3E
0046AE7B |. EB 03 |JMP SHORT UNPACKED.0046AE80
0046AE7D |> C603 3F |MOV BYTE PTR DS:[EBX],3F
0046AE80 |> 8A43 01 |MOV AL,BYTE PTR DS:[EBX+1]
;①从0046AE54 跳来,取下一个码,[EBX+1]=l(6C)
;②取下一个码,[EBX+1]=U(55)
0046AE83 |. 3C 40 |CMP AL,40
;①和40比较,小于或等于就跳
0046AE85 |. 76 0A |JBE SHORT UNPACKED.0046AE91
;①6c>40,不跳
;②55>40,不跳
0046AE87 |. 3C 5B |CMP AL,5B
;①和5B比较,
0046AE89 |. 73 06 |JNB SHORT UNPACKED.0046AE91
;①6C>5B,所以跳0046AE91-->
;②55<5b,不跳
0046AE8B |. 806B 01 41 |SUB BYTE PTR DS:,41
;②[EBX+1]=55-41=14
0046AE8F |. EB 30 |JMP SHORT UNPACKED.0046AEC1
;②跳0046AEC1---- >
0046AE91 |> 8A43 01 |MOV AL,BYTE PTR DS:[EBX+1]
;①来自0046AE89
0046AE94 |. 3C 60 |CMP AL,60
;①和60比较,小于或等于就跳
0046AE96 |. 76 0A |JBE SHORT UNPACKED.0046AEA2
;①6c>60,不跳
0046AE98 |. 3C 7B |CMP AL,7B
;①和7B比较,不小于就跳
0046AE9A |. 73 06 |JNB SHORT UNPACKED.0046AEA2
;①6c<7B,不跳
0046AE9C |. 806B 01 47 |SUB BYTE PTR DS:[EBX+1],47
;①[EBX+1]=6C-47=25
0046AEA0 |. EB 1F |JMP SHORT UNPACKED.0046AEC1
:;①跳到0046AEC1。-->
0046AEA2 |> 8A43 01 |MOV AL,BYTE PTR DS:[EBX+1]
0046AEA5 |. 3C 2F |CMP AL,2F
0046AEA7 |. 76 0A |JBE SHORT UNPACKED.0046AEB3
0046AEA9 |. 3C 3A |CMP AL,3A
0046AEAB |. 73 06 |JNB SHORT UNPACKED.0046AEB3
0046AEAD |. 8043 01 04 |ADD BYTE PTR DS:[EBX+1],4
0046AEB1 |. EB 0E |JMP SHORT UNPACKED.0046AEC1
0046AEB3 |> 3C 2B |CMP AL,2B
0046AEB5 |. 75 06 |JNZ SHORT UNPACKED.0046AEBD
0046AEB7 |. C643 01 3E |MOV BYTE PTR DS:[EBX+1],3E
0046AEBB |. EB 04 |JMP SHORT UNPACKED.0046AEC1
0046AEBD |> C643 01 3F |MOV BYTE PTR DS:[EBX+1],3F
0046AEC1 |> 8A43 02 |MOV AL,BYTE PTR DS:[EBX+2]
;①从0046AEA0 跳来,取下一个密码,[EBX+2]=O(4F)
;②从0046AE8F跳来,[EBX+2]=x(78)
0046AEC4 |. 3C 40 |CMP AL,40
;①和40比较,小于或等于就跳
0046AEC6 |. 76 0A |JBE SHORT UNPACKED.0046AED2
;①4F>40,不跳,
;②78>40,不跳,
0046AEC8 |. 3C 5B |CMP AL,5B
;①和5B比较,
0046AECA |. 73 06 |JNB SHORT UNPACKED.0046AED2
;①4F<5B,不跳
;②78>5B,跳0046AED2----
>
0046AECC |. 806B 02 41 |SUB BYTE PTR DS:[EBX+2],41
;①[EBX+2]=4F-41=0E
0046AED0 |. EB 30 |JMP SHORT UNPACKED.0046AF02
;①跳到0046AF02-->
0046AED2 |> 8A43 02 |MOV AL,BYTE PTR DS:[EBX+2]
;②从0046AECA跳来。
0046AED5 |. 3C 60 |CMP AL,60
;②和60比较,小于或等于就跳
0046AED7 |. 76 0A |JBE SHORT UNPACKED.0046AEE3
;②78>60,不跳。
0046AED9 |. 3C 7B |CMP AL,7B
;②和7B比较,
0046AEDB |. 73 06 |JNB SHORT UNPACKED.0046AEE3
;②78<7B,不跳。
0046AEDD |. 806B 02 47 |SUB BYTE PTR DS:[EBX+2],47
;②[EBX+2]=78-47=31.
0046AEE1 |. EB 1F |JMP SHORT UNPACKED.0046AF02
;②跳0046AF02---->
0046AEE3 |> 8A43 02 |MOV AL,BYTE PTR DS:[EBX+2]
0046AEE6 |. 3C 2F |CMP AL,2F
0046AEE8 |. 76 0A |JBE SHORT UNPACKED.0046AEF4
0046AEEA |. 3C 3A |CMP AL,3A
0046AEEC |. 73 06 |JNB SHORT UNPACKED.0046AEF4
0046AEEE |. 8043 02 04 |ADD BYTE PTR DS:[EBX+2],4
0046AEF2 |. EB 0E |JMP SHORT UNPACKED.0046AF02
0046AEF4 |> 3C 2B |CMP AL,2B
0046AEF6 |. 75 06 |JNZ SHORT UNPACKED.0046AEFE
0046AEF8 |. C643 02 3E |MOV BYTE PTR DS:[EBX+2],3E
0046AEFC |. EB 04 |JMP SHORT UNPACKED.0046AF02
0046AEFE |> C643 02 3F |MOV BYTE PTR DS:[EBX+2],3F
0046AF02 |> 8A43 03 |MOV AL,BYTE PTR DS:[EBX+3]
;①0046AED0跳来,取第四个加密密码,[EBX+3]=a(61)
;②0046AEE1跳来,取第四个密码,[EBX+3]=+(2B)
0046AF05 |. 3C 40 |CMP AL,40
;①61>40,不跳
0046AF07 |. 76 0A |JBE SHORT UNPACKED.0046AF13
;②2B<40,跳0046AF13---->
0046AF09 |. 3C 5B |CMP AL,5B
0046AF0B |. 73 06 |JNB SHORT UNPACKED.0046AF13
;①61>5B,跳0046AF13-->
0046AF0D |. 806B 03 41 |SUB BYTE PTR DS:[EBX+3],41
0046AF11 |. EB 30 |JMP SHORT UNPACKED.0046AF43
0046AF13 |> 8A43 03 |MOV AL,BYTE PTR DS:[EBX+3]
;①0046AF0B跳来②0046AF07跳来
0046AF16 |. 3C 60 |CMP AL,60
0046AF18 |. 76 0A |JBE SHORT UNPACKED.0046AF24
;①61>60,不跳
;②2B<60,跳0046AF24---->
0046AF1A |. 3C 7B |CMP AL,7B
0046AF1C |. 73 06 |JNB SHORT UNPACKED.0046AF24
;①61<7B, 不跳
0046AF1E |. 806B 03 47 |SUB BYTE PTR DS:[EBX+3],47
;①[EBX+3]=61-47=1A
;①[EBX]=04 25 0E 1A
0046AF22 |. EB 1F |JMP SHORT UNPACKED.0046AF43
;①跳0046AF43-->
0046AF24 |> 8A43 03 |MOV AL,BYTE PTR DS:[EBX+3]
;②[EBX+3]=2B入AL
0046AF27 |. 3C 2F |CMP AL,2F
0046AF29 |. 76 0A |JBE SHORT UNPACKED.0046AF35
;②2B<2F,跳0046AF35---->
0046AF2B |. 3C 3A |CMP AL,3A
0046AF2D |. 73 06 |JNB SHORT UNPACKED.0046AF35
0046AF2F |. 8043 03 04 |ADD BYTE PTR DS:[EBX+3],4
0046AF33 |. EB 0E |JMP SHORT UNPACKED.0046AF43
0046AF35 |> 3C 2B |CMP AL,2B
;②0046AF29跳来。
0046AF37 |. 75 06 |JNZ SHORT UNPACKED.0046AF3F
;②AL=2b,不跳。
0046AF39 |. C643 03 3E |MOV BYTE PTR DS:[EBX+3],3E
;②将3E入[EBX+3]
0046AF3D |. EB 04 |JMP SHORT UNPACKED.0046AF43
;②跳0046AF43---->
0046AF3F |> C643 03 3F |MOV BYTE PTR DS:[EBX+3],3F
0046AF43 |> 8A13 |MOV DL,BYTE
PTR DS:[EBX] ;①从0046AF22来到这里,将[EBX]=4,入DL,DL=4
;②从0046AF3D来到这里,将[EBX]=5,入DL,DL=5
0046AF45 |. C1E2 02 |SHL EDX,2
;①EDX=(EBX+4=0076Fd04
)shl 2=1DBF410
;②EDX=(EBX+4=0076Fd05
)shl 2=1DBF414
0046AF48 |. 8A43 01 |MOV AL,BYTE PTR DS:[EBX+1]
;①[EBX+1]入AL,[EBX+1]=25
;②[EBX+1]入AL,[EBX+1]=14
0046AF4B |. 33C9 |XOR ECX,ECX
;①;②ECX清零,
0046AF4D |. 8AC8 |MOV CL,AL
;①CL=AL=25
;②CL=AL=14
0046AF4F |. C1E9 04 |SHR ECX,4
;①ECX=25 shr 4
=2
;②ECX=14 shr 4 =1
0046AF52 |. 80E1 03 |AND CL,3
;①2 and 3=2
;②1&3=1
0046AF55 |. 0AD1 |OR DL,CL
;①DL为EDX的低位=10,DL=10
or 2= 12
;②DL=14,DL=DL OR CL=14
0R 1 = 15
0046AF57 |. 8855 F1 |MOV BYTE PTR SS:[EBP-F],DL
;①将12入[EBP-F]
;②将15入[EBP-F]
0046AF5A |. C1E0 04 |SHL EAX,4
;①EAX=25,EAX=25
左移四位,EAX=25 shl 4=250
;②EAX=14 右移四位,EAX=140
0046AF5D |. 33D2 |XOR EDX,EDX
;①②EDX清零
0046AF5F |. 8A53 02 |MOV DL,BYTE PTR DS:[EBX+2]
;①[EBX+2]入DL,DL=[EBX+2]=0E
;②[EBX+2]入DL,DL=[EBX+2]=31
0046AF62 |. C1EA 02 |SHR EDX,2
;①EDX=0E>>2=03
;②EDX=31>>2=0C
0046AF65 |. 80E2 0F |AND DL,0F ;①取底位,EDX=03
;②取底位,EDX=0C
0046AF68 |. 0AC2 |OR AL,DL
;①EAX=253
;②AL = 0C OR 40=4C
0046AF6A |. 8845 F2 |MOV BYTE PTR SS:[EBP-E],AL
;①AL为EAX低位,所以AL=53,入[EBP-E]
;②AL=4C入[EBP-E]
0046AF6D |. 8A43 02 |MOV AL,BYTE PTR DS:[EBX+2]
;①[EBX+2]=0E;EAX=20E
;②[EBX+2]=31;EAX=131
0046AF70 |. C1E0 06 |SHL EAX,6
;①EAX=20E<<6=380
;②EAX=131<<6=4C40
0046AF73 |. 8A53 03 |MOV DL,BYTE PTR DS:[EBX+3]
;①[EBX+3]=1A入DL
;②①[EBX+3]=3E入DL
0046AF76 |. 80E2 3F |AND DL,3F
;①DL=1A&3F=1A
;②DL=3E &3F=3E
0046AF79 |. 0AC2 |OR AL,DL
;①AL=80,AL=80
or 1A=9A
;②AL=40,AL=40 OR 3E =
7E
0046AF7B |. 8845 F3 |MOV BYTE PTR SS:[EBP-D],AL
;①9A入[EBP-D]。[EBP-D]=9A 53 12 00 <--记住
;②7E入[EBP-D]。[EBP-D]=7E
4C 15 00 <--记住
0046AF7E |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]
;①将[EBP-8]入EAX
;②
0046AF81 |. E8 1691F9FF |CALL UNPACKED.0040409C
0046AF86 |. 8BD6 |MOV EDX,ESI
;①ESI=EDX=1
0046AF88 |. 4A |DEC EDX
0046AF89 |. 8D1452 |LEA EDX,DWORD PTR DS:[EDX+EDX*2]
0046AF8C |. 8D1410 |LEA EDX,DWORD PTR DS:[EAX+EDX]
0046AF8F |. 8D45 F1 |LEA EAX,DWORD PTR SS:[EBP-F]
;
0046AF92 |. B9 03000000 |MOV ECX,3
0046AF97 |. E8 F078F9FF |CALL UNPACKED.0040288C
0046AF9C |. 46 |INC ESI
0046AF9D |. 4F |DEC EDI
;①判断是否取完要取的字符。
0046AF9E |.^0F85 8BFEFFFF \JNZ UNPACKED.0046AE2F
;①没有就重新跳回去。
0046AFA4 |> 8B45 FC MOV EAX,DWORD PTR
SS:[EBP-4]
0046AFA7 |. E8 208FF9FF CALL UNPACKED.00403ECC
0046AFAC |. 85C0 TEST EAX,EAX
0046AFAE |. 0F84 83030000 JE UNPACKED.0046B337
0046AFB4 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0046AFB7 |. E8 108FF9FF CALL UNPACKED.00403ECC
0046AFBC |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
;②[EBP-4]=加密密码
0046AFBF |. 8D4402 FC LEA EAX,DWORD PTR DS:[EDX+EAX-4]
;②EAX=c,执行后EAX= "2k=="
0046AFC3 |. 8BD3 MOV EDX,EBX
0046AFC5 |. B9 04000000 MOV ECX,4
0046AFCA |. E8 BD78F9FF CALL UNPACKED.0040288C
0046AFCF |. 807B 02 3D CMP BYTE PTR DS:[EBX+2],3D ;②第三个是不是=
0046AFD3 |. 0F85 B1000000 JNZ UNPACKED.0046B08A
;②不是=就跳,所以这里不跳
0046AFD9 |. 8A03 MOV AL,BYTE PTR
DS:[EBX] ;②取第一个"2k=="的第一个这里为2(32)
0046AFDB |. 3C 40 CMP AL,40
;②和40=@比较,小于或等于就跳
0046AFDD |. 76 09 JBE SHORT UNPACKED.0046AFE8
;②32<40,所以跳0046AFE8---->
0046AFDF |. 3C 5B CMP AL,5B
0046AFE1 |. 73 05 JNB SHORT UNPACKED.0046AFE8
0046AFE3 |. 802B 41 SUB BYTE PTR DS:[EBX],41
0046AFE6 |. EB 2B JMP SHORT UNPACKED.0046B013
0046AFE8 |> 8A03 MOV AL,BYTE PTR
DS:[EBX] ;②从0046AFDD跳来,
0046AFEA |. 3C 60 CMP AL,60
;②和60比较
0046AFEC |. 76 09 JBE SHORT UNPACKED.0046AFF7
;②32<60,所以跳0046AFF7---->
0046AFEE |. 3C 7B CMP AL,7B
0046AFF0 |. 73 05 JNB SHORT UNPACKED.0046AFF7
0046AFF2 |. 802B 47 SUB BYTE PTR DS:[EBX],47
0046AFF5 |. EB 1C JMP SHORT UNPACKED.0046B013
0046AFF7 |> 803B 2F CMP BYTE PTR DS:[EBX],2F
;②从0046AFEC跳,
0046AFFA |. 76 0A JBE SHORT UNPACKED.0046B006
;②32>2F,不跳
0046AFFC |. 803B 3A CMP BYTE PTR DS:[EBX],3A
0046AFFF |. 73 05 JNB SHORT UNPACKED.0046B006
;②不小于跳,因为32<3A,所以不跳
0046B001 |. 8003 04 ADD BYTE PTR DS:[EBX],4
;②加上4,32+4=36,[EBX]=36
0046B004 |. EB 0D JMP SHORT UNPACKED.0046B013
;②继续跳0046B013-->
0046B006 |> 803B 2B CMP BYTE PTR DS:[EBX],2B
0046B009 |. 75 05 JNZ SHORT UNPACKED.0046B010
0046B00B |. C603 3E MOV BYTE PTR DS:[EBX],3E
0046B00E |. EB 03 JMP SHORT UNPACKED.0046B013
0046B010 |> C603 3F MOV BYTE PTR DS:[EBX],3F
0046B013 |> 8A43 01 MOV AL,BYTE PTR DS:[EBX+1]
;②取第二个,这里[EBX+1]=K(6B)
0046B016 |. 3C 40 CMP AL,40
0046B018 |. 76 0A JBE SHORT UNPACKED.0046B024
;②6B>40,不跳
0046B01A |. 3C 5B CMP AL,5B
0046B01C |. 73 06 JNB SHORT UNPACKED.0046B024
;②不小于跳,6B>5B,所以又跳0046B024---->
0046B01E |. 806B 01 41 SUB BYTE PTR DS:[EBX+1],41
0046B022 |. EB 33 JMP SHORT UNPACKED.0046B057
0046B024 |> 8A43 01 MOV AL,BYTE PTR DS:[EBX+1]
;②来到这里,
0046B027 |. 3C 60 CMP AL,60
0046B029 |. 76 0A JBE SHORT UNPACKED.0046B035
;②6B>60,不跳.
0046B02B |. 3C 7B CMP AL,7B
0046B02D |. 73 06 JNB SHORT UNPACKED.0046B035
;②6B<7B,所以不跳
0046B02F |. 806B 01 47 SUB BYTE PTR DS:[EBX+1],47
;②[EBX+1]=6B-47=24
0046B033 |. EB 22 JMP SHORT UNPACKED.0046B057
;②跳0046B057-->
0046B035 |> 807B 01 2F CMP BYTE PTR DS:[EBX+1],2F
0046B039 |. 76 0C JBE SHORT UNPACKED.0046B047
0046B03B |. 807B 01 3A CMP BYTE PTR DS:[EBX+1],3A
0046B03F |. 73 06 JNB SHORT UNPACKED.0046B047
0046B041 |. 8043 01 04 ADD BYTE PTR DS:[EBX+1],4
0046B045 |. EB 10 JMP SHORT UNPACKED.0046B057
0046B047 |> 807B 01 2B CMP BYTE PTR DS:[EBX+1],2B
0046B04B |. 75 06 JNZ SHORT UNPACKED.0046B053
0046B04D |. C643 01 3E MOV BYTE PTR DS:[EBX+1],3E
0046B051 |. EB 04 JMP SHORT UNPACKED.0046B057
0046B053 |> C643 01 3F MOV BYTE PTR DS:[EBX+1],3F
0046B057 |> 8A03 MOV AL,BYTE PTR
DS:[EBX] ;②取[EBX]=36入AL
0046B059 |. C1E0 02 SHL EAX,2
;②左移2位,[EAX]=36*4=D8
0046B05C |. 33D2 XOR EDX,EDX
;②EDX清零
0046B05E |. 8A53 01 MOV DL,BYTE PTR DS:[EBX+1]
;②取[EBX+1]=24入DL
0046B061 |. C1EA 04 SHR EDX,4
;②右移4位.EDX=2
0046B064 |. 80E2 03 AND DL,3
;②DL=3&2=2
0046B067 |. 0AC2 OR AL,DL
;②AL=D8和2或运算,AL=DA
0046B069 |. 8845 F1 MOV BYTE PTR SS:[EBP-F],AL
;②AL=DA入[EBP-F]
0046B06C |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
;
0046B06F |. 8A55 F1 MOV DL,BYTE PTR SS:[EBP-F]
;②[EBP-F]=DA入DL <--记住
.......................
到这里;
004696B4 |> 8B45 FC /MOV EAX,DWORD PTR
SS:[EBP-4] ;取[EBP-4]入EAX
004696B7 |. 8A0430 |MOV AL,BYTE PTR DS:[EAX+ESI]
;ESI初值为0
004696BA |. 8845 F7 |MOV BYTE PTR SS:[EBP-9],AL
;将从[EBP-4]入EAX的再入[EBP-9]
004696BD |. 8D4D E7 |LEA ECX,DWORD PTR SS:[EBP-19]
;[EBP-9]地址装入ECX
004696C0 |. 8D53 50 |LEA EDX,DWORD PTR DS:[EBX+50]
;[EBX+50]地址装入EDX
004696C3 |. 8BC3 |MOV EAX,EBX
004696C5 |. E8 1EF8FFFF |CALL UNPACKED.00468EE8
004696CA |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
004696CD |. 8A0430 |MOV AL,BYTE PTR DS:[EAX+ESI]
;将多次运算后的加密串,移入AL
004696D0 |. 3245 E7 |XOR AL,BYTE PTR SS:[EBP-19]
;和[EBP-19](原[EBP-4])的异或后入AL,为最终解密密码
加密串ElOaFUx+2k==,
12 XOR 24 =36 12<--由ElOa算出
53 XOR 65 =36 53<--由ElOa算出
9A XOR AA =30 9A<--由ElOa算出
15 XOR 2D =38 15<--由FUx+算出
4C XOR 79 =35 4C<--由FUx+算出
7E XOR 4B =35 7E<--由FUx+算出
DA XOR E9 =33 DA<--由2k算出
004696D3 |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8]
004696D6 |. 880432 |MOV BYTE PTR DS:[EDX+ESI],AL
;解密密码存放入[EDX+ESI].
004696D9 |. 8D53 50 |LEA EDX,DWORD PTR DS:[EBX+50]
004696DC |. 8D43 51 |LEA EAX,DWORD PTR DS:[EBX+51]
004696DF |. B9 0F000000 |MOV ECX,0F
004696E4 |. E8 A391F9FF |CALL UNPACKED.0040288C
004696E9 |. 8A45 F7 |MOV AL,BYTE PTR SS:[EBP-9]
004696EC |. 8843 5F |MOV BYTE PTR DS:[EBX+5F],AL
004696EF |. 46 |INC ESI
;ESI自加1,取下一个密码.
004696F0 |. 4F |DEC EDI
;EDI自减1,判断是否取完,
004696F1 |.^75 C1 \JNZ SHORT UNPACKED.004696B4
;没有取完,则重复,跳004696B4
.......................................
0047686F |. 8BC6 MOV EAX,ESI
00476871 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
:[EBP-4] 解密密码.
【总结】:
加密串ElOaFUx+2k==,
12 XOR 24 =36 12<--由ElOa算出
53 XOR 65 =36 53<--由ElOa算出
9A XOR AA =30 9A<--由ElOa算出
15 XOR 2D =38 15<--由FUx+算出
4C XOR 79 =35 4C<--由FUx+算出
7E XOR 4B =35 7E<--由FUx+算出
DA XOR E9 =33 DA<--由2k算出
最后密码为: 6608553
注:24 65 AA 2D 79 4B E9 ,也是算出来的,我没有深入跟踪,所以本文是不完全分析的,如果有兴趣的朋友可以去跟踪一下。
谢谢你看完这篇文章。