Two roadblocks: encrypted strings and a missing IAT
Loading an obfuscated binary, two tells appear immediately. The imports view is sparse and functions "call into data" - e.g. a call to an address holding a constant like 0x42a2897c rather than a named import - which signals a dynamic IAT. And the strings view has nothing meaningful, implying encrypted strings. The strings come first: tracing from the entry point to a decryptor reveals a wrapper around an RC4 routine that decrypts arrays of data given a base pointer, a key index, a key length, and a data length. Because every call references the same encrypted blob with different arguments, you can script the recovery: enumerate cross-references to the decrypt function, read each call's constant arguments, RC4-decrypt, and annotate the call site with the plaintext.
Resolving the import hashes
With strings readable, DLL names (kernel32.dll, winhttp.dll, crypt32.dll...) surface, used by the import resolver. Each import is stored as a hash, not a name. The resolver formats the hash, derives a DLL hash to locate that module's DOS header, then walks its Export Address Table - the list of exported function names - hashing each export name with the same function until it matches, and returns that function's address. To rebuild the table, you reimplement the two small hash functions (here a seed of 0x2B and multiplier 0x10F over the name bytes, plus a formatting step), brute-force every entry in the binary's hash array against real DLL exports, and emit a struct of resolved names you apply over the IAT region. The empty void* slots become CreateFileW, WinHttpConnect, CryptAcquireContextW, GetKeyboardLayoutList, and so on.
Why this matters beyond malware
Once the imports are named, the binary's intent becomes legible from its API surface alone - file enumeration, crypto, WinHTTP networking, service control, keyboard-layout checks - which is the whole point of recovering it. Import hashing and string encryption are not malware-only tricks; the same anti-analysis ideas appear in commercial packers, DRM, and aggressive software protection, so the technique generalises to any heavily-obfuscated binary. It is the native-code cousin of the bytecode virtualization and deobfuscation work that hides logic in scripting languages: in both cases the analyst restores a readable view by recovering the layer the protector removed - here the import table, there the instruction set. Analysing samples like this defensively is how detection and mitigation get built.