Search Archive

printing strings from language (.LNG) files

By pionara · Oct 01, 2012in Hacks/Mods💬 1 posts👁️ 1,321 views
Posted Oct 01, 2012 · 18:17 UTC#1

wrote a script to dump strings out from the various LNG (language) files. (Still in progress - but functional)

This prints the hex "index" along with the string. Some (most?) strings are referenced by calling AL_SystemLanguage::GetString(int, char* &), where index of the string is first arg (R1) passed. Frequently in the code, this is passed by OR'ing two parts together, e.g.:

MOV R2, #0xb00

ORR R1, R2, #0x23

to get 0xb23

 

You can then look up strings:

 

./printstrings.pl EUGBENG.LNG | grep ^0b23
0b23: Call <name><type>

 

 

currently im looking for the strings that populate system menu with 017b. I think it's possible to enable the safemode on/off switch in settings menu (aka soft-PKB-mod) of UC devices.

The problem, is that at least frequently, R1 is passed in from some calling routine, or many levels up, or from a memory location. (still working on mapping out the SetupBKUP.dat map ;)

 

 

./printstrings.pl EUGBENG.LNG |grep ^017
0170: None
0171: Delete
0172: Settings Menu
0173: Navi Settings
0174: System Settings
0175: AV Settings
0176: AV Sound
0177: Map Settings
0178: Bluetooth Settings
0179: Setting Replicator
017a: Screen Off
017b: Safe Mode
017c: On
017d: Off
017e: MSN Direct
017f: Gas Prices

 

 

update:

Anyhow - found where "Safe Mode" switch in menu is disabled/enabled - yay!

Now onto that pesky "Caution" screen... I suspect it will be trickier to find...

 


# usage: printstrings.pl LANGFILE.LNG

my $filename = shift;
open(my $fh, $filename) or die $!;
binmode($fh);

my $cnt = 0;
my @mapkeys;
my $strlen;
my $stroffset;

# skip header
seek($fh, 0x40, 0);

# loop through map
while ( read($fh, my $bytes, 4) )
{
$currdword = unpack('L*', $bytes);
if ($cnt == 0)
{
$prevdword = $currdword;
$start = $currdword;
$cnt++;
next;
}
$stroffset = ($prevdword - $start) * 2;
$strlen = ($currdword - $prevdword) * 2;
$cnt++;
$prevdword = $currdword;
push @mapkeys, $stroffset;
if ( $currdword == 0 )
{
last;
}
}

# skip null dword marker?
seek($fh, 4, 1);

# loop through strings
my $strcnt = 0;
my $strout = "";
while ( read($fh, my $word, 2))
{
$char = unpack ('U*', $word);
if ($char != 0x0)
{
$strout = $strout . chr($char);
}
else
{
# end of string, print out
printf("%4.4x: %-.80s\n", $strcnt, $strout);
$strcnt++;
$strout = "";
}
}

close $fh;

Edited Oct 08, 2012 by pionara