雷叔的诅咒 - 关于DS固件中用户信息的修改



雷精灵
2009-04-13 11:51:23

人类企图将世间的所有事物,都印证上自己的标记,以显示自己的存在。此外,不甘心千篇一律毫无特征的量产型,人类还企图显示出自己的与众不同。于是,无论从软件上还是从硬件上,各种各样的MOD就出现了。修改PC BIOS或开机画面,修改PSP开机画面和用户名称,最终,人类的魔掌伸到了DS的领域。
然而,任地狱已经预见到了这种邪恶的行为,从GB到GBA再到DS,对于主机固件的加密措施,可谓越来越严密。神圣的任地狱,花费了巨大的精力为DS的固件进行数据校验光环加持,而芯片写保护防御结界,更是不要钱似的拼命施加。更有甚者,伟大、神圣且高尚的任地狱居然舍得使用神器SL1,将部分固件数据进行硬件写保护防御……不过这些措施并没有阻挡到邪恶的人类,一个叫做雷叔的堕落者,终于禁不住恶魔的诱惑,将他那猥琐的视线和肮脏的双手,触摸到了DS的禁区……这个故事,就从这里开始~~~

[color=red]资本主义来到世间,从头到脚,每个毛孔都滴着血和肮脏的东西。——卡尔·马克思《资本论》[/color]

“[color=blue]なにぃぃぃぃぃぃぃぃぃ?![/color]”哪怕听到诸神之黄昏的消息,也不会发出比这更惊讶的惊呼了。众人看着那个若无其事,翘着二郎腿宣布这个消息的雷叔,个个脸上大惊失色。“[color=blue]你要修改DS的固件?[/color]”
“[color=darkorchid]精确地说,应该是修改固件中的用户信息那一部分数据。[/color]”雷叔把整个身体陷在柔软的椅子中,懒洋洋地拿出一幅图。
[attach]1096[/attach]
“[color=dimgray]那东西搞不好会让DS变砖的吧?[/color]”牛叔怯生生地说,唯恐那个恐怖的词语会把众人吓住。
说的也是,“DS变砖”!多么恐怖且危险的词语!这意味着什么?这意味着DS的死亡~
“[color=green]你想把原来的系统改了?[/color]”w叔问道。不知这个家伙安的什么心,听到这种消息居然还能这么冷静。
“[color=darkorchid]先不管iQueDS,咱们就先看普通的DS。[/color]”雷叔没有回答牛叔和w叔的疑问,径自说道。
“[color=darkorchid]据我所知,固件里面有个字库,是SJIS字库。但是DS的固件设置里面,用户名和用户信息是无法输入日文汉字的。而用户名和用户信息在固件里面是以UTF16编码保存的。也就是说,我们可以设法修改固件里面的用户信息等资料,直接修改数据,使得固件可以显示“日文汉字”的用户名和用户信息![/color]”雷叔一口气把整个计划说了出来,脸上掩饰不住的跃跃欲试。
“[color=green]关键一点,固件写入不是这么简单的吧?[/color]”w叔一阵见血地指出整个计划的薄弱点。
“[color=darkorchid]不,固件的写入确实不难。[/color]”雷叔突然正容,严肃的说。“[color=darkorchid]只有SPI才可以访问固件。但是由于只有arm7才可以操纵SPI,所以我必须修改default arm7的代码模版。[/color]”说完之后,雷叔又看了看周围已经被镇住的众人,吐了吐舌头,露出一个顽皮的笑容:“[color=darkorchid]default这个单词我是不是写错了?[/color]”
“[color=blue]……[/color]”众人已经不知道说什么好了。
“[color=darkorchid]事实上,我在用PALIB的时候,就曾经修改过arm7的代码,加入了对固件进行写操作的函数。并且有严密的数据校验以保证不会变砖。[/color]”雷叔的脸上充满自信,然后立刻扭成苦瓜脸:“[color=darkorchid]但是,我不会从arm9向arm7发送命令,因此也无法启动那个邪恶的函数~~~~[/color]”
“[color=blue]你确定要做?[/color]”众人问。虽然明知结果,但依然抱着不切实际的幻想,希望雷叔能够悬崖勒马。
“[color=darkorchid]嗯。[/color]”确定无误的答复。众人最后的希望终于破灭。
“[color=blue]好きにするがいい~[/color]”“[color=blue]为你和你的DS默哀……[/color]”明白事情已经无法挽回,众人逐渐散去,留下了不管是安慰还是放纵的话。

[color=red]信義のため、起たねばならぬ!——浅井长政《无双切菜》[/color]

[code]
#ifdef ARM7

typedef void(*call3)(u32,void*,u32);

void read_nvram(u32 src,void *dst,u32 size){
((call3)0x2437)(src,dst,size);
}

u8 writeread(u8 data){
while(REG_SPICNT & SPI_BUSY);
REG_SPIDATA=data;
while(REG_SPICNT & SPI_BUSY);
return REG_SPIDATA;
}

int flash_verify(u8 *src,u32 dst){
int i;
u8 tmp[256];
//write enable
REG_SPICNT=SPI_ENABLE|SPI_CONTINUOUS|SPI_DEVICE_NVRAM;
writeread(6);
REG_SPICNT=0;
//Wait for Write Enable Latch to be set
REG_SPICNT=SPI_ENABLE|SPI_CONTINUOUS|SPI_DEVICE_NVRAM;
writeread(5);
while((writeread(0)&0x02)==0);//Write Enable Latch
REG_SPICNT=0;


//page write
REG_SPICNT=SPI_ENABLE|SPI_CONTINUOUS|SPI_DEVICE_NVRAM;
writeread(0x0A);
writeread((dst&0xff0000)>>16);
writeread((dst&0xff00)>>8);
writeread(0);
for(i=0;i<256;i++) {
writeread(src);
}
REG_SPICNT=0;
// wait programming to finish
REG_SPICNT=SPI_ENABLE|SPI_CONTINUOUS|SPI_DEVICE_NVRAM;
writeread(0x05);
while(writeread(0)&0x01);//Write In Progress
REG_SPICNT=0;
//read back & compare
read_nvram(dst,tmp,256);
for(i=0;i<256;i++){
if(tmp!=src)return 0;
}
return 1;
}

#endif
[/code]
雷叔从垃圾堆一般的PALIB中,终于翻出来当年添加进去的关于写DS固件的函数。整理了一下,添加到了default arm7的代码模版中。
“[color=darkorchid]但是,我怎么才能启动这部分代码,并且让它们按照我的要求修改指定地址的数据呢?嗯……还需要一个接口~~~[/color]”雷叔如是说。
于是雷叔又修改了主循环的代码:
[code]
int isModify=0;
// Keep the ARM7 mostly idle
while (1){
swiWaitForVBlank();
if(isModify==0){
u16 ver1,ver2;
u8 fw_data[0x100];
//Code here to put the users settings into the fw_data area.
memcpy(fw_data,PersonalData,sizeof(PERSONAL_DATA));
fw_data[0x06]=0x96;
fw_data[0x07]=0xF7;
fw_data[0x08]=0x7C;
fw_data[0x09]=0xBE;
fw_data[0x0A]=0x97;
fw_data[0x0B]=0x0A;
// crc
short calcCRC=swiCRC16(0xffff,fw_data,sizeof(PERSONAL_DATA));
fw_data[0x72]=calcCRC&0xFF;
fw_data[0x73]=(calcCRC>>8)&0xFF;
read_nvram(0x3FE70,&ver1,2);
read_nvram(0x3FF70,&ver2,2);//Check to see which setting area is older.
if(ver1 else flash_verify(fw_data,0x3FF00);
isModify=-1;
}
}
[/code]

添加完上面的代码之后,雷叔一脸得意:“[color=darkorchid]DS的固件很有趣:固件中一共有两块区域用于保存用户信息。这两块区域中都有一个特定地址用于保存当前区域数据的校验。
DS靠如下机制进行校验:BIOS本身自动对两块区域分别进行数据校验。校验结果如果和那个特定地址相符,则两块区域谁比较新以谁为准。如果两块区域有一块校验失败另一块校验成功则以成功那块为准。如果两次校验都失败则显示上图要求用户重新设置。
现在,我首先从固件中读出原本的数据,然后将其复制到指定区域。然后修改这块区域中的数据。嗯……现在则是直接修改用户名。从0x06到0x0B,是“雷精霊”这三个字的UTF16编码数据。考虑到DS的CPU是ARM,因此先假设UTF16是LE。将数据修改之后,紧接着对这块区域进行crc校验。校验数据直接写入校验地址即0x72和0x73。最后将新数据写入固件。[/color]”
“[color=blue]那就上真机测试吧!不晓得模拟器怎么测试arm7的固件,是死是活就看这一步了。[/color]”既然生米已经煮成熟饭,众人也不再坚持,反而开始催促雷叔抓紧时间测试。
雷叔颤抖的双手,启动了ROM。在点下ROM图标的那一瞬间,雷叔明白,DS至少有50%的可能,再也无法启动起来了。
估摸着时间差不多了,雷叔关闭了主机,拔下烧录卡,再次启动了主机。所有人的脑袋都凑了过来。
DS的BIOS界面!启动成功了!DS没有变砖!
雷叔清楚的听到了心脏从喉咙回到胸腔的声音。然后雷叔点击了进入固件设置的图标。
[attach]1097[/attach]
“[color=blue]哎?[/color]”用户名赫然显示成三个“@”符号!
“[color=darkorchid]不是LE,是BE吧?[/color]”雷叔首先反应过来,提出了猜测。然后,不等众人回答,立刻修改了代码然后重新测试。
但是换成BE之后,依然还是三个@符号……
“[color=blue]……[/color]”周围瞬间寂静了。
“[color=blue]これはどういうことだ?[/color]”终于有人打破了沉默。
“[color=blue]……[/color]”没人回答。不过,所有人的视线,都聚集到了雷叔的脸上。
“[color=darkorchid]这让我想起来官方游戏在DS里面显示出来的标题和描述那三行文字,都没有汉字。”雷叔又开始顾左右而言他。“根据GBATEK的描述,这三行文字也是UTF16编码的。而且,对于正版游戏来说,是通过BIOS界面引导,因此我猜测也是使用固件中的字库进行显示。
但是我没有见到哪个官方游戏在这里显示出日文汉字名称的游戏标题,因此我猜测固件里面恐怕根本就没有日文汉字字库……就像恶魔城一样,游戏从不显示为“恶魔城 - 蒼月の十字架”,而非得显示成“あくまじょドラキュラー そうげつのじゅうじか”……这恐怕就是证据~~~~[/color]”
“[color=olive]不能显示汉字的原因呢?bios界面中文字输出没有考虑汉字?[/color]”刘叔问道。
“[color=darkorchid]我猜测是普通DS里面没有日文汉字字库。[/color]”雷叔似乎是在斟酌词句,慢慢地说道。
“[color=olive]不是说有字库吗?[/color]”刘叔不死心。
“[color=darkorchid]纵观整个BIOS界面,没有什么地方要求进行日文汉字显示输出。至于那些说明文字,我猜测,恐怕全都是现成的图片。哪怕就是PicoChat,也只能用里面内置的模拟键盘进行输入。也就是只能输入那些特定的字符。[/color]”雷叔似乎想起新的证据。
“[color=olive]没戏了……下班。[/color]”刘叔终于放弃继续询问。众人也开始逐渐散去。
“[color=darkorchid]不过,这就出现了一个值得深究的问题:话说iQueDS比普通DS的固件大了一倍,据说就是容纳汉字字库。也就是说,可以证实iQueDS中是存在汉字字库的。那么,如果使用iQueDS进行测试,那么结果将会是什么样子呢?[/color]”雷叔却还在自言自语,然后,又突然间想起什么似的,一扫刚才实验失败的沮丧,整个人都兴奋了起来:“[color=darkorchid]那啥,为什么iQueDS的游戏不能在普通DS上玩呢?恐怕这也和字库有关~~~~我记得,iQueDS的游戏是可以在iQueDS主机上的BIOS界面显示中文游戏名称的。[/color]”
“[color=olive]iqueds游戏不能在普通ds上玩么?[/color]”刘叔停下脚步,扭头问道。
“[color=darkorchid]正版卡确实是无法玩的。[/color]”雷叔说。“[color=darkorchid]至于通过烧录卡引导的iQueDS游戏的ROM,由于直接跳过了BIOS界面,因此就避免了这个问题。看来,我拥有两台普通DS,真是个错误~~~~[/color]”雷叔摸了摸自己那没长胡子的下巴,悻悻的说。
“[color=blue]坏了……我看不妙……[/color]”“[color=blue]趁现在快溜![/color]”众人像是突然意识到什么似的,一个个全都拔腿就跑。
紧接着,众人身后传来雷叔的嚎叫:“[color=darkorchid]那啥,群里面的弟兄们,谁拥有iQueDS主机,且愿意当小白鼠的,请PM我~~~~哎——你们别跑啊~~~~[/color]”

[color=red]人は何かを犠牲なしに、何も得ることはできない。何かを得るためには、同等の代価を必要になる。それが錬金術における等価交换の原則だ。そのころ僕らはそれが世界の真実だと信じていた。——阿尔方斯·艾尔力克《钢之炼金术师》[/color]

被众人抛弃的雷叔没有放弃他那邪恶的念头,跑去游说六面叔。因为六面叔刚好有一台IDSL。
“[color=darkorchid]六面叔~愿意当小白鼠吗?[/color]”
六面叔立刻吓出一身的冷汗。
“[color=darkred]能变砖吗?[/color]”六面叔明白雷叔看中的是他的IDSL,不是他的身体。
“[color=darkorchid]能。至少,有50%的可能会变砖。[/color]”雷叔毫不迟疑地说。
顿时又把六面叔吓出一身冷汗。
“[color=olive]还好,不是100%……[/color]”刘叔满脸邪恶的笑容,似乎很期待IDSL的尸体。
“[color=darkorchid]不过,根据在普通DSL上的实验,代码还是很安全的。考虑到NDSL和IDSL的不同,我无法保证100%不会变砖,但至少可以保证不会变成彻头彻尾的砖。[/color]”雷叔终于说了句人话,从而不会让别人认为他是存心开砖窑的。
“[color=olive]还是要先研究个恢复的办法。[/color]”刘叔也终于说了句人话,从而不会让别人认为他是存心开火葬场的。
“[color=darkorchid]对。就算是真变成了砖,肯定还有救。[/color]”雷叔抛出了定心丸!
“[color=sienna]噢!那我就放心了!别变不回来就麻烦了![/color]”六面叔吃下了定心丸!HP全恢复!
“[color=darkorchid]我手里有别人dump出来的固件。就算是变成了砖,只要有备份固件就还有救。[/color]”雷叔说道。“[color=darkorchid]而且,就算是固件信息被破坏,根据我在普通DSL上测试的结果,烧录卡可以把DS强制引导起来。嗯。我当时对这个现象颇为惊异。[/color]”雷叔又抛出了一颗定心丸。
“[color=sienna]把你那个变砖的程序发过来吧![/color]”One little step for Uncle whm3d, one giant step for all DS users! 六面叔终于迈出了伟大的一步。(这句话怎么这么熟悉?我确认是亚历山大·洛马诺夫总理的名言……)

[color=red]我ら浅井の真の盟友は朝倉なり!義の名のお伴に信長を、織田信長を、打つ!——浅井长政《战国无双2》[/color]

雷叔把代码整理了一番。IDSL的固件中,用户数据保存在0x7FE00和0x7FF00这两块区域,而不是像NDSL一样保存在0x3FE00和0x3FF00。于是针对这两种固件,雷叔把代码修改为如下:
[code]
int isModify=0;
// Keep the ARM7 mostly idle
while (1){
swiWaitForVBlank();
if(isModify==0){
u16 ver1,ver2;
u8 fw_data[0x100];
//Code here to put the users settings into the fw_data area.
memcpy(fw_data,PersonalData,sizeof(PERSONAL_DATA));
#ifdef LITTLE_ENDIAN
fw_data[0x06]=0xF7;
fw_data[0x07]=0x96;
fw_data[0x08]=0xBE;
fw_data[0x09]=0x7C;
fw_data[0x0A]=0x75;
fw_data[0x0B]=0x70;
#else
fw_data[0x06]=0x96;
fw_data[0x07]=0xF7;
fw_data[0x08]=0x7C;
fw_data[0x09]=0xBE;
fw_data[0x0A]=0x70;
fw_data[0x0B]=0x75;
#endif
// crc
short calcCRC=swiCRC16(0xffff,fw_data,sizeof(PERSONAL_DATA));
fw_data[0x72]=calcCRC&0xFF;
fw_data[0x73]=(calcCRC>>8)&0xFF;
#ifdef IQUEDS
//Check to see which setting area is older.
read_nvram(0x7FE70,&ver1,2);
read_nvram(0x7FF70,&ver2,2);
// if(ver1// else flash_verify(fw_data,0x7FF00);
flash_verify(fw_data,0x7FE00);
flash_verify(fw_data,0x7FF00);
#else
read_nvram(0x3FE70,&ver1,2);
read_nvram(0x3FF70,&ver2,2);//Check to see which setting area is older.
// if(ver1// else flash_verify(fw_data,0x3FF00);
flash_verify(fw_data,0x3FE00);
flash_verify(fw_data,0x3FF00);
#endif
isModify=-1;
}
}
[/code]
六面叔战战兢兢地运行了代码。
[attach]1098[/attach]
这个画面又把六面叔吓出一身冷汗。
“[color=darkorchid]嗯……是crc校验错误……奇怪……crc没错啊!我刚才用NDSL测试过没有出错……看来IDSL在其他地方还有另外的数据校验……[/color]”雷叔看到这个熟悉的画面,自言自语。旁边六面叔哭天抢地“[color=sienna]我的IDSL啊~~~~[/color]”
终于,六面叔的救命稻草来了。
“[color=darkorchid]找到原因了。IDSL确实有额外的数据。[/color]”雷叔拿着GBATEK文档,一边仔细地看一边说。
根据GBATEK,IDSL果然在NDSL的无用数据区域还存在有用数据,并且,有用数据还存在crc校验。也正是因为这块数据没有被考虑进去,导致了上面那个画面的出现。
于是雷叔将代码修改为如下:
[code]
int isModify=0;
// Keep the ARM7 mostly idle
while (1){
swiWaitForVBlank();
if(isModify==0){
u16 ver1,ver2;
u8 fw_data[0x100];
//Code here to put the users settings into the fw_data area.
memcpy(fw_data,PersonalData,sizeof(PERSONAL_DATA));
#ifdef LITTLE_ENDIAN
fw_data[0x06]=0xF7;
fw_data[0x07]=0x96;
fw_data[0x08]=0xBE;
fw_data[0x09]=0x7C;
fw_data[0x0A]=0x75;
fw_data[0x0B]=0x70;
#else
fw_data[0x06]=0x96;
fw_data[0x07]=0xF7;
fw_data[0x08]=0x7C;
fw_data[0x09]=0xBE;
fw_data[0x0A]=0x70;
fw_data[0x0B]=0x75;
#endif
// crc
short calcCRC=swiCRC16(0xffff,fw_data,sizeof(PERSONAL_DATA));
fw_data[0x72]=calcCRC&0xFF;
fw_data[0x73]=(calcCRC>>8)&0xFF;
#ifdef IQUEDS
// Get the extra data of the iQueDS
read_nvram(0x7FE74,(void*)(fw_data+0x74),0x100-0x74);
calcCRC=swiCRC16(0xffff,(void*)(fw_data+0x74),0x8A);
fw_data[0xFE]=calcCRC&0xFF;
fw_data[0xFF]=(calcCRC>>8)&0xFF;
//Check to see which setting area is older.
read_nvram(0x7FE70,&ver1,2);
read_nvram(0x7FF70,&ver2,2);
// if(ver1// else flash_verify(fw_data,0x7FF00);
flash_verify(fw_data,0x7FE00);
flash_verify(fw_data,0x7FF00);
#else
read_nvram(0x3FE70,&ver1,2);
read_nvram(0x3FF70,&ver2,2);//Check to see which setting area is older.
// if(ver1// else flash_verify(fw_data,0x3FF00);
flash_verify(fw_data,0x3FE00);
flash_verify(fw_data,0x3FF00);
#endif
isModify=-1;
}
}
[/code]
[attach]1099[/attach]
“[color=sienna]你成功了![/color]”六面叔的这句话,整个世界都美丽了。

不过,依然还有一点问题。用户名写的是“雷精灵”,显示出来却是“雷精灵3d”。
“[color=darkorchid]那个“3D”……六面叔,你以前叫啥名?[/color]”雷叔想到了问题的原因。
“[color=sienna]whm3d。[/color]”
“[color=darkorchid]果然……[/color]”
“[color=lime]unicode?[/color]”nc叔也看出苗头了。
“[color=darkorchid]对。UTF16 LE。[/color]”雷叔以专家的口气说道。
至于造成这个问题的原因,很简单。六面叔原来的设定为whm3d,5个字。后来改成“雷精灵”,3个字,于是只覆盖了前3个字,后两个字自然保留了下来。
“[color=darkorchid]OK……再修改一下关于用户名长度的数据,这个诅咒终于就要结束了~~~[/color]”雷叔伸了伸懒腰,一脸的幸福。
[code]
int isModify=0;
// Keep the ARM7 mostly idle
while (1){
swiWaitForVBlank();
if(isModify==0){
u16 ver1,ver2;
u8 fw_data[0x100];
//Code here to put the users settings into the fw_data area.
memcpy(fw_data,PersonalData,sizeof(PERSONAL_DATA));
int i=0;
// Clear the Name area
for(i=0;i<0x20;i++)fw_data[0x06+i]=0;
#ifdef LITTLE_ENDIAN
fw_data[0x06]=0xF7;
fw_data[0x07]=0x96;
fw_data[0x08]=0xBE;
fw_data[0x09]=0x7C;
fw_data[0x0A]=0x75;
fw_data[0x0B]=0x70;
#else
fw_data[0x06]=0x96;
fw_data[0x07]=0xF7;
fw_data[0x08]=0x7C;
fw_data[0x09]=0xBE;
fw_data[0x0A]=0x70;
fw_data[0x0B]=0x75;
#endif
// Name length
fw_data[0x1A]=3;
// crc
short calcCRC=swiCRC16(0xffff,fw_data,sizeof(PERSONAL_DATA));
fw_data[0x72]=calcCRC&0xFF;
fw_data[0x73]=(calcCRC>>8)&0xFF;
#ifdef IQUEDS
// Get the extra data of the iQueDS
read_nvram(0x7FE74,(void*)(fw_data+0x74),0x100-0x74);
calcCRC=swiCRC16(0xffff,(void*)(fw_data+0x74),0x8A);
fw_data[0xFE]=calcCRC&0xFF;
fw_data[0xFF]=(calcCRC>>8)&0xFF;
//Check to see which setting area is older.
read_nvram(0x7FE70,&ver1,2);
read_nvram(0x7FF70,&ver2,2);
// if(ver1// else flash_verify(fw_data,0x7FF00);
flash_verify(fw_data,0x7FE00);
flash_verify(fw_data,0x7FF00);
#else
read_nvram(0x3FE70,&ver1,2);
read_nvram(0x3FF70,&ver2,2);//Check to see which setting area is older.
// if(ver1// else flash_verify(fw_data,0x3FF00);
flash_verify(fw_data,0x3FE00);
flash_verify(fw_data,0x3FF00);
#endif
isModify=-1;
}
}
[/code]

后记:
“对了,雷叔六叔你们搞的这个可以改用户名的有什么用吗?”sweet叔问道。
“[color=darkorchid]没什么用。不仅没什么用,反而有害。像《马里奥赛车》、《口袋妖怪》之类的可以WIFI对战甚至可以上任天堂战网的游戏,像这样修改过用户名的玩家,在别人的主机上和服务器上,用户名都显示乱码。[/color][color=darkorchid]我之所以做这个实验,主要还是想“个性化”自己的主机。[/color]”雷叔若无其事的说。“[color=darkorchid]这个实验还仅仅是个实验。现在证实这个实验成功。我也公布了源代码。有兴趣并且有能力的人可以将代码完善,加入CPU通信,编码转换和输入法,就可以实现软件修改用户信息了。[/color][color=darkorchid]可惜啊可惜,NDSL的用户只能眼红了。[/color]”雷叔一脸遗憾,然后看着六面叔的IDSL,口水哗啦哗啦流了下来。
“啊啊~idsl美啊!”哪壶不开提哪壶的六面叔看到雷叔垂涎三尺的模样,故意说道。
于是众人都233了。

[[i] 本帖最后由 雷精灵 于 2009-4-13 19:04 编辑 [/i]]


liutao
2009-04-13 13:05:32

感动得眼泪哗哗的~~~~


whm3d
2009-04-13 13:07:25

我有神游的机器!但我不想它变砖,我还要玩呢!


掌叔
2009-04-13 13:11:16

争取下次在雷叔的教程中露露脸!


1989lzhh
2009-04-13 13:31:06

很逗!很有趣!服了雷叔了


niubo_
2009-04-13 20:47:21

再次感谢雷叔的精彩而又邪恶的自杀式研究(哦?拿六面叔的IDSL做试验,算是谋杀式?)……


whm3d
2009-04-14 15:59:47

说实话,当时我想要是ds要变砖了,我就拿着尸体去找雷叔去,他要不给修好我就赖他家不走。。

或者。。他不是说他有两台ds么。。。。!



不过,成功的那一刻,真为雷叔感到高兴! “努力总会有回报的。。。”嗯!我相信!


linoul
2009-04-17 17:19:53

真是强人啊 NDSL的字库有汉字的啊 话说为啥我用代码试不成功呢...顶多设定丢失...就是改不了...


whm3d
2009-04-19 10:22:34

iDSl 就是神游出的那款有!ndsl没有!


linoul
2009-04-19 13:35:56

用fwunpack可以将固件拆包 然后用16进制编辑器在UTF8编码下可以看到 系统设置的那些内容...证明不是图片而有字库

[attach]1111[/attach]


lipop
2009-05-26 14:13:18

不容易啊


my999god
2009-07-24 00:39:22

哦 sigoi


love_xiaolu
2009-12-02 14:13:34

好像在雷叔的教程里露露脸~~~~
当个跑龙套的也好啊


17625
2010-02-25 08:53:23

膜拜一下


kiseeyou
2010-07-09 12:08:53

ds一次次的瞎了俺的狗眼