暴力破解算法

﹏ヽ暗。殇╰゛Y 2022-10-12 04:19 362阅读 0赞

暴力破解算法

可用于如下场景:
1、密码猜测

2、对于罗拉模块的数据请求,当发现模块么有回应数据时,往往考虑是否模块所处位置导致信号无法到达,此时可借助其他模块作为中继来进行通讯。

当然无论用于哪种场景,都需要自己实现代码,本代码只是写出了核心算法。

算法描述:从1位密码开始,或者说从1个中继开始,从数组中获取每一种值,取到最后一个数据后,翻转到第一个值,增加1位,取第一个值。
比如密码组合有[1,2,3,4]四个数字,密码最多4位,那么组合规律如下:
1
2
3
4
11
12
13
14

4444

代码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <time.h>
  6. using namespace std;
  7. typedef unsigned int BOOL;
  8. typedef unsigned short u16;
  9. #define TRUE 1
  10. #define FALSE 0
  11. #define DEVICE_COUNT 4 // 设备数量
  12. #define MAX_RELAY_NUM 3 // 最大中继数量
  13. int relayNum = 0; // 当前中继数量
  14. int devices[DEVICE_COUNT] = { 1,2,3,4}; // 设备地址数组
  15. int relayIndexArr[DEVICE_COUNT] = { 0}; // 中继索引数组,存储设备序号,如0,1
  16. int relayDevices[DEVICE_COUNT] = { 0}; // 中继数组,存储设备地址,如1,2
  17. /** * @brief 改变中继地址,策略为暴力算法,先尝试1个中继,然后2个,与暴力破解密码是一个逻辑 * * 比如有设备1/2/3/4共4台设备,要访问设备4,但是没返回数据,这时开始中继。 * 首先尝试1个中继,有4种可能:分别为1/2/3/4. * 然后考虑2个中继,有4 * 4 = 16种可能,分别为:11,12,13,14,21,22...,44 * 然而上述排序中应该排除2种情况: * 情况1:中继中不能存在自己; * 情况2:中继中不能重复设备; * 排除的情况单独用函数判断,如果被排除,再获取下一种情况即可。这样做能让改变中继函数变得简单。 * @return BOOL 获取到中继返回TRUE,否则返回FALSE; */
  18. static BOOL ChangeDeviceRelayAddrs()
  19. {
  20. int relayIndex = relayNum - 1; // 注意数据类型,第一次为-1
  21. while (relayIndex >= 0)
  22. {
  23. // 所有设备都用过了,返回使用第一个设备作为中继,然后修改前面一个中继设备的地址(前面一个中继的序号加1)
  24. // 比如设备1,2,3,4共4台设备,当2个中继时:为14组合,那么下一次应该为21组合。
  25. if (relayDevices[relayIndex] == devices[DEVICE_COUNT - 1])
  26. {
  27. relayIndexArr[relayIndex] = 0;
  28. relayDevices[relayIndex] = devices[relayIndexArr[relayIndex]];
  29. --relayIndex;
  30. continue;
  31. }
  32. // 当前中继还未达到最后那台设备,修改当前中继为下一台设备,并返回TRUE
  33. ++relayIndexArr[relayIndex];
  34. relayDevices[relayIndex] = devices[relayIndexArr[relayIndex]];
  35. return TRUE;
  36. }
  37. // 循环完成还没有找到有效中继,说明所有中继都已经回滚为第一台设备了,那么中继数量加1。
  38. relayNum++;
  39. if (relayNum <= MAX_RELAY_NUM)
  40. {
  41. relayIndex = relayNum - 1;
  42. relayIndexArr[relayIndex] = 0;
  43. relayDevices[relayIndex] = devices[relayIndexArr[relayIndex]];
  44. return TRUE;
  45. }
  46. // 如果已经超过最大中继数量,就将设备重置为无中继状态
  47. memset(relayIndexArr, 0, sizeof relayIndexArr);
  48. memset(relayDevices, 0, sizeof relayDevices);
  49. relayNum = 0;
  50. return TRUE;
  51. }
  52. /** * @brief 改变中继地址,策略为暴力算法,先尝试1个中继,然后2个,与暴力破解密码是一个逻辑 * * 比如有设备1/2/3/4共4台设备,要访问设备4,但是没返回数据,这时开始中继。 * 首先尝试1个中继,有4种可能:分别为1/2/3/4. * 然后考虑2个中继,有4 * 4 = 16种可能,分别为:11,12,13,14,21,22...,44 * 然而上述排序中应该排除2种情况: * 情况1:中继中不能存在自己; * 情况2:中继中不能重复设备; * 排除的情况单独用函数判断,如果被排除,再获取下一种情况即可。这样做能让改变中继函数变得简单。 * @param deviceIndex 需要中继的设备序号。 * @return BOOL 获取到中继返回TRUE,否则返回FALSE; */
  53. static BOOL IsRelayAddrValid(u16 deviceIndex)
  54. {
  55. for (int i = 0; i < relayNum; i++)
  56. {
  57. if (relayIndexArr[i] == deviceIndex)
  58. {
  59. return FALSE; // 包含了自己
  60. }
  61. }
  62. for (int i = 0; i < relayNum; i++)
  63. {
  64. for (int j = i + 1; j < relayNum; j++)
  65. {
  66. if (relayIndexArr[i] == relayIndexArr[j])
  67. {
  68. return FALSE; // 两个中继重复了
  69. }
  70. }
  71. }
  72. return TRUE;
  73. }
  74. static void PrintRelays(BOOL valid)
  75. {
  76. if (relayNum == 0)
  77. {
  78. cout << "无中继" << endl;
  79. return;
  80. }
  81. cout << (valid ? "发现有效中继:" : "无效中继:");
  82. for (int i = 0; i < relayNum; i++)
  83. {
  84. cout << relayDevices[i];
  85. }
  86. cout << endl;
  87. }
  88. int main(int, char **)
  89. {
  90. int deviceIndex = 0;
  91. do
  92. {
  93. while (1)
  94. {
  95. ChangeDeviceRelayAddrs();
  96. if (IsRelayAddrValid(deviceIndex))
  97. {
  98. PrintRelays(TRUE);
  99. break;
  100. }
  101. else
  102. {
  103. PrintRelays(FALSE);
  104. }
  105. }
  106. } while (relayNum != 0);
  107. return 0;
  108. }

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java反射(暴力破解

    前言必读 > [读者手册(必读)\_云边的快乐猫的博客-CSDN博客][-CSDN] 一、名词解释 1.什么是Java反射机制? 答:运行时动态获得类信息以及动态调

    相关 暴力破解算法

    暴力破解算法 可用于如下场景: 1、密码猜测 2、对于罗拉模块的数据请求,当发现模块么有回应数据时,往往考虑是否模块所处位置导致信号无法到达,此时可借助其他模块作为中继

    相关 JMeter暴力破解账户密码

    小编软件测试刚入行二个月 为了前途 前几天看了下有关验证码找回密码的安全漏洞的文章,于是做了以下有关暴力破解验证码的总结 周所周知,所谓暴力破解,也就是我们所说的穷举法

    相关 linux暴力破解工具

    对于 Linux 操作系统来说,一般通过 VNC、Teamviewer 和 SSH 等工具来进行远程管理,SSH 是 Secure Shell 的缩写,由 IETF 的网络小组

    相关 暴力破解定义和预防

    0x00:定义 暴力破解可分为两种,一种是针对性的密码爆破,另外一种是扩展性的密码喷洒。 密码爆破:密码爆破一般很熟悉,即针对单个账号或用户,用密码字典来不断的尝试,直

    相关 算法暴力破解法(穷举法)

    一,什么是暴力破解法? 暴力破解法,就是把所有条件,相关情况统统考虑进去,让计算机进行检索,指导得出与之所有条件符合的结果 (但是,暴力破解法对计算机资源耗费严重,如果