diff --git a/doc/README.ios7 b/doc/README.ios7
new file mode 100644
index 0000000000..69c530e50d
--- /dev/null
+++ b/doc/README.ios7
@@ -0,0 +1,20 @@
+Cracking IOS 7 restrictions PIN code
+====================================
+
+1. Fetch the file com.apple.restrictionspassword.plist from your phone. How
+ you do this is out of scope for this document, just google it.
+
+
+2. Run ios7tojohn on that file, redirecting output to a new file. Eg:
+
+ $ ./ios7tojohn com.apple.restrictionspassword.plist > ioshash
+
+
+3. Run john on the new file, only using four digits (it's a PIN code):
+
+ $ ./john ioshash -inc:digits -min-len=4 -max-len=4
+
+
+4. The password will get cracked in a split second. This is not because Apple
+ used a very poor hash mechanism but because the keyspace of a PIN code is
+ so very tiny.
diff --git a/run/ios7tojohn.pl b/run/ios7tojohn.pl
new file mode 100755
index 0000000000..7bf2d65107
--- /dev/null
+++ b/run/ios7tojohn.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/env perl -w
+#
+# This software is Copyright (c) 2014 magnum
+# and it is hereby released to the general public under the following terms:
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted.
+
+use strict;
+use MIME::Base64;
+use File::Basename;
+
+# Example input (from com.apple.restrictionspassword.plist):
+# RestrictionsPasswordKey
+#
+# J94ZcXHm1J/F9Vye8GwNh1HNclA=
+#
+# RestrictionsPasswordSalt
+#
+# /RHN4A==
+#
+#
+# Example output:
+# $pbkdf2-hmac-sha1$1000.fd11cde0.27de197171e6d49fc5f55c9ef06c0d8751cd7250
+
+die "Usage: $0 [file [file...]]\n" if ($#ARGV < 0);
+
+my ($type, $key, $salt) = ();
+
+while(<>) {
+ s/\r//g; # Drop Redmond Garbage[tm]
+ if (m#^\s*(.*)Key\s*$#) {
+ $type = $1;
+ next;
+ }
+ # Single line
+ if ($type && m#^\s*([0-9a-zA-Z/.=]+)\s*$#) {
+ my $data = $1;
+ if (!$key) {
+ $key = $data;
+ } elsif (!$salt) {
+ $salt = $data;
+ print "$type:\$pbkdf2-hmac-sha1\$1000.${salt}.${key}:::", basename($ARGV, ".plist"), "::${ARGV}\n";
+ $type = $key = $salt = undef;
+ next;
+ } else {
+ die "Error parsing file ${ARGV} line $.\n";
+ }
+ }
+ # Multi line (but all data on one line)
+ elsif ($type && m#^\s*\s*$#) {
+ my $data = unpack("H*", decode_base64());
+ if (!$key) {
+ $key = $data;
+ } elsif (!$salt) {
+ $salt = $data;
+ print "$type:\$pbkdf2-hmac-sha1\$1000.${salt}.${key}:::", basename($ARGV, ".plist"), "::${ARGV}\n";
+ $type = $key = $salt = undef;
+ next;
+ } else {
+ die "Error parsing file ${ARGV} line $.\n";
+ }
+ }
+}