;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 破解FoxMail密码
; by 无名, QQ:316050822,E-MAIL:cnchaosir@hotmail.com
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 本程序为行者孙的文章《破解FoxMail密码》VFP版本改写而成,思路归原作者
; 所有。引用时请保留! ;)
; 本程序为测试版本,使用时请在FoxMail安装目录下找到要破解的E-MAIL账户名
; 打开并将“POP3Password=”后的加密串放到szPwdStr处,并重新编译本程序。
; 我的汇编不太好,代码写的冗余,请高手帮助优化,不甚感激!
; 我很少用注释,若对大家理解本程序算法带来不便请见谅!:)
; 本代码仅供学习研究使用,若有违法行为与我无关。:)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FoxMailPwd.Asm
; rc FoxMailPwd.rc
; Link /subsystem:windows FoxMailPwd.Asm FoxMailPwd.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
      .386
      .model flat,stdcall
      option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include      windows.inc
include      user32.inc
includelib    user32.lib
include      kernel32.inc
includelib    kernel32.lib
include      gdi32.inc
includelib    gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      .data
szPwdStr    db    'A153E13AC17F8DD17BCF22F64DE872B667ABB89E66',0
szBuffer    db    128  dup(?)
szBuffer1    db    128  dup(?)
szBuffer2    db    128  dup(?)
szCaption    db    '提示',0
szFormat    db    '解密成功!密码为:%s',0
dwSize      dd    ?
dbKey      db    7Eh,64h,72h,61h,47h,6Fh,6Eh,7Eh  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      .code
      
Begin:
      pushad
      invoke  lstrlen,offset szPwdStr
      push  eax
      pop  dwSize
      mov  bl,2
      div  bl
      mov  ecx,eax
      push  ecx
      lea  esi,szPwdStr
      lea  edi,szBuffer
      xor  ebx,ebx
_LoopBegin:
      mov  ax,[esi]
      xchg  al,ah
      cmp  ah,39h
      ja  _Sub
      sub  ah,30h
_Continue:    shl  ah,4
      cmp  al,39h
      ja  _Sub1
      sub  al,30h
_Countinue1:    add  al,ah
      xor  ah,ah
      mov  [edi],al
      add  esi,2
      inc  edi
      Loop  short  _LoopBegin
      cmp  ecx,0
      je  _Bye
_Sub:      sub  ah,37h
      jmp  short   _Continue        
_Sub1:      sub  al,37h
      jmp  short   _Countinue1
                ;以上将ASCII码转为16进制数  
;*****************************************************************************************
_Bye:
      pop  ecx
      push  ecx
      lea  esi,szBuffer
      lea  edi,szBuffer1
      cld    
      rep  movsb          ;拷贝转换后的数据
;*****************************************************************************************
;以下为解密过程
;*****************************************************************************************
      pop  ecx
      dec  ecx
      push  ecx
      xor  ebx,ebx
      lea  esi,dbKey
      lea  edi,szBuffer
_Go:      cmp  ebx,8
      jae  @f
_Next:      mov  al,[esi]
      xor  al,[edi+1]
      mov  BYTE ptr [edi],al
      inc  esi
      inc  edi
      inc  ebx
      loop  _Go
      cmp  ecx,0
      je  _GetOut
@@:      
      sub  ebx,8
      lea  esi,dbKey
      add  esi,ebx
      jmp  short  _Next
_GetOut:    
      lea  esi,szBuffer1
      mov  al,[esi]
      xor  al,90
      mov  [esi],al
      
      pop  ecx
      xor  eax,eax
      lea  esi,szBuffer1
      lea  edi,szBuffer
_LastLoop:    mov  al,[edi]
      cmp  al,[esi]
      jb  @f
      sub  al,[esi]
      mov  BYTE ptr [edi],al
      inc  esi
      inc  edi
      loop  _LastLoop
      cmp  ecx,0
      je  _Exit
@@:
      add  al,255
      sub  al,[esi]
      mov  BYTE ptr [edi],al
      inc  esi
      inc  edi
      jmp  _LastLoop
      cmp  ecx,0
      je  _Exit
;****************************************************************************************
_Exit:
      invoke  wsprintf,addr szBuffer2,addr szFormat,addr szBuffer
      invoke  MessageBox,NULL,addr szBuffer2,addr szCaption,MB_OK
      invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      end  Begin