Pages

Tuesday, January 8, 2013

Resetting and Unlocking a Nintendo DSi Parental Control Lock

So I inherited a nintendo DSi, and it had a parental lock code on it. I tried to brute force either the unlock code or the security question, but no luck. So I turned to Google and found this :
Wii Parental Control password reset tool .

Yes, it does say it is for the Wii, but Nintendo uses the same algorithm for the DSi.

To reset the Parental Control Lock for the Nintendo DSi
Go to:
System Settings -> Parental Controls -> Yes Change Parental Controls -> Pin I forgot -> security question I forgot ->  Get the Inquiry Number and write it down

Go to http://wii.marcansoft.com/parental.wsgi 
And enter the Inquiry Number as the Confirmation Number
And select the date that the DSi is currently set to.

This gives you an unlock code and you can enter it into the next screen on the DSi
Go back to the DSi and hit OK

Enter the unlock code and you will have access to the parental control panel where you can edit the PIN or turn it off completely.

Here is the code that actually calculates the algorithm, thought it was neat to see how the website works :

 #!/usr/bin/python  
# Wii parental control password reset tool
#
# Copyright 2008-2009 Hector Martin Cantero <hector@marcansoft.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 or version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
import time, urlparse
def application(environ, start_response):
start_response("200 OK", [("Content-type","text/html")])
yield """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Wii Parental Control Password Resetter</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
.title {
font-size: 18pt;
font-family: sans-serif;
}
.response {
font-size: 16pt;
font-family: sans-serif;
}
.error {
color: red;
font-size: 16pt;
font-family: sans-serif;
}
</style>
</head>
<body>
<div class="title">Wii Parental Control password reset tool</div>"""
uri = environ["REQUEST_URI"]
qs = urlparse.urlparse(uri).query
form = urlparse.parse_qs(qs)
ctime = time.time()
def opt_date(delta):
t = time.gmtime(ctime + delta * 3600 * 24)
if delta == 0:
selected = ' selected="selected"'
else:
selected = ""
return '<option value="%02d%02d" %s>%s</option>'%(t.tm_mon,t.tm_mday,selected,time.strftime("%a, %d %b %Y",t))
class CRC32:
def __init__(self):
self.gentable()
def crc32(self, input, crc=0xffffffffl):
count = len(input)
i = 0
while count != 0:
count -= 1
temp1 = (crc >> 8) & 0xFFFFFF
temp2 = self.table[(crc ^ ord(input[i])) & 0xFF]
crc = temp1 ^ temp2
i += 1
return crc
def gentable(self):
self.table = []
for i in range(256):
crc = i
for j in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0xEDB88320l
else:
crc >>= 1
self.table.append(crc)
def error(s):
return '<div class="error">%s</div>'%s
def process():
try:
int(form["number"][0]) #validate
if len(form["number"][0]) != 8 or not all([x in "0123456789" for x in form["number"][0]]):
raise ValueError()
except:
return error("Please provide a valid 8-digit confirmation number")
try:
int(form["date"][0]) #validate
if len(form["date"][0]) != 4 or not all([x in "0123456789" for x in form["date"][0]]):
raise ValueError()
except:
return error("Invalid date")
fullnum = form["date"][0] + form["number"][0][4:8]
crc = CRC32().crc32(fullnum)
code = ((crc ^ 0xaaaa) + 0x14c1) % 100000
return '<div class="response">Your unlock code:<span class="code">%05d</span></div>'%code
if form.has_key("submit"):
yield process()
yield """
<div class="form">
<form action="/parental.wsgi">
<p>Confirmation Number:
<input name="number" type="text" size="9" maxlength="8" value="" /></p>
<p>Current Date in your timezone:
<select name="date" size="1">"""
yield opt_date(-1)
yield opt_date(0)
yield opt_date(1)
yield """</select><br /></p>
<p><input name="submit" type="submit" value="Get Reset Code" /></p>
</form>
</div>
<p>
<a href="http://validator.w3.org/check?uri=referer"><img
src="http://www.w3.org/Icons/valid-xhtml10-blue"
alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a>
<a href="http://jigsaw.w3.org/css-validator/">
<img style="border:0;width:88px;height:31px"
src="http://jigsaw.w3.org/css-validator/images/vcss-blue"
alt="Valid CSS!" />
</a>
<br />
<a href="parental.txt">Source code</a>
</p>
</body>
</html>"""

21 comments:

  1. Saved Christmas. Stupid shop selling second-hand DSis without checking for PINs...

    ReplyDelete
  2. Nintendo PIN resets now make you pay $0.50 to get the master key, which is extremely annoying when you cant access a credit card.

    ReplyDelete
  3. using nintendo 3ds, the inquiry code has an extra two digits. I forgot my pin, and dont have a credit card. pls halp!

    ReplyDelete
  4. Mine had two extra digits as well. Did you find a solution?

    ReplyDelete
  5. This actually worked. But what if it's used for malicious purposes?

    ReplyDelete
  6. How do get a master key for. My Nintendo DS XL

    ReplyDelete
    Replies
    1. Please help me find the master key for a Nintendo DS Excel

      Delete
  7. its 2020, and it still works! Thank you for this.

    ReplyDelete
  8. What if my inquiry number is 10 digits opposed to 8??? It won't let me input the 2 extra digits

    ReplyDelete
    Replies
    1. I used this site and paid the $.50 to get a master code and it worked! You’ll be able to set a new pin and email. https://parentalcontrols.nintendo.com/?sys=n3ds

      Delete
  9. This totally works. Using this in 2021! Bought an old DSI at my local pawn shop. Found this on google before paying the 50 cents. Yes it is only a 50 cents but there is something very satisfying about finding a work around.

    ReplyDelete