函数如果有符号,要求必须与符号一致,不改变函数名
函数头要有这个函数的地址,如001200A4, 不需要加上0x
函数参数的命名与寄存器编号对应上
如:int GetDataSize_OGLES(int i0, int i1, int i2, EFTTTexFormat eFormat3, int i4)
i0是通过R0寄存器传入的,又因为是int类型,因此命名为i0,其它的依次类推
类的成员函数如:
void CFTTTextureOGLES::MallocDataSpace(int i1, int i2, int i3, EFTTTexFormat eFormat4, int i5)
因为this指针是通过R0传入是,所以其它的参数是从R1开始的,因此i1是通过R1传入的,将它命名成i1, 其它的依次类推
函数的定义和实现的位置的上一行,需要有写下函数的地址 //0018872C;
//001bf86C <-- 地址大写且//与地址间没有空格,不能加0x void CGfxPrecipitation::Update(bool b1) 请严格按照这个格式来写
函数中每个"{ "}" 都要有对应的地址,如if语句开始位置,if体开始位置,else体开始位置,if结束位置都需要写上地址
其它的语句如 for , while, switch等都需要写上地址
调用子函数的时,需要加上调用的地址
这么做的必要性在于,将逆向人员分析的结果一定承度上保留下来,方便自己或其他人重新检查这段代码
请仔细阅读下面的例子,并严格按照规范来书写代码,否则代码视为无效,将被退回重写
//001F2060 <- **此处必须要有函数的首地址** void FE_LoadLanguageText(int i0, bool b1) { //i0 对应寄存器R0,b1 对应寄存器R1 LOGI("FE_LoadLanguageText: Entry"); //001F207C <- **此处必须要有if语句比较的地址** if (!bLoadLanguageText_4B7E3C || b1) { //001F2084 <- **此处必须要有if语句开始的首地址** if (g_pTextDbs != nullptr) { //001F2090 <- **此处必须要有if语句开始的首地址** delete[] g_pTextDbs; } //loc_1F20B4 <- **此处必须要有if语句结束地址** g_pTextDbs = nullptr; //001F20B8 STR R0, [R4] g_pTextDbs = new CFTTLangDatabase[3]; //001F20E4 STR R6, [R4] //001F20F0 <- **此处必须要有if语句开始的首地址** if (STY_tConfig.DownloadListAdText_63A4 >= 0x80D) { //001F20F4 <- **此处必须要有if语句开始的首地址** char buf_A8[128]; // <- _A8 表示这个变量在栈上的位置 snprintf(buf_A8, 128, "scw_lang_%i.xlc", STY_tConfig.DownloadListAdText_63A4); char buf_128[128]; // <- _128 表示这个变量在栈上的位置 snprintf(buf_128, 128, "SUPPORT:%s", buf_A8); //001F2118 <- **此处必须要有if语句开始的首地址** if (CFTTFileSystem::FileExists(buf_128)) { //001F211E <- **此处必须要有if语句开始的首地址** g_pTextDbs->Init(buf_128, true, nullptr); FTSTEXT_iTextDBVersion = STY_tConfig.DownloadListAdText_63A4; } //loc_1F2134 <- **此处必须要有if语句结束地址** } //loc_1F2136 <- **此处必须要有if语句结束地址** g_pTextDbs->Init("PKG:/Data/Text/scw_lang.xlc", true, nullptr); FTSTEXT_iTextDBVersion = 0x80C; //001F2150 <- **此处必须要有for语句开始地址** for (int dr6 = 1; dr6 != 3; dr6++) { // dr6 表示是使用R6寄存器做为索引 //001F215A <- **此处必须要有for主体首地址** g_pTextDbs[dr6].Init(list_files_327CE4[dr6], true, nullptr); } //001F2170 <- **此处必须要有for结束地址** bLoadLanguageText_4B7E3C = true; //STRB.W R0, [R11] } //001F2174 <- **此处必须要有函数调用** ELangType eType = GetFTTLangFromLang(i0); g_pTextDbs[0].LoadLanguage(eType); g_pTextDbs[1].LoadLanguage(eType); g_pTextDbs[2].LoadLanguage(eType); LOGI("FE_LoadLanguageText: End"); }
逆向出来的C++代码再反编译回去,与原始的汇编代码一致,我们称之为笑脸,在代码中标识为 ^_^
单元测试完成后,要按如下格式写上实际情况
//单元测试等级: 目测游戏表现
//单元测试内容: 启动游戏到第2关(包括第2关)
//单元测试结果: 正常
//已测试分支:
对于汇编一致函数写法示例
//001C5B48 //^_^ 开始的位置必须表明函数位置(位置不可带0x),和笑脸 TShadowAABB::TShadowAABB() { …….中间省略 }
对于汇编不一致函数的写法示例:
//0012644C //^_- //单元测试等级: 目测游戏表现/函数输入输出数据对比 //单元测试内容: 启动游戏到第2关(包括第2关) //单元测试结果: 正常/函数输出数据一致,游戏运行正常. void CFESChooseHero::PreRender3D() { .......中间省略 } TShadowAABB* TShadowAABB::Block(.............) { .......中间省略 //该函数是有输出的,我们可以对它的返回值和原始程序输出做对比 }
关于汇编不一致函数,不同点的标注示例:
TShadowAABB* TShadowAABB::Block(.............) { .......中间省略 //假设下面的判断不同 /* 描述: 此处>=跳转原来是BGE, 但是它为BPL(描述现象) 原始汇编: ***** 自己汇编: ***** */ if ( s0_float - s6_float < 0.0f ) .......中间省略 }
对于已经在头文件库中给出的全局变量,必须使用项目已经指定的头文件包含进来
不可以在自己的头文件中再单独声明一个同类型,同名称的变量。
如果你实现的函数分支流程,和原始的不一致的,
请你在提交函数体内详细说明, 进而证明你的流程也是正确的。
否则, 统一按照不合格处理。
类型 | 定义 | 缩写 |
---|---|---|
typedef char | int8 | c |
typedef signed char | sint8 | sc |
typedef unsigned char | uint8 | uc |
typedef short | int16 | s |
typedef signed short | sint16 | ss |
typedef int | int32 | i |
typedef signed int | sint32 | si |
typedef unsigned int | uint32 | ui |
typedef int64_t | int64 | ll |
typedef uint64_t | uint64 | ull |
typedef unsigned int | uint | ui |
typedef unsigned char | uchar | uc |
typedef unsigned short | ushort | us |
typedef unsigned long | ulong | ul |
类型 | 缩写 |
---|---|
类 | 大写 C 开头 |
结构体 | 大写 T 开头 |
枚举变 | 大写 E 开头 |
类的静态变量 | 小写 ms_ 开头 |
类的静态bool变量 | 小写 ms_b 开头 |
类的静态float变量 | 小写 ms_f 开头 |
类的静态int变量 | 小写 ms_i 开头 |
类的静态unsigned int变量 | 小写 ms_u 开头 |
类的静态char*变量 | 小写 ms_s 开头 |
类的静态Matrix变量 | 小写 ms_m 开头 |
类的静态枚举变量 | 小写 ms_e 开头 |
类的静态指量变量 | 小写 ms_p 开头 |
类的静态结构体变量 | 小写 ms_t 开头 |
全局变量 | 小写 g_ 开头 |
全局bool变量 | 小写 g_b 开头 |
全局int变量 | 小写 g_i 开头 |
全局unsigned int变量 | 小写 g_u 开头 |
全局float变量 | 小写 g_f 开头 |
全局char*变量 | 小写 g_s 开头 |
全局Matrix变量 | 小写 g_m 开头 |
全局枚举变量 | 小写 g_e 开头 |
全局指量变量 | 小写 g_p 开头 |
全局结构体变量 | 小写 g_t 开头 |