1.info hash 码如何
info hash 码如何
最近一直在看TCP数据流的重组,看了两三天,写了个程序试了一下,结果让我大失所望。远控源码手机一运行程序我的硬盘空间就开始变小,很明显,不一会儿的功夫,好几G的空间就没了,但是什么也没重组出来。弄得我头昏脑胀,都快失去信心了。购买 java源码
既然这样了,那就暂时放放吧,等有心情了重头再来。接下来无事可做,无意间看见了曾经捕获的修改ptrace源码一个TCP包中的BT下载时的信息,在一个HTTP请求的数据里面有个经过URL编码的info_hash字段,感觉以后可能会用到这个东西,但是是原始的值。正好,那就研究一下,负67源码写个解码程序吧!
经过一番研究,发现这个URL编码跟普通的URL编码还是有区别的。
例如:一个经过URL编码的info_hash如下:
m%uC%W%C8%2D%3Bf%DB%BCi%BB%FF%C9%B2J%DD%F4
其原始值为:6DCD3BDBBCBBFFC9BADDF4
经过分析不难发现,凡是spark join源码%号后面的两位都跟原始值一样,除此之外,其余的值均为其ASCII码的进制表示,而且只有数字跟字母。这样一来,好像比普通的URL编码要简单的多,呵呵~~
知道了其中的规则,那就开始写代码吧。
在代码中,为了满足在线捕包、在线解码的要求,我就牺牲了一些存储空间,为字母和数字跟它们对应的进制值都做了一个影射,这样的话就不必再把ASCII码转换为进制了,效率虽然提高了,但需要更大的存储空间。
在linux下写了C程序,源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char char0_9[][2] = {
{ '3','0'},{ '3','1'},{ '3','2'},{ '3','3'},{ '3','4'},
{ '3','5'},{ '3','6'},{ '3','7'},{ '3','8'},{ '3','9'}
};
const char charA_Z[][2] = {
{ '4','1'},{ '4','2'},{ '4','3'},{ '4','4'},{ '4','5'},
{ '4','6'},{ '4','7'},{ '4','8'},{ '4','9'},{ '4','A'},
{ '4','B'},{ '4','C'},{ '4','D'},{ '4','E'},{ '4','F'},
{ '5','0'},{ '5','1'},{ '5','2'},{ '5','3'},{ '5','4'},
{ '5','5'},{ '5','6'},{ '5','7'},{ '5','8'},{ '5','9'},{ '5','A'}
};
const char chara_z[][2] = {
{ '6','1'},{ '6','2'},{ '6','3'},{ '6','4'},{ '6','5'},
{ '6','6'},{ '6','7'},{ '6','8'},{ '6','9'},{ '6','A'},
{ '6','B'},{ '6','C'},{ '6','D'},{ '6','E'},{ '6','F'},
{ '7','0'},{ '7','1'},{ '7','2'},{ '7','3'},{ '7','4'},
{ '7','5'},{ '7','6'},{ '7','7'},{ '7','8'},{ '7','9'},{ '7','A'}
};
void
de_url(char *url)
{
char *UnURL;
char ch;
int i = 0, j = 0;
int index;
int len = strlen(url);
UnURL = (char *)malloc(*sizeof(char));
if(!UnURL){
printf("UnURL malloc wrong!");
exit(1);
}
memset(UnURL, 0, *sizeof(char));
while(i < len){
ch = *(url+i);
if(ch == '%'){
i++;
for(; j < 2; j++){
strncat(UnURL, &(url[i]), 1);
i++;
}
j = 0;
}else if(ch >= 'a' && ch <= 'z'){
index = ch - 'a';
strncat(UnURL, chara_z[index], 2);
i++;
}else if(ch >= 'A' && ch <= 'Z'){
index = ch - 'A';
strncat(UnURL, charA_Z[index] ,2);
i++;
}else if(ch >= '0' && ch <= '9'){
index = ch - '0';
strncat(UnURL, char0_9[index], 2);
i++;
}else
printf("something else!\n");
}
printf("\n%s\n", UnURL);
}
int
main(int argc, char *argv[])
{
char *URL = "%A8%2F%FCYE%7E%F2Trx%0B%D8ZYF%DC%B9%D3v%F5";
de_url(URL);
return 0;
}
在线分析时,只需要把main函数给替换掉,就可以了。
虽然TCP流的重组还没弄出来,但会再接再厉,继续加油!