问个问题, Java 有没有办法接入 gpu 运算,想写个暴力破解压缩包

2020-01-19 09:43:39 +08:00
 zzzmh

如题,就是写了自己玩玩的那种不开源不发布不盈利的 大概思路就是用 java 读 rar、zip、7z 等 从 0 开始逐个测试密码 密码不对就接着试的那种 如果只是开多线程用 cpu 算的话,感觉效率太低

早些年我接触过一个毛子大神写的 wifi 密码握手包的破解器 是用 gpu 运算的,算力贼强

迫于自身实力有限,就只会 java 一门后端语言 想问问有没有 java 调用 gpu 来运算的可能性? 如果需要再学 python 的话就算了。。。

10248 次点击
所在节点    Java
73 条回复
bibitiger
2020-01-19 10:32:49 +08:00
@lihongjie0209 对于 IO 来说,空间换时间,多线程多进程。解密来说,首先肯定要知道加密方式,接着根据加密方式提取密文开始破解就好了,不需要全部重复 IO
alphatoad
2020-01-19 10:34:38 +08:00
@bagel 真是辛苦你了,我也搞不懂他在 io 些啥
lihongjie0209
2020-01-19 10:35:32 +08:00
@bibitiger #20 嗯, 高级一点可以这么玩. 不过从楼主的问题来看应该是想黑盒暴力破解.
bagel
2020-01-19 10:42:45 +08:00
这个问题实际都不需要懂技术细节,有点常识的人就知道。你解压一个带密码的很大的文件,输入错误密码,程序立刻会告诉你密码错误。就和删除一个大文件(普通删除),是立刻完成,不会 IO 很久。设计计算机的人没有有些人那么蠢。
yutou527
2020-01-19 10:51:52 +08:00
他的假设算力无限大的情况 IO 确实是大头,但是这可能吗?
LostPrayers
2020-01-19 10:53:30 +08:00
@lihongjie0209 兄弟你是测试吧,典型的测试思维。
在有程序的情况下哪里需要这样搞啊,更别提还是 zip、7z 这类大众熟知的软件。直接 ida 出解密算法的执行 call,写成 hook 让 java 程序用 jni 调用就行了,这里其实用 java 还是 js 还是 py 做前端都没啥区别,关键是上一步的反编译需要 C 或者 C++。或者你不会反编译,直接用 java 实现关键解密算法也行(针对 zip\7z 这类开源的)
然后到了 GPU 运算这里,我不太熟不知道有没有什么现成框架,照理是有的那你用什么前端做开发都差别不大
lsastaaa
2020-01-19 10:57:05 +08:00
@lihongjie0209 不是就算如你所说,你也不用每次循环都去读文件啊。 在循环外把文件读出来,在循环内只做密码验证。
LostPrayers
2020-01-19 10:58:03 +08:00
@lihongjie0209
而你说的那种瓶颈在 IO 上的, 一般是 WEB 或者远程服务的后台爆破吧, 代码不在本地上跑, 确实只能消耗大量的网络 IO.
但如果你知道加解密算法的时候,情况又不一样了, 又变回纯算力爆破了.
下次遇到不理解的领域还是先不要头铁的好
lihongjie0209
2020-01-19 11:00:05 +08:00
@lsastaaa #26 参考 #11
augustheart
2020-01-19 11:08:16 +08:00
@lihongjie0209 不需要,你读一下 libzip 的代码。
目前我知道的压缩格式中没有任何一个是需要读取所有的 binary 才能知道密码是否正确的,这不是正常的产品设计思路。
augustheart
2020-01-19 11:13:46 +08:00
@lihongjie0209
struct trad_pkware *ctx;
...
if ((ctx = (struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) {
zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
...
ctx->key[0] = KEY0;
ctx->key[1] = KEY1;
ctx->key[2] = KEY2;
decrypt(ctx, NULL, (const zip_uint8_t *)password, strlen(password), 1);
if ((s2 = zip_source_layered(za, src, pkware_decrypt, ctx)) == NULL) {
pkware_free(ctx);
return NULL;
}

from zip_source_pkware.c
解密码的关键就在这个 ctx 结构体,预填充 ctx 之后,在内存中反复用不同的密码重试是没有任何难度的。
augustheart
2020-01-19 11:18:04 +08:00
@LostPrayers 通过服务器破解也不用反复通过网络解密。通过网络一次性传输需要的关键数据后,所有的后续操作都可以在服务端完成。
因为这只是检查密码,而不是整个解压
LostPrayers
2020-01-19 11:21:47 +08:00
@augustheart 额,我的意思不是通过服务器破解,而是爆破远程服务的密码
lihongjie0209
2020-01-19 11:24:36 +08:00
@augustheart #30 好的, 我去研究一下
warcraft1236
2020-01-19 11:31:30 +08:00
@LostPrayers 求不黑测试,测试也不是不知道代码逻辑的,解压密码判断正确,还需要反复读取文件,这个逻辑听起来就有问题,正常人怎么可能这么搞
augustheart
2020-01-19 11:34:51 +08:00
@LostPrayers 好吧,领会错了。因为这个帖就是说压缩文件,我直接想到当初毛子弄的远程破解密码服务了
luozic
2020-01-19 11:38:44 +08:00
到底是网络跑字典,还是本地通过 gpu 加速跑字典?
lihongjie0209
2020-01-19 11:46:02 +08:00
@augustheart #29

我之前认为楼主用的是类似 zip4j 之类的库, 然后尝试解压, 抛出异常进行下一次尝试.

目前看来提取关键信息然后尝试那么就需要楼主手动进行这些二进制数据的解析.

我同时查了一下 John the Ripper, 也是用来暴力破解的, 按照 https://stackoverflow.com/questions/15442565/how-do-you-get-the-password-hash-of-a-zip-file 上面的说法, 它会提取类似你说的关键信息


```
Output Line Format:
*
* For type = 0 for files encrypted with "rar -hp ..." option
* archive_name:$RAR3$\*type\*hex(salt)\*hex(partial-file-contents):type::
::archive_name
*
* For type = 1 for files encrypted with "rar -p ..." option
* archive_name:$RAR3$\*type\*hex(salt)\*hex(crc)\*PACK_SIZE\*UNP_SIZE\*0\*
archive_name\*offset-for-ciphertext\*method:type::file_name
*
* or
*
* archive_name:$RAR3$\*type\*hex(salt)\*hex(crc)\*PACK_SIZE\*UNP_SIZE\*1\*
hex(full encrypted file)\*method:type::file_name

```

前两种格式的关键信息和你说的类似, 但是它会有一种变体, 也就是最后一个, 需要读取整个文件 `hex(full encrypted file)`.


最后还是很感谢这种有意义的讨论, 学到了不少东西
augustheart
2020-01-19 11:49:49 +08:00
@lihongjie0209 读取整个文件只可能用在解压缩的时候,这个时候当然是需要读取所有数据了然后逐块输出。
只是解密的话就相当于在压缩软件上点下测试键。
augustheart
2020-01-19 11:51:06 +08:00
@augustheart 测试键的比拟不恰当,实际上测试键只是省去了输出,它还是要判断二进制数据是否完整。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639055

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX