How to execute a debugger command from within the app

旧城冷巷雨未停 提交于 2020-01-24 00:32:10

问题


In runtime I'm trying to recover an address of a function that is not exported but is available through shared library's symbols table and therefore is visible to the debugger.

I'm working on advanced debugging procedure that needs to capture certain events and manipulate runtime. One of the actions requires knowledge of an address of a private function (just the address) which is used as a key elsewhere.

My current solution calculates offset of that private function relative to a known exported function at build time using nm. This solution restricts debugging capabilities since it depends on a particular build of the shared library.

The preferable solution should be capable of recovering the address in runtime.

I was hoping to communicate with the attached debugger from within the app, but struggle to find any API for that.

What are my options?


回答1:


In runtime I'm trying to recover an address of a function that is not exported but is available through shared library's symbols table and therefore is visible to the debugger.

Debugger is not a magical unicorn. If the symbol table is available to the debugger, it is also available to your application.

I need to recover its address by name using the debugger ...

That is entirely wrong approach.

Instead of using the debugger, read the symbol table for the library in your application, and use the info gained to call the target function.

Reading ELF symbol table is pretty easy. Example. If you are not on ELF platform, getting equivalent info should not be much harder.




回答2:


In lldb you can quickly find the address by setting a symbolic breakpoint if it's known to the debugger by whatever means:

b symbolname

If you want call a non exported function from a library without a debugger attached there are couple of options but each will not be reliable in the long run:

  • Hardcode the offset from an exported library and call exportedSymbol+offset (this will work for a particular library binary version but will likely break for anything else)
  • Attempt to search for a binary signature of your nonexported function in the loaded library. (slightly less prone to break but the binary signature might always change)

Perhaps if you provide more detailed context what are you trying achieve better options can be considered.

Update:
Since lldb is somehow aware of the symbol I suspect it's defined in Mach-O LC_SYMTAB load command of your library. To verify that you could inspect your lib binary with tools like MachOView or MachOExplorer . Or Apple's otool or Jonathan Levin's jtool/jtool2 in console.

Here's an example from very 1st symbol entry yielded from LC_SYMTAB in MachOView. This is /usr/lib/dyld binary In the example here 0x1000 is virtual address. Your library most likely will be 64bit so expect 0x10000000 and above. The actual base gets randomized by ASLR, but you can verify the current value with

sample yourProcess

yourProcess being an executable using the library you're after. The output should contain:

Binary Images:
       0x10566a000 -        0x105dc0fff  com.apple.finder (10.14.5 - 1143.5.1) <3B0424E1-647C-3279-8F90-4D374AA4AC0D> /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder
       0x1080cb000 -        0x1081356ef  dyld (655.1.1) <D3E77331-ACE5-349D-A7CC-433D626D4A5B> /usr/lib/dyld
...

These are the loaded addresses 0x100000000 shifted by ASLR. There might be more nuances how exactly those addresses are chosen for dylibs but you get the idea.

Tbh I've never needed to find such address programmatically but it's definitely doable (as /usr/bin/sample is able to do it).

From here to achieve something practically:

  1. Parse Mach-o header of your lib binary (check this & this for starters)
  2. Find LC_SYMTAB load command
  3. Find your symbol text based entry and find the virtual address (the red box stuff)
  4. Calculate ASLR and apply the shift

There is some C Apple API for parsing Mach-O. Also some Python code exists in the wild (being popular among reverse engineering folks).

Hope that helps.



来源:https://stackoverflow.com/questions/59637959/how-to-execute-a-debugger-command-from-within-the-app

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!