12-03-2022, 08:16 PM
Was a bit distracted with developing keygens for ZyXEL modems. But I did gain some more experience writing C++ code. Decided to write the multiplier finding algo from scratch to see if I missed anything. Again I cannot find a multiplier. But it recovers the NVG589 and 599 multipliers flawlessly. Oh well, over 800 passwords now.
Code:
#include <iostream>
#include <fstream>
using namespace std;
using std::ifstream;
const double precision = 0.000001;
const double precision2 = 2*precision;
bool is_integer(double input) {
bool result;
double fraction;
input = input + precision; //shift .9999 to above zero, so you can floor to get the remainder
fraction = input - (long)input;
result=fraction<precision2;
return result;
}
void main(int argc, char* argv[]) {
int key1, key2, fit, max_fit;
double integer1, integer2, integer3, multiplier, max_multi;
ifstream file_data;
string file_name;
int number_of_keys;
long double all_keys[600];
file_name = argv[1];
file_data.open(file_name);
if (!file_data) {
cerr << "file not found";
exit(1);
}
number_of_keys = 0;
while (!file_data.eof()) {
file_data >> all_keys[number_of_keys];
number_of_keys = number_of_keys + 1;
}
file_data.close();
for (integer1 = 1; integer1 < 3e9; integer1++) {
max_fit = 0;
for (key1 = 0; key1 < number_of_keys; key1++) {
fit = 0;
multiplier = all_keys[key1] / integer1;
for (key2 = 0; key2 < number_of_keys; key2++) {
integer2 = all_keys[key2] / multiplier;
if (is_integer(integer2)) {
fit++;
}
}
if (fit > max_fit) {
max_fit = fit;
max_multi = multiplier;
}
}
if (max_fit >= number_of_keys-2) { // allowed to miss on one key
printf("%17.7lf\n", max_multi);
}
}
}