窗口程序集名 | 保 留 | 保 留 | 备 注 |
窗口程序集_启动窗口 | | | |
变量名 | 类 型 | 数组 | 备 注 |
线程池 | 线程池 | |
目标MD5 | 文本型 | |
字符集 | 文本型 | |
最小长度 | 整数型 | |
最大长度 | 整数型 | |
已停止 | 逻辑型 | |
尝试次数 | 长整数型 | |
开始时间 | 长整数型 | |
成功密码 | 文本型 | |
字符缓存 | 字节集 | |
字符缓存长度 | 整数型 | |
最后保存时间 | 长整数型 | |
字典模式 | 逻辑型 | |
字典内容 | 文本型 | 0 |
当前字典索引 | 整数型 | |
线程池.
创建 (取处理器数 (), , ,
) 编辑框_字符集.内容 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 编辑框_最小长度.内容 = "1"
编辑框_最大长度.内容 = "6"
状态条1.
置文本 (0, "就绪"
)状态条1.
置文本 (1, "线程: " +
到文本 (取处理器数 ())
)超级列表框1.
插入列 (, "线程ID", 80, , ,
)超级列表框1.
插入列 (, "当前密码", 150, , ,
)超级列表框1.
插入列 (, "
速度 (次/秒
)", 100, , ,
)超级列表框1.
插入列 (, "尝试次数", 100, , ,
)最后保存时间 =
取启动时间 ()
如果真 (编辑框_MD5.内容 = ""
)
信息框 ("请输入MD5值!",
#错误图标, ,
)
返回 ()
如果真 (取文本长度 (字符集
) = 0
且 字典模式 =
假)
信息框 ("字符集不能为空!",
#错误图标, ,
)
返回 ()目标MD5 = 编辑框_MD5.内容
字符集 = 编辑框_字符集.内容
最小长度 =
到整数 (编辑框_最小长度.内容
)最大长度 =
到整数 (编辑框_最大长度.内容
)已停止 = 假
尝试次数 = 0
成功密码 = ""
开始时间 =
取启动时间 ()最后保存时间 =
取启动时间 () 字符缓存长度 =
取文本长度 (字符集
)字符缓存 =
到字节集 (字符集
) 超级列表框1.
全部删除 ()
计次循环首 (线程池.
取最大线程数 (), i
)
索引 = 超级列表框1.
插入表项 (, , , , ,
)
超级列表框1.
置标题 (索引, 0, "线程" +
到文本 (i
))

超级列表框1.
置标题 (索引, 1, "初始化中..."
)
超级列表框1.
置标题 (索引, 2, "0"
)
超级列表框1.
置标题 (索引, 3, "0"
)
计次循环尾 ()
如果 (选择框_字典模式.选中
)
字典模式 = 真

当前字典索引 = 0


如果真 (通用对话框1.
打开 () =
假)
返回 ()

文件号 =
打开文件 (通用对话框1.文件名, ,
)
如果真 (文件号 = 0
)
信息框 ("无法打开字典文件!",
#错误图标, ,
)
返回 ()

文本 =
读入文本 (文件号,
)
关闭文件 (文件号
)

字典内容 =
分割文本 (文本,
#换行符, )
如果真 (取数组成员数 (字典内容
) = 0
)
信息框 ("字典文件内容为空!",
#错误图标, ,
)
返回 ()

标签_结果.标题 = "字典模式启动,条目数: " +
到文本 (取数组成员数 (字典内容
))


字典模式 = 假

标签_结果.标题 = "暴力破J启动..."
状态条1.
置文本 (0, "运行中"
)按钮_开始.禁止 = 真
按钮_暂停.禁止 = 假
按钮_保存.禁止 = 假
计次循环首 (线程池.
取最大线程数 (), i
)
线程池.
投递任务 (&破J任务, i,
)
计次循环尾 ()
如果 (已停止
)
已停止 = 假

按钮_暂停.标题 = "暂停"

状态条1.
置文本 (0, "运行中"
)

计次循环首 (线程池.
取最大线程数 (), i
)

线程池.
投递任务 (&破J任务, i,
)

计次循环尾 ()

已停止 = 真

按钮_暂停.标题 = "继续"

状态条1.
置文本 (0, "已暂停"
)
调用子程序 (&保存进度,
).局部变量 文件号, 整数型
.局部变量 保存内容, 文本型
文件号 =
打开文件 ("破J进度.txt",
#重写, )
如果真 (文件号 = 0
)
信息框 ("无法保存进度!",
#错误图标, ,
)
返回 ()保存内容 = "目标MD5:" + 目标MD5 +
#换行符 保存内容 = 保存内容 + "字符集:" + 字符集 +
#换行符 保存内容 = 保存内容 + "最小长度:" +
到文本 (最小长度
) +
#换行符 保存内容 = 保存内容 + "最大长度:" +
到文本 (最大长度
) +
#换行符 保存内容 = 保存内容 + "尝试次数:" +
到文本 (尝试次数
) +
#换行符 保存内容 = 保存内容 + "开始时间:" +
到文本 (开始时间
) +
#换行符
如果 (字典模式
)
保存内容 = 保存内容 + "字典模式:是" +
#换行符 
保存内容 = 保存内容 + "当前字典索引:" +
到文本 (当前字典索引
) +
#换行符 

保存内容 = 保存内容 + "字典模式:否" +
#换行符 写出文本 (文件号, 保存内容
)关闭文件 (文件号
)状态条1.
置文本 (0, "进度已保存"
)|
(暂未填写DLL命令名) | | |
|
(未填写库文件名) |
|
(未填写命令名) |
|
线程ID | 整数型 | | |
.局部变量 当前密码, 文本型
.局部变量 局部尝试次数, 长整数型
.局部变量 局部开始时间, 长整数型
.局部变量 最后更新时间, 长整数型
局部尝试次数 = 0
局部开始时间 =
取启动时间 ()最后更新时间 =
取启动时间 ()
判断循环首 (取反 (已停止
) 且 成功密码 = ""
)
如果 (字典模式
)


如果真 (当前字典索引 ≥
取数组成员数 (字典内容
))


跳出循环 ()



当前密码 = 字典内容
[当前字典索引
]

当前字典索引 = 当前字典索引 + 1





当前密码 =
生成密码 (线程ID
) 

如果真 (当前密码 ≠ ""
)

局部尝试次数 = 局部尝试次数 + 1

原子递增 (尝试次数
)




如果真 (取数据摘要 (到字节集 (当前密码
)) = 目标MD5
)


成功密码 = 当前密码


调用子程序 (&显示结果, 成功密码
)

返回 ()




如果真 (取启动时间 () - 最后更新时间 > 100
)

调用子程序 (&更新线程状态, 线程ID, 当前密码, 局部尝试次数, 局部开始时间
)


最后更新时间 =
取启动时间 ()


局部尝试次数 = 0



局部开始时间 =
取启动时间 ()




如果真 (取启动时间 () - 最后保存时间 > 10000
)

调用子程序 (&保存进度
)


最后保存时间 =
取启动时间 ()


判断循环尾 ()

如果真 (取反 (字典模式
) 且 成功密码 = ""
)
调用子程序 (&更新线程状态, 线程ID, "任务完成", 局部尝试次数, 局部开始时间
)

进入许可区 (许可区
)
变量 = 变量 + 1
退出许可区 (许可区
)|
更新线程状态 | | |
|
线程ID | 整数型 | | | |
当前密码 | 文本型 | | | | 尝试次数 | 长整数型 | | | | 开始时间 | 长整数型 | | | |

.局部变量 速度, 双精度小数型

.局部变量 用时, 整数型


用时 =
取启动时间 () - 开始时间

如果真 (用时 = 0
)

速度 = 0


速度 = 尝试次数
÷ (用时 ÷ 1000
)

计次循环首 (超级列表框1.
取表项数 (), i
)

如果真 (超级列表框1.
取标题 (i, 0
) = "线程" +
到文本 (线程ID
))



超级列表框1.
置标题 (i, 1, 当前密码
)


超级列表框1.
置标题 (i, 2,
到文本 (取整 (速度
))
)


超级列表框1.
置标题 (i, 3,
到文本 (尝试次数
))


跳出循环 ()

计次循环尾 ()

状态条1.
置文本 (2, "总尝试: " +
到文本 (尝试次数
))

状态条1.
置文本 (3, "总速度: " +
到文本 (取整 (尝试次数
÷ ( (取启动时间 () - 开始时间
) ÷ 1000
))
) + "次/秒"
)

如果真 (最大长度 > 0
且 取反 (字典模式
))


.局部变量 总组合数, 长整数型


.局部变量 剩余组合数, 长整数型


.局部变量 完成比例, 双精度小数型


.局部变量 预计剩余时间, 整数型




总组合数 =
计算总组合数 (字符缓存长度, 最小长度, 最大长度
)

完成比例 = 尝试次数 ÷ 总组合数


剩余组合数 = 总组合数 - 尝试次数




如果真 (尝试次数 > 0
且 完成比例 < 1
)


预计剩余时间
= (剩余组合数
÷ (尝试次数
÷ ( (取启动时间 () - 开始时间
) ÷ 1000
))
) ÷ 3600



状态条1.
置文本 (4, "进度: " +
取文本左边 (到文本 (完成比例 × 100
), 5
) + "% 剩余: " +
到文本 (预计剩余时间
) + "小时"
)




如果 (密码 ≠ ""
)

标签_结果.标题 = "破J成功!密码:" + 密码


状态条1.
置文本 (0, "成功"
)

剪辑板.
置文本 (密码
)

如果 (字典模式
)


标签_结果.标题 = "字典破J完成,未找到匹配密码"



标签_结果.标题 = "暴力破J完成,未找到匹配密码"

状态条1.置文本 (0, "完成")

按钮_开始.禁止 = 假

按钮_暂停.禁止 = 真

已停止 = 真

调用子程序 (&保存进度
)|
计算总组合数 | 长整数型 | |
|
字符数 | 整数型 | | | |
最小长度 | 整数型 | | | | 最大长度 | 整数型 | | | |
总数 = 0
计次循环首 (最大长度 - 最小长度 + 1, i
)
总数 = 总数 +
求幂 (字符数, 最小长度 + i - 1
)
计次循环尾 ()返回 (总数
)
如果 (选择框_字典模式.选中
)

编辑框_字符集.禁止 = 真


编辑框_最小长度.禁止 = 真


编辑框_最大长度.禁止 = 真


按钮_选择字典.禁止 = 假


字典模式 = 真


编辑框
|
eThread | (未知支持库) |
dp1 |
iext |
spec |