打错了,应该是函数指针。
以下是一个通过IDA反汇编的so文件其中的一个函数:
.text:003C2120 v16_a3 = -0x30
.text:003C2120 var_2C = -0x2C
.text:003C2120 var_28 = -0x28
.text:003C2120 var_24 = -0x24
.text:003C2120 a5_is_string = 0
.text:003C2120 a6_eq_16 = 4
.text:003C2120
.text:003C2120 STMFD SP!, {R4-R10,LR}
.text:003C2124 SUB SP, SP, #0x10
.text:003C2128 LDR R6, [SP,#0x30+a5_is_string] ;
.text:003C212C MOV R5, R2
.text:003C2130 CMP R2, #0
.text:003C2134 CMPNE R6, #0
.text:003C2138 MOVNE R10, #0
.text:003C213C MOVEQ R10, #1
.text:003C2140 MOV R8, R1
.text:003C2144 MOV R9, R3
.text:003C2148 LDR R4, [SP,#0x30+a6_eq_16]
.text:003C214C BEQ loc_3C21AC
.text:003C2150 CMP R4, #0
.text:003C2154 BEQ loc_3C21AC
.text:003C2158 LDR R7, [R4]
.text:003C215C BL _CreateEncoderE15FilterAlgorithm
.text:003C2160 SUBS R3, R0, #0
.text:003C2164 MOVEQ R5, #1
.text:003C2168 BEQ loc_3C21A0
.text:003C216C LDR R2, [R3]
.text:003C2170 STR R3, [SP,#0x30+var_24]
.text:003C2174 LDR R3, =(_Z19burfunctionPvS_jPj_ptr - 0x3C2188)
.text:003C2178 LDR R12, [R2,#8] ; 调用的函数地址
.text:003C217C STR R5, [SP,#0x30+v16_a3]
.text:003C2180 LDR R2,
[PC,R3] ; R12所在函数其中的R2参数(函数指针),问题在这里:该函数作为参数被传递,那么它自己的参数到底在哪里获取?
.text:003C2184 STR R10, [SP,#0x30+var_2C]
.text:003C2188 STR R9, [SP,#0x30+var_28]
.text:003C218C MOV R3, R8
.text:003C2190 MOV R1, SP
.text:003C2194 BLX R12
.text:003C2198 SUBS R5, R0, #0
.text:003C219C BEQ loc_3C21B4
.text:003C21A0
.text:003C21A0 loc_3C21A0
.text:003C21A0
.text:003C21A0 MOV R0, R5
.text:003C21A4 ADD SP, SP, #0x10
.text:003C21A8 LDMFD SP!, {R4-R10,PC}
.text:003C21AC ; ---------------------------------------------------------------------------
.text:003C21AC
.text:003C21AC loc_3C21AC
.text:003C21AC
.text:003C21AC MOV R5, #5
.text:003C21B0 B loc_3C21A0
.text:003C21B4 ; ---------------------------------------------------------------------------
.text:003C21B4
.text:003C21B4 loc_3C21B4
.text:003C21B4 LDR R12, [SP,#0x30+var_24]
.text:003C21B8 MOV R1, R6
.text:003C21BC MOV R0, R12
.text:003C21C0 MOV R2, R7
.text:003C21C4 MOV R3, R4
.text:003C21C8 LDR R12, [R12]
.text:003C21CC MOV LR, PC
.text:003C21D0 LDR PC, [R12,#0x10]
.text:003C21D4 SUBS R5, R0, #0
.text:003C21D8 BNE loc_3C21A0
.text:003C21DC ADD R0, SP, #0x30+var_24
.text:003C21E0 BL _Z17SafeDeletePointerI9EncodeEvRPT_
.text:003C21E4 B loc_3C21A0
.text:003C21E4 ; End of function
问题单独提取出来:
.text:003C2180 LDR R2, [PC,R3] ; R12所在函数其中的R2参数(函数指针),问题在这里:该函数作为参数被传递,那么它自己的参数到底在哪里获取?看上去[PC,R3] 是函数的所在地址,它被作为参数(应该叫函数指针吧?)被R12的函数调用,可是[PC,R3] 的参数在哪里呢?
这是[PC,R3]的4个参数(void *a1, void *a2, unsigned int a3, unsigned int *a4),通过IDA的F5伪编译过来的。
伪码是这样的:v12 = ((int (__cdecl *)(int, int *, signed int (__fastcall *)(void *, void *, unsigned int, unsigned int *)))v14)(v11, &v16_a3, burfunction);burfunction为防止被和谐,换了名字。这个burfunction里面没有参数信息。
希望高手回复,谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!