如何识别动态库中的函数调用?

逆向工程 手臂 动态链接
2021-07-01 03:59:56

当我反汇编一个OpenCV动态库文件(libopencv_imgproc.so)时,我发现bl.pltsection中有很多目标地址所在指令但是,我找不到它的符号信息。

00110ee0 <cvResize>:
  110ee0:   b5f0        push    {r4, r5, r6, r7, lr}
  110ee2:   4603        mov r3, r0
  110ee4:   b0bf        sub sp, #252    ; 0xfc
  ...
  110ef4:   4ca8        ldr r4, [pc, #672]  ; (111198 <cvResize+0x2b8>)
  110ef6:   9500        str r5, [sp, #0]
  110ef8:   f70e ebda   blx 1f6b0 <_init+0x2b4>
  ...

1f6b0在该.text部分找不到地址它实际上是在该.plt部分。但是,我在符号表中找不到它。我怎样才能获得这些遗漏的符号信息?

1个回答

以艰难的方式做到这一点:

  1. 反汇编目标 PLT 存根并找出它使用的指针。例如:

    359dc:  e28fc601    add ip, pc, #1048576    ; 0x100000
    359e0:  e28ccaa2    add ip, ip, #663552 ; 0xa2000
    359e4:  e5bcf900    ldr pc, [ip, #2304]!    ; 0x900
    

    在这里,ipwill 是: 0x359e4+0x100000+0xa2000 = 0x1D79E4,所以最后一个LDR将取消引用1D79E4+0x900 = 0x1D82E4

  2. 在 relocs ( objdump -dr)列表中查找地址

    001d82e4  00005216 R_ARM_JUMP_SLOT   00000000   _ZN2cv10cvarrToMatEPKv
    

用简单的方法做:

  1. 只需使用 IDA :),或者至少使用一个objdump 了解 PLT 存根的更新者

    000359dc <_ZN2cv10cvarrToMatEPKvbbi@plt>:
    

请注意,这objdump取决于 PLT 存根的顺序通常与 PLT 重定位列表中的重定位顺序相匹配的事实。理论上,可以在链接后修补 PLT 存根,以便它使用另一个符号的指针。