破解finalshell的密码

电脑上面用了Finalshell连接了服务器,但是忘记了服务器密码怎么办?

首先,若默认安装路径的话,在 C:\Users\Administrator\AppData\Local\finalshell\conn 中会有一些文件,这些文件应该就是保存密码的文件,但是密码加密了,需要破解,拷贝出加密的密码。

执行这个java脚本

执行过程如图:


执行java文件

FinalShellDecodePass.java源代码,亲测可用:

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.math.BigInteger;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Base64;

import java.util.Random;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class FinalShellDecodePass {

    public static void main(String[] args)throws Exception {

        System.out.println(decodePass(args[0]));

    }

    public static byte[] desDecode(byte[] data, byte[] head) throws Exception {

        SecureRandom sr = new SecureRandom();

        DESKeySpec dks = new DESKeySpec(head);

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

        SecretKey securekey = keyFactory.generateSecret(dks);

        Cipher cipher = Cipher.getInstance("DES");

        cipher.init(2, securekey, sr);

        return cipher.doFinal(data);

    }

    public static String decodePass(String data) throws Exception {

        if (data == null) {

            return null;

        } else {

            String rs = "";

            byte[] buf = Base64.getDecoder().decode(data);

            byte[] head = new byte[8];

            System.arraycopy(buf, 0, head, 0, head.length);

            byte[] d = new byte[buf.length - head.length];

            System.arraycopy(buf, head.length, d, 0, d.length);

            byte[] bt = desDecode(d, ranDomKey(head));

            rs = new String(bt);

            return rs;

        }

    }

    static byte[] ranDomKey(byte[] head) {

        long ks = 3680984568597093857L / (long)(new Random((long)head[5])).nextInt(127);

        Random random = new Random(ks);

        int t = head[0];

        for(int i = 0; i < t; ++i) {

            random.nextLong();

        }

        long n = random.nextLong();

        Random r2 = new Random(n);

        long[] ld = new long[]{(long)head[4], r2.nextLong(), (long)head[7], (long)head[3], r2.nextLong(), (long)head[1], random.nextLong(), (long)head[2]};

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        DataOutputStream dos = new DataOutputStream(bos);

        long[] var15 = ld;

        int var14 = ld.length;

        for(int var13 = 0; var13 < var14; ++var13) {

            long l = var15[var13];

            try {

                dos.writeLong(l);

            } catch (IOException var18) {

                var18.printStackTrace();

            }

        }

        try {

            dos.close();

        } catch (IOException var17) {

            var17.printStackTrace();

        }

        byte[] keyData = bos.toByteArray();

        keyData = md5(keyData);

        return keyData;

    }

    public static byte[] md5(byte[] data) {

        String ret = null;

        byte[] res=null;

        try {

            MessageDigest m;

            m = MessageDigest.getInstance("MD5");

            m.update(data, 0, data.length);

            res=m.digest();

            ret = new BigInteger(1, res).toString(16);

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        }

        return res;

    }

}

你可能感兴趣的:(破解finalshell的密码)