- 积分
- 322
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|

楼主 |
发表于 2009-5-14 13:40:54
|
显示全部楼层
简单说一下这个补丁如何做出来的:
首先可以肯定的是S75是可以做出这样的补丁的,做过相关补丁的不难发现,E71文件管理器的代码是ARM模式的,S75的却是THUMB模式的,但功能基本相同,所以用来实现的代码是差不多的,所以这样的补丁是不能直接移植的
拿到E71Cv41的补丁:073DF10: 2E 1E
用IDA反汇编E71的FullFlash,转到A073DF10,没什么发现,但可以肯定的是2E就是ANSI编码的点号“.”- ROM:A073DF00 06 00 A0 E1 MOV R0, R6
- ROM:A073DF04 86 48 F7 FB BLX sub_A0510126 ; wstrlen(WSHDR *wshdr)
- ROM:A073DF08 00 10 A0 E1 MOV R1, R0
- ROM:A073DF0C 06 00 A0 E1 MOV R0, R6
- ROM:A073DF10 2E 20 A0 E3 MOV R2, #0x2E
- ROM:A073DF14 CA 48 F7 FA BLX sub_A0510244 ;后来看了一下,这个函数就是wstrrchr
- ROM:A073DF18 01 00 40 E2 SUB R0, R0, #1
- ROM:A073DF1C 00 18 A0 E1 MOV R1, R0,LSL#16
- ROM:A073DF20 21 18 A0 E1 MOV R1, R1,LSR#16
- ROM:A073DF24 06 00 A0 E1 MOV R0, R6
- ROM:A073DF28 F8 4A F7 FA BLX sub_A0510B10 ; CutWSTR(void *WSHDR,int len)
复制代码 于是从这个函数上溯,即A073E390:- ROM:A073DE68 sub_A073DE68 ; ROM:A073E390
- ROM:A073DE68 F0 4D 2D E9 STMFD SP!, {R4-R8,R10,R11,LR}
- ROM:A073DE6C 4A DF 4D E2 SUB SP, SP, #0x128
- ROM:A073DE70 48 71 9D E5 LDR R7, [SP,#0x148]
复制代码 前后观察一下:- ROM:A073E2DC 28 57 89 A0 off_A073E2DC DCD unk_A0895728 ; ROM:A073DAACr
- ROM:A073E2E0 20 57 89 A0 off_A073E2E0 DCD unk_A0895720 ; ROM:A073DAB0r
- ROM:A073E2E4 25 64 20 25+s_DT DCB "%d %t",0 ; ROM:A073E148o
- ROM:A073E2EA 00 DCB 0
- ROM:A073E2EB 00 DCB 0
- ROM:A073E2EC 2C 11 01 00 dword_A073E2EC DCD 0x1112C ; ROM:A073E194r
- ROM:A073E2F0 A7 13 01 00 dword_A073E2F0 DCD 0x113A7 ; ROM:A073E224r
- ROM:A073E2F4 18 57 89 A0 off_A073E2F4 DCD unk_A0895718 ; ROM:A073E278r
- ROM:A073E2F8 44 65 66 61+s_Default DCB "Default",0 ; ROM:A073E2C4o
- ROM:A073E300 50 72 65 76+s_Preview_1 DCB "Preview",0 ; ROM:A073E2CCo
- ROM:A073E308 ; *************** S U B R O U T I N E ***************************************
- ROM:A073E308 sub_A073E308 ; ROM:A0736450p
- ROM:A073E308 ; ROM:A07A645Cp
- ROM:A073E308 var_1378= -0x1378
- ROM:A073E308 var_1374= -0x1374
- ROM:A073E308 var_1370= -0x1370
- ROM:A073E308 var_136C= -0x136C
- ROM:A073E308 var_1358= -0x1358
- ROM:A073E308 var_B78 = -0xB78
- ROM:A073E308 F0 40 2D E9 STMFD SP!, {R4-R7,LR}
- ROM:A073E30C 40 DD 4D E2 SUB SP, SP, #0x1000
- ROM:A073E310 D9 DF 4D E2 SUB SP, SP, #0x364
- ROM:A073E314 01 50 A0 E1 MOV R5, R1
- ROM:A073E318 00 40 A0 E1 MOV R4, R0
- ROM:A073E31C 80 0E 8D E2 ADD R0, SP, #0x800
- ROM:A073E320 80 1E 8D E2 ADD R1, SP, #0x800
- ROM:A073E324 73 1F 81 E2 ADD R1, R1, #0x1CC
- ROM:A073E328 6E 0F 80 E2 ADD R0, R0, #0x1B8
- ROM:A073E32C 0C 25 9F E5 LDR R2, =0x4CB
- ROM:A073E330 FD 48 F7 FB BLX sub_A051072E ; CreateLocalWS(WSHDR *wshdr,unsigned __int16 *wsbody,int len)
- ROM:A073E334 00 60 A0 E1 MOV R6, R0
- ROM:A073E338 0C 00 8D E2 ADD R0, SP, #0xC
- ROM:A073E33C FC 24 9F E5 LDR R2, =0x4CB
- ROM:A073E340 20 10 8D E2 ADD R1, SP, #0x20
- ROM:A073E344 F8 48 F7 FB BLX sub_A051072E ; CreateLocalWS(WSHDR *wshdr,unsigned __int16 *wsbody,int len)
- ROM:A073E348 00 70 A0 E1 MOV R7, R0
- ROM:A073E34C D3 E5 FF EB BL loc_A0737AA0
- ROM:A073E350 08 00 8D E5 STR R0, [SP,#8]
- ROM:A073E354 10 00 94 E5 LDR R0, [R4,#0x10]
- ROM:A073E358 01 00 50 E3 CMP R0, #1
- ROM:A073E35C 16 00 00 0A BEQ loc_A073E3BC
- ROM:A073E360 04 00 A0 E1 MOV R0, R4
- ROM:A073E364 C5 F9 FF EB BL sub_A073CA80
- ROM:A073E368 00 00 50 E3 CMP R0, #0
- ROM:A073E36C 12 00 00 0A BEQ loc_A073E3BC
- ROM:A073E370 C1 E4 08 FB BLX sub_A097767E
- ROM:A073E374 00 00 50 E3 CMP R0, #0
- ROM:A073E378 0F 00 00 1A BNE loc_A073E3BC
- ROM:A073E37C 07 30 A0 E1 MOV R3, R7
- ROM:A073E380 00 60 8D E5 STR R6, [SP]
- ROM:A073E384 08 20 8D E2 ADD R2, SP, #8
- ROM:A073E388 05 10 A0 E1 MOV R1, R5
- ROM:A073E38C 04 00 A0 E1 MOV R0, R4
- ROM:A073E390 B4 FE FF EB BL sub_A073DE68
- ROM:A073E394 05 10 A0 E1 MOV R1, R5
- ROM:A073E398 04 00 A0 E1 MOV R0, R4
- ROM:A073E39C 07 FD FF EB BL sub_A073D7C0
- ROM:A073E3A0 04 00 8D E5 STR R0, [SP,#4]
- ROM:A073E3A4 04 00 A0 E1 MOV R0, R4
- ROM:A073E3A8 07 30 A0 E1 MOV R3, R7
- ROM:A073E3AC 00 60 8D E5 STR R6, [SP]
- ROM:A073E3B0 05 10 A0 E1 MOV R1, R5
- ROM:A073E3B4 08 20 9D E5 LDR R2, [SP,#8]
- ROM:A073E3B8 9C FC FF EB BL sub_A073D630
- ROM:A073E3BC loc_A073E3BC ; ROM:A073E35Cj
- ROM:A073E3BC ; ROM:A073E36Cj
- ROM:A073E3BC ; ROM:A073E378j
- ROM:A073E3BC 40 DD 8D E2 ADD SP, SP, #0x1000
- ROM:A073E3C0 D9 DF 8D E2 ADD SP, SP, #0x364
- ROM:A073E3C4 F0 80 BD E8 LDMFD SP!, {R4-R7,PC}
复制代码 发现上面这个“Default”,“Preview”,这两个字符串,可用做特征码。
同时这两个字符串是被从A073DE68开始的这个函数所调用的:- ROM:A073E2B4 00 00 A0 E3 MOV R0, #0
- ROM:A073E2B8 B9 E6 FF EB BL sub_A0737DA4
- ROM:A073E2BC 00 00 88 E5 STR R0, [R8]
- ROM:A073E2C0 06 00 A0 E1 MOV R0, R6
- ROM:A073E2C4 2C 10 8F E2 ADR R1, s_Default ; "Default"
- ROM:A073E2C8 48 9C 08 FA BLX sub_A09653F0 ; wsprintf(WSHDR *,const char *format,...)
- ROM:A073E2CC 2C 10 8F E2 ADR R1, s_Preview_1 ; "Preview"
- ROM:A073E2D0 07 00 A0 E1 MOV R0, R7
- ROM:A073E2D4 45 9C 08 FA BLX sub_A09653F0 ; wsprintf(WSHDR *,const char *format,...)
- ROM:A073E2D8 26 FF FF EA B loc_A073DF78
复制代码 取消以字符串方式显示:- ROM:A073E2F8 44 unk_A073E2F8 DCB 0x44 ; D ; ROM:A073E2C4o
- ROM:A073E2F9 65 DCB 0x65 ; e
- ROM:A073E2FA 66 DCB 0x66 ; f
- ROM:A073E2FB 61 DCB 0x61 ; a
- ROM:A073E2FC 75 DCB 0x75 ; u
- ROM:A073E2FD 6C DCB 0x6C ; l
- ROM:A073E2FE 74 DCB 0x74 ; t
- ROM:A073E2FF 00 DCB 0
- ROM:A073E300 50 unk_A073E300 DCB 0x50 ; P ; ROM:A073E2CCo
- ROM:A073E301 72 DCB 0x72 ; r
- ROM:A073E302 65 DCB 0x65 ; e
- ROM:A073E303 76 DCB 0x76 ; v
- ROM:A073E304 69 DCB 0x69 ; i
- ROM:A073E305 65 DCB 0x65 ; e
- ROM:A073E306 77 DCB 0x77 ; w
- ROM:A073E307 00 DCB 0
复制代码 记住ROM:A073E390 B4 FE FF EB BL sub_A073DE68,是A073E308开始的这个函数的倒数第三个BL
A073E308开始的这个函数,是在 A073DE68开始的这个函数 下面。
用Smelter打开S75的FullFlash,搜索特征码:- 44 65 66 61 75 6C 74 00 50 72 65 76 69 65 77 00
复制代码 找到之后用IDA打开FullFlash反汇编,是这个位置:- ROM:A0371048 44 65 66 61+s_Default DCB "Default",0 ; A0370D68o
- ROM:A0371050 50 72 65 76+s_Preview_1 DCB "Preview",0 ; A0370D70o
复制代码 根据后面的调用关系到这里:- ROM:A0370D68 B7 A1 ADR R1, s_Default ; "Default"
- ROM:A0370D6A 30 1C ADD R0, R6, #0
- ROM:A0370D6C B1 F0 9C EB BLX sub_A04224A8 ; void wsprintf(WSHDR *,const char *format,...)
- ROM:A0370D6C
- ROM:A0370D70 B7 A1 ADR R1, s_Preview_1 ; "Preview"
- ROM:A0370D72 38 1C ADD R0, R7, #0
- ROM:A0370D74 B1 F0 98 EB BLX sub_A04224A8 ; void wsprintf(WSHDR *,const char *format,...)
- ROM:A0370D74
- ROM:A0370D78 D2 E6 B loc_A0370B20
复制代码 观察发现,这个函数和E71中的 A073DE68开始的这个函数 非常相似,其实只是一个是ARM的一个是THUMB的而已,
顺路找到他下面的一个函数:- ROM:A0370D7A sub_A0370D7A ; A036B70Ep
- ROM:A0370D7A ; A036DA68p
- ROM:A0370D7A
- ROM:A0370D7A var_14 = -0x14
- ROM:A0370D7A var_10 = -0x10
- ROM:A0370D7A var_C = -0xC
- ROM:A0370D7A var_8 = -8
- ROM:A0370D7A arg_C = 0xC
- ROM:A0370D7A
- ROM:A0370D7A F0 B5 PUSH {R4-R7,LR}
- ROM:A0370D7C 0D 1C ADD R5, R1, #0
- ROM:A0370D7E 04 1C ADD R4, R0, #0
- ROM:A0370D80 B5 4B LDR R3, =0xFFFFEC9C
- ROM:A0370D82 B7 48 LDR R0, =0x9CC
- ROM:A0370D84 B6 49 LDR R1, =0x9CC
- ROM:A0370D86 9D 44 ADD SP, R3
- ROM:A0370D88 14 38 SUB R0, #0x14
- ROM:A0370D8A 68 44 ADD R0, SP
- ROM:A0370D8C 69 44 ADD R1, SP
- ROM:A0370D8E B3 4A LDR R2, =0x4CB
- ROM:A0370D90 86 F6 71 FE BL sub_A01F7A76 ; WSHDR *CreateLocalWS(WSHDR *wshdr,unsigned __int16 *wsbody,int len)
- ROM:A0370D90
- ROM:A0370D94 07 1C ADD R7, R0, #0
- ROM:A0370D96 03 A8 ADD R0, SP, #0x14+var_8
- ROM:A0370D98 B0 4A LDR R2, =0x4CB
- ROM:A0370D9A 08 A9 ADD R1, SP, #0x14+arg_C
- ROM:A0370D9C 86 F6 6B FE BL sub_A01F7A76 ; WSHDR *CreateLocalWS(WSHDR *wshdr,unsigned __int16 *wsbody,int len)
- ROM:A0370D9C
- ROM:A0370DA0 06 1C ADD R6, R0, #0
- ROM:A0370DA2 FB F7 EB FB BL sub_A036C57C
- ROM:A0370DA2
- ROM:A0370DA6 02 90 STR R0, [SP,#0x14+var_C]
- ROM:A0370DA8 20 69 LDR R0, [R4,#0x10]
- ROM:A0370DAA 01 28 CMP R0, #1
- ROM:A0370DAC 1B D0 BEQ loc_A0370DE6
- ROM:A0370DAC
- ROM:A0370DAE 20 1C ADD R0, R4, #0
- ROM:A0370DB0 FE F7 D4 FF BL sub_A036FD5C
- ROM:A0370DB0
- ROM:A0370DB4 00 28 CMP R0, #0
- ROM:A0370DB6 16 D0 BEQ loc_A0370DE6
- ROM:A0370DB6
- ROM:A0370DB8 B5 F0 64 EB BLX sub_A0426484
- ROM:A0370DB8
- ROM:A0370DBC 00 28 CMP R0, #0
- ROM:A0370DBE 12 D1 BNE loc_A0370DE6
- ROM:A0370DBE
- ROM:A0370DC0 29 1C ADD R1, R5, #0
- ROM:A0370DC2 20 1C ADD R0, R4, #0
- ROM:A0370DC4 33 1C ADD R3, R6, #0
- ROM:A0370DC6 00 97 STR R7, [SP,#0x14+var_14]
- ROM:A0370DC8 02 AA ADD R2, SP, #0x14+var_C
- ROM:A0370DCA FF F7 55 FE BL sub_A0370A78
- ROM:A0370DCA
- ROM:A0370DCE 29 1C ADD R1, R5, #0
- ROM:A0370DD0 20 1C ADD R0, R4, #0
- ROM:A0370DD2 FF F7 1E FC BL sub_A0370612
- ROM:A0370DD2
- ROM:A0370DD6 01 90 STR R0, [SP,#0x14+var_10]
- ROM:A0370DD8 20 1C ADD R0, R4, #0
- ROM:A0370DDA 29 1C ADD R1, R5, #0
- ROM:A0370DDC 33 1C ADD R3, R6, #0
- ROM:A0370DDE 00 97 STR R7, [SP,#0x14+var_14]
- ROM:A0370DE0 02 9A LDR R2, [SP,#0x14+var_C]
- ROM:A0370DE2 FF F7 90 FB BL sub_A0370506
- ROM:A0370DE2
- ROM:A0370DE6
- ROM:A0370DE6 loc_A0370DE6 ; A0370DACj
- ROM:A0370DE6 ; A0370DB6j
- ROM:A0370DE6 ; A0370DBEj
- ROM:A0370DE6 9C 4B LDR R3, =0xFFFFEC9C
- ROM:A0370DE8 5B 42 NEG R3, R3
- ROM:A0370DEA 9D 44 ADD SP, R3
- ROM:A0370DEC F0 BD POP {R4-R7,PC}
- ROM:A0370DEC
- ROM:A0370DEC ; End of function sub_A0370D7A
- ROM:A0370DEC
- ROM:A0370DEE
复制代码 从A0370D7A开始的这个函数,和E71中的 A073E308开始的这个函数 也非常相似
看它倒数第三个BL:- ROM:A0370DCA FF F7 55 FE BL sub_A0370A78
复制代码 看这个函数的代码,从A0370A78开始,
不难发现:- ROM:A0370ACA FF F7 BC FF BL sub_A0370A46 ; int IsExtRegged(void *, int unk_0_1)
- ROM:A0370ACA
- ROM:A0370ACE 00 28 CMP R0, #0
- ROM:A0370AD0 0D D0 BEQ loc_A0370AEE
- ROM:A0370AD0
- ROM:A0370AD2 30 1C ADD R0, R6, #0
- ROM:A0370AD4 86 F6 CB FC BL sub_A01F746E ; int wstrlen(WSHDR *wshdr)
- ROM:A0370AD4
- ROM:A0370AD8 01 1C ADD R1, R0, #0
- ROM:A0370ADA 2E 22 MOV R2, #0x2E
- ROM:A0370ADC 30 1C ADD R0, R6, #0
- ROM:A0370ADE 86 F6 55 FD BL sub_A01F758C ; short wstrrchr(WSHDR *ws,unsigned int max_pos,unsigned int wchar)
- ROM:A0370ADE
- ROM:A0370AE2 01 38 SUB R0, #1
- ROM:A0370AE4 01 04 LSL R1, R0, #0x10
- ROM:A0370AE6 09 0C LSR R1, R1, #0x10
- ROM:A0370AE8 30 1C ADD R0, R6, #0
- ROM:A0370AEA 87 F6 B5 F9 BL sub_A01F7E58 ; void CutWSTR(void *WSHDR,int len)
复制代码 如果按照原来的补丁来的话,这样就可以达到显示拓展名的效果了:但还可以优化一下,观察发现(用Armdebugger),这个函数就是用来判断是否是已经关联的文件,未关联文件是直接显示拓展名的,如果是已关联的,就继续往下去掉拓展名,如果未关联,跳转到A0370AEE不用去掉拓展名:- ROM:A0370ACA FF F7 BC FF BL sub_A0370A46 ; int IsExtRegged(void *, int unk_0_1)
- ROM:A0370ACE 00 28 CMP R0, #0
- ROM:A0370AD0 0D D0 BEQ loc_A0370AEE
复制代码 所以我们要做的补丁就是直接从A0370AC6跳转到A0370AEE就可以了
就是 A0370AC6 B A0370AEE, |
评分
-
查看全部评分
|