import pefile
import os

def get_export_names(module_name):
    pe = pefile.PE(module_name)
    return filter(None, [entry.name for entry in pe.DIRECTORY_ENTRY_EXPORT.symbols])

def char2wchar(string):
    return "".join(ch+'\0' for ch in string)

def rot13(string):
    return reduce(lambda h,c: ((h>>13 | h<<19)+ord(c)) & 0xFFFFFFFF, [0]+list(string))

def calc_hash(module_name, api_name):

    mod_name_hash = rot13(char2wchar(module_name.upper()+'\0'))
    api_name_hash = rot13(api_name+'\0')

    api_hash = (mod_name_hash + api_name_hash) & 0xFFFFFFFF

    return api_hash

if __name__ == '__main__':
    dll_names = [
            "C:\\WINDOWS\\system32\\kernel32.dll",
            "C:\\WINDOWS\\system32\\ws2_32.dll",
            "C:\\WINDOWS\\system32\\urlmon.dll",
            ]

    hash_values = []

    for dll_name in dll_names:
        module_name = os.path.basename(dll_name)
        for api_name in get_export_names(dll_name):
            api_hash = calc_hash(module_name, api_name)
            hash_values.append("\thash_%s_%s=0x%08X" % (module_name.split(".")[0], api_name, api_hash))

    print "enum API_HASH{"
    print ",\n".join(hash_values)
    print "};"
