@@ -44,6 +44,26 @@ class ALPC_RPC_BIND(ctypes.Structure):
4444 ("UNK9" , gdef .DWORD ),
4545 ]
4646
47+ class ALPC_RPC_CALL (ctypes .Structure ):
48+ _pack_ = 1
49+ _fields_ = [
50+ ("request_type" , gdef .DWORD ),
51+ ("UNK1" , gdef .DWORD ),
52+ ("flags" ,gdef .DWORD ),
53+ ("request_id" , gdef .DWORD ),
54+ ("if_nb" , gdef .DWORD ),
55+ ("method_offset" , gdef .DWORD ),
56+ ("UNK2" , gdef .DWORD ),
57+ ("UNK3" , gdef .DWORD ),
58+ ("UNK4" , gdef .DWORD ),
59+ ("UNK5" , gdef .DWORD ),
60+ ("UNK6" , gdef .DWORD ),
61+ ("UNK7" , gdef .DWORD ),
62+ ("UNK8" , gdef .DWORD ),
63+ ("UNK9" , gdef .DWORD ),
64+ ("UNK10" , gdef .DWORD ),
65+ ("UNK11" , gdef .DWORD ),
66+ ]
4767
4868class RPCClient (object ):
4969 """A client for RPC-over-ALPC able to bind to interface and perform calls using NDR32 marshalling"""
@@ -99,18 +119,26 @@ def _send_request(self, request):
99119 def _forge_call_request (self , interface_nb , method_offset , params ):
100120 # TODO: differents REQUEST_IDENTIFIER for each req ?
101121 # TODO: what is this '0' ? (1 is also accepted) (flags ?)
102- request = struct .pack ("<16I" , gdef .RPC_REQUEST_TYPE_CALL , NOT_USED , 1 , self .REQUEST_IDENTIFIER , interface_nb , method_offset , * [NOT_USED ] * 10 )
103- request += params
104- return request
122+ # request = struct.pack("<16I", gdef.RPC_REQUEST_TYPE_CALL, NOT_USED, 1, self.REQUEST_IDENTIFIER, interface_nb, method_offset, *[NOT_USED] * 10)
123+ req = ALPC_RPC_CALL ()
124+ req .request_type = gdef .RPC_REQUEST_TYPE_CALL
125+ req .flags = 0
126+ req .request_id = self .REQUEST_IDENTIFIER
127+ req .if_nb = interface_nb
128+ req .method_offset = method_offset
129+
130+ return buffer (req )[:] + params
105131
106132 def _forge_bind_request (self , uuid , syntaxversion , requested_if_nb ):
107133 version_major , version_minor = syntaxversion
108134 req = ALPC_RPC_BIND ()
109135 req .request_type = gdef .RPC_REQUEST_TYPE_BIND
110136 req .target = gdef .RPC_IF_ID (uuid , * syntaxversion )
111137 req .flags = gdef .BIND_IF_SYNTAX_NDR32
138+ # req.flags = gdef.BIND_IF_SYNTAX_NDR64
112139 req .if_nb_ndr32 = requested_if_nb
113140 req .if_nb_ndr64 = 0
141+ req .if_nb_ndr64 = requested_if_nb
114142 req .if_nb_unkn = 0
115143 req .register_multiple_syntax = False
116144 req .some_context_id = 0xB00B00B
0 commit comments