首页
社区
课程
招聘
[旧帖] [求助]IDA反汇编后,无法知晓指针函数的参数在哪里? 0.00雪花
发表于: 2016-1-19 15:57 2422

[旧帖] [求助]IDA反汇编后,无法知晓指针函数的参数在哪里? 0.00雪花

2016-1-19 15:57
2422
打错了,应该是函数指针。
以下是一个通过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里面没有参数信息。

希望高手回复,谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
.text:003C352C ; signed int __fastcall burfunction(void *a1, void *a2, unsigned int a3, unsigned int *a4)
.text:003C352C                 CMP     R0, #0
.text:003C3530                 CMPNE   R1, #0          ; if ( a1 )
.text:003C3530                                         ;   v4 = a2 == 0;
.text:003C3534                 STMFD   SP!, {R4-R6,LR}
.text:003C3538                 MOV     R4, R0          ; v5 = a1;
.text:003C353C                 MOVNE   R5, #0
.text:003C3540                 MOVEQ   R5, #1
.text:003C3544                 BEQ     loc_3C3598
.text:003C3548                 CMP     R3, #0          ; !a4
.text:003C354C                 BEQ     loc_3C3598
.text:003C3550                 LDMIB   R0, {R0,R6}
.text:003C3554                 RSB     R6, R0, R6
.text:003C3558                 CMP     R2, R6
.text:003C355C                 MOVCC   R6, R2          ; if ( a3 < v6 )
.text:003C355C                                         ;   v6 = a3;
.text:003C3560                 CMP     R6, #0
.text:003C3564                 STR     R6, [R3]
.text:003C3568                 MOVEQ   R0, #1
.text:003C356C                 LDMEQFD SP!, {R4-R6,PC}
.text:003C3570                 LDMIA   R4, {R2,R3}
.text:003C3574                 MOV     R0, R1          ; dest
.text:003C3578                 ADD     R1, R2, R3      ; src
.text:003C357C                 MOV     R2, R6          ; n
.text:003C3580                 BL      memcpy
.text:003C3584                 LDR     R3, [R4,#4]
.text:003C3588                 MOV     R0, R5
.text:003C358C                 ADD     R6, R3, R6
.text:003C3590                 STR     R6, [R4,#4]
.text:003C3594                 LDMFD   SP!, {R4-R6,PC}
.text:003C3598 ; ---------------------------------------------------------------------------
.text:003C3598
.text:003C3598 loc_3C3598                              ; CODE XREF: burfunction(void *,void *,uint,uint *)+18j
.text:003C3598                                         ; burfunction(void *,void *,uint,uint *)+20j
.text:003C3598                 MOV     R0, #5
.text:003C359C                 LDMFD   SP!, {R4-R6,PC}
.text:003C359C ; End of function burfunction(void *,void *,uint,uint *)
2016-1-19 16:00
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看看吧当然听歌
2016-1-19 21:51
0
游客
登录 | 注册 方可回帖
返回
//