-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcracker.js
More file actions
112 lines (102 loc) · 3.5 KB
/
cracker.js
File metadata and controls
112 lines (102 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
var base64 = require("crypto-js/enc-base64");
var pbkdf2 = require("crypto-js/pbkdf2");
var log4js = require("log4js");
var argv = require('yargs')
.option('k', {
demand: true,
describe: 'RestrictionsPasswordKey of your iphone',
type: 'string'
})
.option('s', {
demand: true,
describe: 'RestrictionsPasswordSalt of your iphone',
type: 'string'
})
.option('n', {
describe: 'how many process use to crack your password',
type: 'string',
default: require('os').cpus().length,
})
.usage('Usage: node ios7hash.js [options]')
.example('node cracker.js -k W7tAe0hOydAKCYAjeNnj9YZyLXc= -s NzJ4xQ==')
.argv;
log4js.configure({
"appenders": [
{
"type": "console",
"category": "console"
},
{
"category": "file",
"type": "file",
"filename": "./password.log",
"maxLogSize": 104800,
"backups": 100
},
],
"replaceConsole": true,
"levels": {
"file": "ALL",
"console": "ALL",
}
});
var logger = log4js.getLogger('console');
var iosKey = argv['k'];
var iosSalt = argv['s'];
var threadNum = argv['n'];
var passwordStart = 0;
var passwordEnd = 9999;
var passwordNow = passwordStart;
var stopnow = 0;
var checkPassword = function (pwdNow, pwdEnd, iosKey, iosSalt, cb) {
var code = pbkdf2(pwdNow + '', base64.parse(iosSalt), {keySize: 5, iterations: 1000});
//logger.trace("check password: "+pwdNow+", creates base64 key: "+code.toString(base64));
if (code.toString(base64) == iosKey) {
//logger.trace("FOUND!! password: "+pwdNow);
stopnow = 1;
cb(pwdNow);
} else if (pwdNow.toString() == pwdEnd.toString() || stopnow == 1) {
stopnow = 1;
//logger.trace("Stopping... password: "+pwdNow);
cb(false);
} else {
pwdNow++;
setTimeout(function () {
checkPassword(pwdNow, pwdEnd, iosKey, iosSalt, cb);
}, 0);
}
}
var cluster = require('cluster');
var processPwdNum = Math.ceil((passwordEnd - passwordStart) / threadNum);
if (cluster.isMaster) {
function messageHandler(msg) {
if (msg.cmd && msg.cmd === 'pwdSuccess') {
setTimeout(function () {
logger.info("password force cracking success, your password is: " + msg.ret);
}, 2000);
}
}
for (var i = threadNum - 1; i >= 0; i--) {
cluster.fork();
}
cluster.on('exit', function (worker, code, signal) {
//logger.trace('worker ' + worker.process.pid + ' died');
});
cluster.on('message', messageHandler);
} else {
var processPwdStart = passwordStart + (processPwdNum * (cluster.worker.id - 1));
var processPwdEnd = passwordStart + (processPwdNum * cluster.worker.id) - 1;
if (processPwdEnd >= passwordEnd) processPwdEnd = passwordEnd;
var retHandler = function (pwdRet) {
if (pwdRet === false) {
//logger.warn('worker:'+cluster.worker.id+' not found password form '+processPwdStart+' to '+processPwdEnd);
} else if (typeof pwdRet != 'undefined') {
logger.info('worker:' + cluster.worker.id + " found password: " + pwdRet);
var json = {"cmd": 'pwdSuccess', "ret": pwdRet};
process.send(json);
}
process.exit(0);
}
logger.trace('worker:' + cluster.worker.id + ' start at ' + processPwdStart + ' end at:' + processPwdEnd);
checkPassword(processPwdStart, processPwdEnd, iosKey, iosSalt, retHandler);
}