分享到新浪微博 分享到QQ空间 打印

[原创] nds asmhack漫谈之ABI与API

nds asmhack漫谈之ABI与API

这段时间写的介绍ds 3D方面的文章,里面提到了API,不过感觉还不够,于是写篇短文来讨论
以下的内容虽然是基于NDS的,但对于GBA的asmhack我相信也会有帮助,毕竟CPU是同一个系列的
ABI
先介绍ABI,ABI中包括了函数的参数如何传递,返回值如何传递等细节规范,我们主要谈论这个

首先是参数,在ARM官方的定义中,R0 R1 R2 R3存储前4个参数,第五个参数开始由栈传递
返回值则放在R0,但有时候也不一定,如NDS BIOS的系统函数,就有多个返回值的情况在子函数调用之间,R0到R3可以有各种用途
r4到r11存放函数的局部变量,在一个函数开始的时候,经常会将r4到r11的若个寄存器入栈,不过在thumb模式下,很多指令都无法对R8以后的寄存器操作
r12是内部调用暂时寄存器,在ARMV4中,因为没有blx指令,所以thumb跟arm切换得依赖额外的寄存器,一般用r12

跟R0到R3一样,在子函数调用之间,可以有其他的用途
r13是栈指针,在函数一开始,经常会在栈中开辟一段内存用来存储各种局部变量,包括临时数组等,一般通过r13来访问它们

r14是链接寄存器,函数返回值一般存储在这里,大多数情况下也需要入栈,在子函数调用之间,可以有其他用途
r15是指令指针,存储当前代码的运行偏移

NDS的主cpu ARM9采用的是ARMV5构架,函数调用方面,相对于GBA的ARM7多了个blx指令
这个指令允许在thumb与arm的函数之间切换,也可以直接用寄存器调用函数,因为可以直接用寄存器,不像bl指令那样有区间的限制

API
这玩意在CT2中又叫做NitroSDK库函数,在说明API之前,得介绍NitroSDK
这个东西是任天堂官方的DS开发套件,很多商业游戏厂商都会用到它,谷歌上可以找到一个06年放出的3.0版本
因为版本有点早,对于第五代的作品,比如黑白跟黑白2,就没什么用处了,但对于第四代的五作的hack还是很有帮助的
商业游戏在开发的过程中,会涉及到对各种API的使用,如果能在hack时对这些api进行反向利用,将事半功倍
nds的api基本上都是C语言风格接口,用起来很简单,遵照上文提到的abi即可
关于各种api的介绍在SDK目录下的man文件夹下就有,打开其中的index.html即可

定位API的方式
有好几种,ct2也支持搜索,先从ct2开始
打开ds游戏后,在工具->nds文件系统信息->定位->查找nitrosdk库函数这个选项,输入api函数的名字就行
另外,在工具->nds文件系统信息->编辑->nef符号表编辑器,勾选下面的库文件分类,然后点击搜索就行


接着是IDA pro,用IDA pro打开sdk目录中的lib\ARM9-TS\Rom下的库文件,用16进制的方式去搜索它

这种定位方法用在ngc/wii等平台也是可以的,以后的3ds也是可以的,多平台适用,只要能找到sdk


简单的文件读写应用
nds的文件系统叫做nitroFileSystem,一般可以用FS_InitFile FS_OpenFile FS_ReadFile这几个API完成
首先先按上面的方法定位到API,然后在hack时应用它们,它们的参数我就不贴了,有兴趣研究sdk吧


比如
复制内容到剪贴板
代码:
push r14
sub r13,0x3c//这里分0x3c给file结构体
mov r0,r13
bl FS_InitFile
mov r0,r13
ldr r1,=testFile.bin//这里指的是一个字符串的指针
bl FS_OpenFile//打开文件
mov r0,r13
ldr r1,=dest
ldr r2,=filesize
bl FS_ReadFile//这样就把文件的filesize大小的数据写入到内存偏移dest中
add r13,0x3c
pop r15
无论如何都定位不到api该怎么办,嗯,这种时候有很多种情况
第一种是商业游戏没用到这个api,这种情况当然别指望找到
第二种就是api被内联了,这个情况很常见,比如G3_Frustum这个api
我们先在sdk的include目录下找到这个api的相关代码
复制内容到剪贴板
代码:
static inline void G3_Frustum(fx32 t, fx32 b, fx32 l, fx32 r, fx32 n, fx32 f, MtxFx44 *mtx)
{   
G3i_FrustumW_(t, b, l, r, n, f, FX32_ONE, TRUE, mtx);
// GX_MTXMODE_PROJECTION now
}
看到没,万恶的inline关键字,不过也不必紧张,可以看到它内部调用了G3i_FrustumW_,api定位的时候,从这个地方入手就行了
此外,如果游戏自身的非官方api的函数,在了解用法跟作用的情况下,也可以当做api使


P.S.下载不到sdk的话,私信post我,不要回贴问,希望回贴不要灌水

[ 本帖最后由 enler 于 2013-3-26 11:51 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP