Normal tools which you use to develop software :)
Usually undocumented API functions are just that, undocumented, and not really carefully hidden secrets.
Designing a future proof API is hard -- you can easily add stuff into API, but it's really hard to remove anything (without breaking some clients). So, you get very careful when adding anything into API. That's why there might be some extra functions (for testing, in development, a quick hack?) in API, which are not documented and with no guarantees of working or being there in next version.
These undocumented functions can be found somewhat easily, given you know how compilers, linkers, libraries and debuggers work (system programming stuff). Knowing assembly language of the target architecture won't hurt. If your IDE/compiler can build working executables, you can do that "manually" also, and keeping eyes open on that path you might discover some hidden features :)
Example in Unix environment: A scenario where we have documentation only for printf function and would like to know if there are some other printf-like functions. Train of thought might go something like:
1. Check header-files
$ grep printf /usr/include/stdio.h | head -5 extern int fprintf (FILE *__restrict __stream, extern int printf (__const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format, extern int vprintf (__const char *__restrict __format, _G_va_list __arg);
2. Check library
$ nm /usr/lib/libc.a | grep printf | head -5 U __asprintf U __fwprintf U __asprintf U __fwprintf U __printf_fp
3. Disassemble library function
$ objdump -S /usr/lib/libc.a | grep -A 10 '_fwprintf' | head 00000000 <__fwprintf>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8d 45 10 lea 0x10(%ebp),%eax 6: 83 ec 0c sub $0xc,%esp 9: 89 44 24 08 mov %eax,0x8(%esp) d: 8b 45 0c mov 0xc(%ebp),%eax 10: 89 44 24 04 mov %eax,0x4(%esp) 14: 8b 45 08 mov 0x8(%ebp),%eax 17: 89 04 24 mov %eax,(%esp)
Or something like that...