Tutorial  Updated

Building NTR custom firmware cheat plugins w/ cheat menu

so thanks to @cell9 for releasing the source for NTR cheat plugins that use the cheat menu instead of the outdated button toggles method that has interference with certain games.
Today is the moment you've all been waiting for. this is some simple steps on building your own cheat plugins!
first there are some prerequisites:
you'll need python 2.7 from here
https://www.python.org/download/releases/2.7/
and devkitpro from here
https://gbatemp.net/threads/ds-programming-environment-on-windows.292386/
and you'll need a computer with Windows XP/Vista/7/8/8.1/10 edit: this also works on the Ematic tablet computer that has Windows 8.1 on it
then get @cell9 's source code here
http://gbatemp.net/threads/source-cheat-menu-plugin-demo-for-ntr-cfw.411032/
and my improvement to the gameplg.c sample file here (i put a sample of adding in more cheat entries)
http://gbatemp.net/threads/source-cheat-menu-plugin-demo-for-ntr-cfw.411032/#post-5996714

ok so here's the steps

1) extract menuCheat.zip from @cell9 's source code thread and replace the gameplg.c in /menuCheat/source/ with the improved sample gameplg.c from my post.

2) open gameplg.c from /menuCheat/sources/ with your source code editor of choice (e.g. notepad++ on Windows or DroidEdit on Android), scroll to near the bottom where the cheats are and edit them with your own found with NTR debugger/Cheat Engine or from someone requesting a cheat plugin for codes they found but dont know how to build cheat plugins. then scroll down more for the cheat entry names and edit them to match the cheats you put in. to add more entries, simply follow the pattern and format of them with proper bracketing and tab-spacing and follow the numbering for the cheats (0, 1, 2, 3, 4, etc.) and hit save in your source code editor. make sure your edited gameplg.c is in /menuCheat/sources/ ! (use FTP transfers if you used DroidEdit like I did lmao)

3) then go to the /menuCheat/ folder and doubleclick the startenv.bat (make sure python and devkitpro are installed before you do this!) and it'll open a command prompt window with the directory aimed at /menuCheat/. then type in build.bat and hit enter! at this point it will run python and build your cheat plugin, which will appear in the /menuCheat/ folder. you can then place cheat.plg in /plugin/[titleid]/ with the appropriate titleid for your game from here
http://3dsdb.com/ and test your NTR custom firmware plugin cheats!
note: @cell9 said so himself that these plugins won't work online so don't expect to ruin games online with this!

Enjoy~
 
Last edited by supermariorick,

Tieracloud

Active Member
Newcomer
Joined
Apr 26, 2015
Messages
35
Trophies
0
Age
56
XP
101
Country
United States
so thanks to @cell9 for releasing the source for NTR cheat plugins that use the cheat menu instead of the outdated button toggles method that has interference with certain games.
Today is the moment you've all been waiting for. this is some simple steps on building your own cheat plugins!
first there are some prerequisites:
you'll need python 2.7 from here
https://www.python.org/download/releases/2.7/
and devkitpro from here
https://gbatemp.net/threads/ds-programming-environment-on-windows.292386/
and you'll need a computer with Windows XP/Vista/7/8/8.1/10 edit: this also works on the Ematic tablet computer that has Windows 8.1 on it
then get @cell9 's source code here
http://gbatemp.net/threads/source-cheat-menu-plugin-demo-for-ntr-cfw.411032/
and my improvement to the gameplg.c sample file here (i put a sample of adding in more cheat entries)
http://gbatemp.net/threads/source-cheat-menu-plugin-demo-for-ntr-cfw.411032/#post-5996714

ok so here's the steps

1) extract menuCheat.zip [email protected] 's source code thread and replace the gameplg.c in /menuCheat/source/ with the improved sample gameplg.c from my post.

2) open gameplg.c from /menuCheat/sources/ with your source code editor of choice (e.g. notepad++ on Windows or DroidEdit on Android), scroll to near the bottom where the cheats are and edit them with your own found with NTR debugger/Cheat Engine or from someone requesting a cheat plugin for codes they found but dont know how to build cheat plugins. then scroll down more for the cheat entry names and edit them to match the cheats you put in. to add more entries, simply follow the pattern and format of them with proper bracketing and tab-spacing and follow the numbering for the cheats (0, 1, 2, 3, 4, etc.) and hit save in your source code editor. make sure your edited gameplg.c is in /menuCheat/sources/ ! (use FTP transfers if you used DroidEdit like I did lmao)

3) then go to the /menuCheat/ folder and doubleclick the startenv.bat (make sure python and devkitpro are installed before you do this!) and it'll open a command prompt window with the directory aimed at /menuCheat/. then type in build.bat and hit enter! at this point it will run python and build your cheat plugin, which will appear in the /menuCheat/ folder. you can then place cheat.plg in /plugins/[titleid]/ with the appropriate titleid for your game from here
http://3dsdb.net/ and test your NTR custom firmware plugin cheats!
note: @cell9 said so himself that these plugins won't work online so don't expect to ruin games online with this!

Enjoy~

From Cell9's old source for Zelda it was using button presses and there are games where it is better for it. Mario games are an example where buttons presses are faster as you can switch quicker. Do you know if this source still allows it? Or would I have to base it off of the Zelda source?

Code:
        key = getKey();
        if (key == BUTTON_SE) {
            // toggle cheats when SELECT button pressed
            cheatEnabled = !cheatEnabled;
            // wait until key is up
            waitKeyUp();
        }
        if (cheatEnabled) {
            // freeze hearts
            WRITEU16(0x168b6044 , 0x5050);
            // freeze rupees
            WRITEU16(0x168b5fa8 , 9999);
        }

And by any chance do you know if you can combine in-game menu and button press methods in 1 plugin? And can you do a quick tutorial on how you would find the addresses needed? I have a rough idea from watching some gateway cheat tutorials but maybe a all in one tutorial here might make it easier.
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
From Cell9's old source for Zelda it was using button presses and there are games where it is better for it. Mario games are an example where buttons presses are faster as you can switch quicker. Do you know if this source still allows it? Or would I have to base it off of the Zelda source?

Code:
        key = getKey();
        if (key == BUTTON_SE) {
            // toggle cheats when SELECT button pressed
            cheatEnabled = !cheatEnabled;
            // wait until key is up
            waitKeyUp();
        }
        if (cheatEnabled) {
            // freeze hearts
            WRITEU16(0x168b6044 , 0x5050);
            // freeze rupees
            WRITEU16(0x168b5fa8 , 9999);
        }

And by any chance do you know if you can combine in-game menu and button press methods in 1 plugin? And can you do a quick tutorial on how you would find the addresses needed? I have a rough idea from watching some gateway cheat tutorials but maybe a all in one tutorial here might make it easier.
i dont have that information. although I suppose if you cross referenced the source codes of both gameplg.c files you could attempt to combine them and set up button toggles for some and cheat menu for others. if anything try asking @cell9 who just released the source code. as for finding addresses I don't have that information as I have done that for spider3dstools ARcode when Retroboy and I ported gameshark codes for Majora's Mask to spider ARcodes for the 3DS version; however I have yet to use NTR debugger to dump RAM and Cheat Engine to cross reference addresses in RAM but I suppose it's really a matter of dumping RAM enough times and cross referencing with values displayed on a game with searches on Cheat Engine updated with each RAM dump as it was with spiderhax on old3ds.
 

Tieracloud

Active Member
Newcomer
Joined
Apr 26, 2015
Messages
35
Trophies
0
Age
56
XP
101
Country
United States
i dont have that information. although I suppose if you cross referenced the source codes of both gameplg.c files you could attempt to combine them and set up button toggles for some and cheat menu for others. if anything try asking @cell9 who just released the source code. as for finding addresses I don't have that information as I have done that for spider3dstools ARcode when Retroboy and I ported gameshark codes for Majora's Mask to spider ARcodes for the 3DS version; however I have yet to use NTR debugger to dump RAM and Cheat Engine to cross reference addresses in RAM but I suppose it's really a matter of dumping RAM enough times and cross referencing with values displayed on a game with searches on Cheat Engine updated with each RAM dump as it was with spiderhax on old3ds.

Thanks. I will test a plugin with a basic maro game and see if I can get it to work. Got the button presses working last year but see some use for a game menu option. I am familiar with gateway cheats but never dived in to using ntr debugger so guess I will try it out for now. Just wish gateway and ntr used the same codes as it would make it easier for everyone in terms of compatibility.
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
Thanks. I will test a plugin with a basic maro game and see if I can get it to work. Got the button presses working last year but see some use for a game menu option. I am familiar with gateway cheats but never dived in to using ntr debugger so guess I will try it out for now. Just wish gateway and ntr used the same codes as it would make it easier for everyone in terms of compatibility.
just don't ask me anything about Gateway as I don't own one.
 

Rhapsody

Well-Known Member
Member
Joined
Jan 4, 2016
Messages
252
Trophies
0
Age
26
Location
United States
Website
www.google.com
XP
672
Country
United States
Can anyone provide me with a guide that details how to convert ARCode or Gateshark codes to the NTR format? I'm giving making NTR plugins a try but I haven't really found a concrete way to do this.

Also, if a code is more than one line long, what do I do to make it into NTR format?
 

Angelcraft

Well-Known Member
Member
Joined
Sep 8, 2015
Messages
536
Trophies
0
Age
28
XP
353
Country
Spain
Can anyone provide me with a guide that details how to convert ARCode or Gateshark codes to the NTR format? I'm giving making NTR plugins a try but I haven't really found a concrete way to do this.

Also, if a code is more than one line long, what do I do to make it into NTR format?
pls that too
 

Rhapsody

Well-Known Member
Member
Joined
Jan 4, 2016
Messages
252
Trophies
0
Age
26
Location
United States
Website
www.google.com
XP
672
Country
United States
Quick tl;dr before you get excited reading this post, it didn't work and froze the game, but I think I might be on the right path.

So I was messing around with RAM dumps of Fire Emblem Awakening to try and see if I could locate the money value and change it. I made a RAM dump (using the first option out of three for the process, those being 0x00100000, 0x08000000, and 0x14000000, in order). On the first RAM dump I made, I looked for the value of the money I had using Cheat Engine and the default settings after loading a file (4 Bytes value type, Equal To search criteria, etc.), and I found one result when looking for that, so I noted it down. Cheat Engine reported it as 00369200. I went back into the game and made another RAM dump after selling an item and getting more money. Thing is, this time I got two values matching the criteria (360), and neither of them were the same as before. In particular, they were 000358AC and 00035968. For shits and giggles I edited the plugin source to use the first value and set it to 9999, here's what I did;

Code:
// freeze the value
void freezeCheatValue() {
   if (cheatEnabled[0]) {
     WRITEU16(0x00369200, 0x0000270F);
   }
   // TODO: handle your own cheat items
}

Note the first part, that's the result that I got from my first dump. The second one is hex for 9999.

After compiling the plugin and loading it on my game, it loaded fine and showed up in my NTR CFW menu. Issue is when I loaded into my save and used the code, the game crashed, so something clearly wasn't right with what I did (as if that wasn't obvious after I got three different values). So what do I need to do?
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
Can anyone provide me with a guide that details how to convert ARCode or Gateshark codes to the NTR format? I'm giving making NTR plugins a try but I haven't really found a concrete way to do this.

Also, if a code is more than one line long, what do I do to make it into NTR format?
don't ask me how to convert from Gateshark as I do not have a Gateway; however usually spider arcode to NTR code is +0x14000000 unless the memory addresses for NTR for a game are out of range from the addresses for spider arcode due to physical memory addresses vs virtual memory addresses. as for codes more than one line long, the old source code has an example

if (cheatEnabled) {
// freeze hearts
WRITEU16(0x168b6044 , 0x5050);
// freeze rupees
WRITEU16(0x168b5fa8 , 9999);
}
 
Last edited by supermariorick,

Rhapsody

Well-Known Member
Member
Joined
Jan 4, 2016
Messages
252
Trophies
0
Age
26
Location
United States
Website
www.google.com
XP
672
Country
United States
don't ask me how to convert from Gateshark as I do not have a Gateway; however usually spider arcode to NTR code is +0x14000000 unless the memory addresses for NTR for a game are out of range from the addresses for spider arcode due to physical memory addresses vs virtual memory addresses. as for codes more than one line long i have no idea myself.

I'm aware of that, but then what do I do with the second section of the code? Would I just put that there like it is in the code I posted?

And for multi-line ARCodes, what do I do? Or is there no way to convert those?
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
I'm aware of that, but then what do I do with the second section of the code? Would I just put that there like it is in the code I posted?

And for multi-line ARCodes, what do I do? Or is there no way to convert those?
i just edited my post with an answer
basically as long as it remains in the brackets for the code then multiple lines can be used for one code as long as it follows the WRITEU16([address], [value]); format for each line
perhaps it's time to update my example gameplg.c with that info
 
Last edited by supermariorick,

Rhapsody

Well-Known Member
Member
Joined
Jan 4, 2016
Messages
252
Trophies
0
Age
26
Location
United States
Website
www.google.com
XP
672
Country
United States
i just edited my post with an answer

Thanks for specifying. Just to be sure, if I were to use a code like, say;

Code:
// x255 of all items
03EDFB18 0A000031
03EDFBA8 0A00000D
03EDFBC4 0A000006
03EDFBD4 E3A010FF
E3EDFBD8 00000018
0210C4E5 0600A0E1
0C19FEEB 04D08DE2
048BBDEC 460100EA

I would do this;

Code:
if (cheatEnabled) {
WRITEU16(line1leftcodewithoffset, line1rightcode);
WRITEU16(line2leftcodewithoffset, line2rightcode);
WRITEU16(line3leftcodewithoffset, line3rightcode);
WRITEU16(line4leftcodewithoffset, line4rightcode);
WRITEU16(line5leftcodewithoffset, line5rightcode);
WRITEU16(line6leftcodewithoffset, line6rightcode);
WRITEU16(line7leftcodewithoffset, line7rightcode);
WRITEU16(line8leftcodewithoffset, line8rightcode);
}

Correct?

And while we're here, I guess I'll ask one last thing, since there are actually two questions left I need answered. Firstly, as I mentioned above, do you know what I'm doing wrong with RAM dumping and finding the value I'm looking for? And secondly, what's the difference between WRITEU16 and WRITEU32? Do they have different use cases?
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
Thanks for specifying. Just to be sure, if I were to use a code like, say;

Code:
// x255 of all items
03EDFB18 0A000031
03EDFBA8 0A00000D
03EDFBC4 0A000006
03EDFBD4 E3A010FF
E3EDFBD8 00000018
0210C4E5 0600A0E1
0C19FEEB 04D08DE2
048BBDEC 460100EA

I would do this;

Code:
if (cheatEnabled) {
WRITEU16(line1leftcodewithoffset, line1rightcode);
WRITEU16(line2leftcodewithoffset, line2rightcode);
WRITEU16(line3leftcodewithoffset, line3rightcode);
WRITEU16(line4leftcodewithoffset, line4rightcode);
WRITEU16(line5leftcodewithoffset, line5rightcode);
WRITEU16(line6leftcodewithoffset, line6rightcode);
WRITEU16(line7leftcodewithoffset, line7rightcode);
WRITEU16(line8leftcodewithoffset, line8rightcode);
}

Correct?

And while we're here, I guess I'll ask one last thing, since there are actually two questions left I need answered. Firstly, as I mentioned above, do you know what I'm doing wrong with RAM dumping and finding the value I'm looking for? And secondly, what's the difference between WRITEU16 and WRITEU32? Do they have different use cases?
needs proper tabspacing but the format above is correct. as for RAMdumping and finding the codes with NTR debugger ramdumps and cheat engine I have no idea since I haven't tried myself. I have done RAM dumps with spider ARcode but I haven't applied the steps for NTR. my test example gameplg.c has someone else's codes that they requested a cheat plugin be made for.

WRITEU16 is for 16 bit cheat codes (0x1AAAAAAA, 0x0000BBBB) and WRITEU32 is for 32 bit cheat codes (0x0AAAAAAA, 0xBBBBBBBB) and WRITEU8 is for 8 bit cheat codes (0x2AAAAAAA, 0x000000BB) it looks like.
 
Last edited by supermariorick,

Rhapsody

Well-Known Member
Member
Joined
Jan 4, 2016
Messages
252
Trophies
0
Age
26
Location
United States
Website
www.google.com
XP
672
Country
United States
needs proper tabspacing but the format above is correct. as for RAMdumping and finding the codes with NTR debugger ramdumps and cheat engine I have no idea since I haven't tried myself. I have done RAM dumps with spider ARcode but I haven't applied the steps for NTR. my test example gameplg.c has someone else's codes that they requested a cheat plugin be made for.

Gotcha, thanks for the help. Trying out the ARCode conversion stuff you talked about and it seems to be working just fine, At least, the one line version did. I tried out this code;

Code:
// All enemy items drop
03D99848 E1D11AB2
03D9984C E3510000

I converted it to NTR format by adding 14000000 to the first line, and this is what I have;

Code:
  if (cheatEnabled[1]) {
     WRITEU16(0x17D99848, 0xE1D11AB2); // All enemies drop their items upon death.
     WRITEU16(0x17D9984C, 0xE3510000);
   }

I compiled it and tested it, but it makes the game crash. Any idea what's up? Hopefully this'll be the last bit of help I need, sorry if I'm bothering you.
 

supermariorick

Well-Known Member
OP
Member
Joined
Jun 18, 2010
Messages
640
Trophies
1
XP
803
Country
United States
Gotcha, thanks for the help. Trying out the ARCode conversion stuff you talked about and it seems to be working just fine, At least, the one line version did. I tried out this code;

Code:
// All enemy items drop
03D99848 E1D11AB2
03D9984C E3510000

I converted it to NTR format by adding 14000000 to the first line, and this is what I have;

Code:
  if (cheatEnabled[1]) {
     WRITEU16(0x17D99848, 0xE1D11AB2); // All enemies drop their items upon death.
     WRITEU16(0x17D9984C, 0xE3510000);
   }

I compiled it and tested it, but it makes the game crash. Any idea what's up? Hopefully this'll be the last bit of help I need, sorry if I'm bothering you.
move the comment (the one with the //afsgxryhh ) out of the brackets. that's how cell9 put in comments. don't put notes in places they would interfere with bracketed lines of scripts.

it should be
Code:
  if (cheatEnabled[1]) {
     WRITEU16(0x17D99848, 0xE1D11AB2);
     WRITEU16(0x17D9984C, 0xE3510000);
   }
// All enemies drop their items upon death.
 
Last edited by supermariorick,
  • Like
Reactions: UnlimitedDietWorks
General chit-chat
Help Users
  • No one is chatting at the moment.
  • JuanMena @ JuanMena:
    Kissing random dudes choking in celery? Really? Need to study for that?
  • K3N1 @ K3N1:
    Yes it requires a degree
  • K3N1 @ K3N1:
    I could also yank out the rest of my teeth but theirs professionals for that
  • x65943 @ x65943:
    If your throat closes, putting oxygen in your mouth will not solve anything - as you will be introducing oxygen prior to the area of obstruction
  • JuanMena @ JuanMena:
    Just kiss me Kyle.
  • x65943 @ x65943:
    You either need to be intubated to bypass obstruction or create a stoma inferior to the the area of obstruction to survive
  • x65943 @ x65943:
    "Just kiss me Kyle." And I thought all the godreborn gay stuff was a smear campaign
  • JuanMena @ JuanMena:
    If I die, tell my momma I won't be carrying Baby Jesus this christmas :sad::cry:
  • K3N1 @ K3N1:
    Smear campaigns are in The political section now?
  • JuanMena @ JuanMena:
    Chary! Chary! Chary, Chary, Chary!
  • Sonic Angel Knight @ Sonic Angel Knight:
    Pork Provolone :P
  • Psionic Roshambo @ Psionic Roshambo:
    Sounds yummy
  • K3N1 @ K3N1:
    Sweet found my Wii u PSU right after I ordered a new one :tpi:
  • JuanMena @ JuanMena:
    It was waiting for you to order another one.
    Seems like, your PSU was waiting for a partner.
  • JuanMena @ JuanMena:
    Keep them both
    separated or you'll have more PSUs each year.
  • K3N1 @ K3N1:
    Well one you insert one PSU into the other one you get power
  • JuanMena @ JuanMena:
    It literally turns it on.
  • K3N1 @ K3N1:
    Yeah power supplies are filthy perverts
  • K3N1 @ K3N1:
    @Psionic Roshambo has a new friend
    +1
  • JuanMena @ JuanMena:
    It's Kyle, the guy that went to school to be a Certified man Kisser.
  • Psionic Roshambo @ Psionic Roshambo:
    Cartmans hand has taco flavored kisses
  • A @ abraarukuk:
    hi guys
  • Iron_Masuku @ Iron_Masuku:
    Hello
    Skelletonike @ Skelletonike: hmm