asleap中的简单文件索引机制
asleap是一个开源的vpn破解工具,最近查看了asleap的源码,该项目地址。本文的重点是对其中的带索引的字典文件的产生过程进行介绍,产生带索引的字典文件并不复杂,但是要想用简洁易懂的语言将该问题描述明白却不容易。
asleap破解vpn的机制是通过字典文件暴力破解的方式,该字典文件有dat数据文件和idx索引文件两个文件组成,两个文件均为二进制格式。asleap工程中自带了genkey程序,可以将文本的字典文件转换为asleap程序需要的带索引的字典文件。
本文以字典文件为以下内容讲解:
1 | turquoise |
读取字典文件并产生md4值
md4编码占16个字节,三个字典进行md4编码后的结果分别为:
1 | 18 07 33 43 f6 30 b5 f8 2c 38 c0 34 37 f2 81 6b |
将字典信息写入到临时文件
为了能够对最终生成的dat文件中的内容进行排序和便于索引,程序生成了256个临时文件,文件名格式为从genk-bucket-00.tmp到genk-bucket-ff.tmp。程序根据md4编码中的第14位将字典对应的信息分别写入到临时文件中,一个字典写入到临时文件的内容如下,如果一个临时文件中存在多个字典则依次存放:
1 | struct hashpass_rec { |
本例子中turquoise对应结构体会写入到genk-bucket-81.tmp中,da和test对应结构体会依次写入到genk-bucket-95.tmp中。
读取临时文件并写入到dat数据文件中
最终dat文件中的数据内容为hashpass_rec的有序集合,排序的原则是按照md4的第14和15两个字节。依次读取256个临时文件中的hashpass_rec可以保证dat文件中的数据内容是按照第14字节排序的,但是不能够保证是按照第15个字节排序的。为了保证最终dat文件中的数据内容是按照第14和15字节有序的,在将一个临时文件中的内容写入到dat文件中前需要对该临时文件中的hashpass_rec结果按照hash变量的第15字节进行排序,直接使用C语言中的qsort进行排序。
该例子中da和test位于同一个临时文件中,需要根据hash变量的第15字节排序的结果为test、da,最终写入到dat文件中的排序结果为turquoise、test、da。
根据dat数据文件产生idx索引文件
idx索引文件中存放的是多个hashpassidx_rec结果,最多有256*256项,其结构定义如下:
1 | struct hashpassidx_rec { |
最终完成的dat文件和idx文件的指向如下图所示:
bug
genkeys.c文件中在读取字典文件时存在bug,在文件的207行将内容更改为:
1 | while (!feof(inputfl)) { |