예제 #1
0
    def InternetOpenUrl(self, proc, argv, ctx={}):
        """
        void InternetOpenUrlA(
            HINTERNET hInternet,
            LPCSTR    lpszUrl,
            LPCSTR    lpszHeaders,
            DWORD     dwHeadersLength,
            DWORD     dwFlags,
            DWORD_PTR dwContext
        );
        """
        hInternet, lpszUrl, lpszHeaders, dwHeadersLength, dwFlags, dwContext = argv
        cw = ApiHandler.get_char_width(ctx)
        if lpszUrl:
            url = common.read_mem_string(proc.uc_eng, lpszUrl, cw)
            argv[1] = url
        if lpszHeaders:
            hdrs = {}
            headers = common.read_mem_string(proc.uc_eng, lpszHeaders, cw)
            _headers = headers.split("\r\n")
            for header in _headers:
                k, v = header.split(":")
                if v[0] == " ":
                    v = v[1:]
                hdrs[k] = v
            argv[2] = headers

        defs = windefs.get_flag_defines(dwFlags)
        argv[4] = ' | '.join(defs)

        crack = urlparse(url)
        if crack.scheme == "http":
            # FIXME : parse port in url netloc
            port = 80
        else:
            port = 443

        http_conn_handle = proc.emu.net_manager.create_connection(
            inet_handle=hInternet,
            host=crack.netloc,  # host
            flag=dwFlags,
            ctx=dwContext,
            port=port)

        http_req_handle = proc.emu.net_manager.create_http_request(
            http_conn_handle, crack.path, flag=dwFlags)
        http_req = obj_manager.ObjectManager.get_obj_by_handle(http_req_handle)
        if hdrs:
            http_req.add_headers(hdrs)

        proc.emu.net_manager.send_http_request(http_req_handle, None)

        return http_req_handle
예제 #2
0
    def LoadLibrary(self, proc, argv, ctx={}):
        '''HMODULE LoadLibrary(
            LPTSTR lpLibFileName
        );'''

        lib_name, = argv
        hmod = windefs.NULL

        cw = common.get_char_width(ctx)
        req_lib = common.read_mem_string(proc.uc_eng, lib_name, cw)
        lib = ApiHandler.api_set_schema(req_lib)

        hmod = proc.load_library(lib)
        argv[0] = req_lib

        return hmod
예제 #3
0
    def LoadLibraryEx(self, proc, argv, ctx={}):
        '''HMODULE LoadLibraryExA(
            LPCSTR lpLibFileName,
            HANDLE hFile,
            DWORD  dwFlags
        );'''

        lib_name, _, dwFlags = argv

        hmod = 0

        cw = common.get_char_width(ctx)
        req_lib = common.read_mem_string(proc.uc_eng, lib_name, cw)
        lib = ApiHandler.api_set_schema(req_lib)

        hmod = proc.load_library(lib)

        flags = {
            0x1: 'DONT_RESOLVE_DLL_REFERENCES',
            0x10: 'LOAD_IGNORE_CODE_AUTHZ_LEVEL',
            0x2: 'LOAD_LIBRARY_AS_DATAFILE',
            0x40: 'LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE',
            0x20: 'LOAD_LIBRARY_AS_IMAGE_RESOURCE',
            0x200: 'LOAD_LIBRARY_SEARCH_APPLICATION_DIR',
            0x1000: 'LOAD_LIBRARY_SEARCH_DEFAULT_DIRS',
            0x100: 'LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR',
            0x800: 'LOAD_LIBRARY_SEARCH_SYSTEM32',
            0x400: 'LOAD_LIBRARY_SEARCH_USER_DIRS',
            0x8: 'LOAD_WITH_ALTERED_SEARCH_PATH',
        }

        pretty_flags = ' | '.join([name for bit, name in flags.items() if dwFlags & bit])

        argv[0] = req_lib
        argv[1] = argv[1]
        argv[2] = pretty_flags

        if not hmod:
            proc.set_last_error(windefs.ERROR_MOD_NOT_FOUND)

        return hmod
예제 #4
0
    def GetModuleHandle(self, proc, argv, ctx={}):
        '''HMODULE GetModuleHandle(
          LPCSTR lpModuleName
        );'''

        mod_name, = argv

        cw = self.get_char_width(ctx)
        rv = 0

        if not mod_name:
            rv = proc.image_base
        else:
            lib = common.read_mem_string(proc.uc_eng, mod_name, cw)
            if lib not in proc.imp:
                lib = ApiHandler.api_set_schema(lib)
            if lib in proc.imp:
                rv = pydll.SYSTEM_DLL_BASE[lib]
            else:
                rv = 0
                
        return rv
예제 #5
0
    def wprintf(self, proc, argv, ctx={}):

        arch = proc.get_arch()
        if arch == UC_ARCH_X86:
            fmt, va_list = ApiHandler.get_argv(proc, cv.CALL_CONV_CDECL, 2)[:2]
        else:
            raise Exception("Unsupported architecture")

        rv = 0

        fmt_str = common.read_wide_string(proc.uc_eng, fmt)
        fmt_cnt = self.get_va_arg_count(fmt_str)

        vargs = self.va_args2(fmt_cnt)
        fin = common.make_fmt_str(proc, fmt_str, vargs, True)

        rv = len(fin)
        argv.append(fin)

        # print(fin)

        return rv
예제 #6
0
    def __stdio_common_vfprintf(self, proc, argv, ctx={}):

        arch = proc.get_arch()
        if arch == UC_ARCH_X86:
            opts, opts2, stream, fmt, _, va_list = ApiHandler.get_argv(
                proc, cv.CALL_CONV_CDECL, 6)[:6]
        else:
            raise Exception("Unsupported architecture")

        rv = 0

        fmt_str = common.read_mem_string(proc.uc_eng, fmt, 1)
        fmt_cnt = self.get_va_arg_count(fmt_str)

        vargs = self.va_args(va_list, fmt_cnt)
        fin = common.make_fmt_str(proc, fmt_str, vargs)

        argv[:] = [opts, stream, fin]

        # print(fin)

        rv = len(fin)

        return rv