I understand the difference between static and dynamic linking, but is it possible by using IDA Pro, Ollydbg, or any other reversing tools to determine if an executable was dynamically or statically linked?
There is no sharp difference between dynamically linked and statically linked, since it's always possible to link some libraries dynamically, and others statically, in the same binary.
For example, an application i
hacked reversed parts of recently (android, in this case, but only a thin java wrapper to a large binary) had over 20 open source libraries compiled into the binary, but still dynamically linked libc and a few other standard libs.
So a better question would be "(How) can i determine if an application uses dynamic libraries at all, and if so, which ones?"
On Linux, the
ldd programm tells you about this:
$ ldd /bin/ls linux-vdso.so.1 => (0x00007ffd14798000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f40fd591000) libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f40fd389000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f40fcfc4000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f40fcd86000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f40fcb82000) /lib64/ld-linux-x86-64.so.2 (0x00007f40fd7b4000) libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f40fc97d000
On Windows, use Dependency Walker: