diff --git a/bin/rdpy-rdpmitm.py b/bin/rdpy-rdpmitm.py index 801817e..3601179 100755 --- a/bin/rdpy-rdpmitm.py +++ b/bin/rdpy-rdpmitm.py @@ -92,16 +92,17 @@ class ProxyServer(rdp.RDPServerObserver): return self._client._controller.close() - def onKeyEventScancode(self, code, isPressed): + def onKeyEventScancode(self, code, isPressed, isExtended): """ @summary: Event call when a keyboard event is catch in scan code format - @param code: {int} scan code of key - @param isPressed: {bool} True if key is down + @param code: {integer} scan code of key + @param isPressed: {boolean} True if key is down + @param isExtended: {boolean} True if a special key @see: rdp.RDPServerObserver.onKeyEventScancode """ if self._client is None: return - self._client._controller.sendKeyEventScancode(code, isPressed) + self._client._controller.sendKeyEventScancode(code, isPressed, isExtended) self._rss.keyScancode(code, isPressed) def onKeyEventUnicode(self, code, isPressed): diff --git a/rdpy/protocol/rdp/rdp.py b/rdpy/protocol/rdp/rdp.py index ba3c4ba..5ac6fc5 100644 --- a/rdpy/protocol/rdp/rdp.py +++ b/rdpy/protocol/rdp/rdp.py @@ -100,7 +100,7 @@ class RDPClientController(pdu.layer.PDUClientListener): def setUsername(self, username): """ @summary: Set the username for session - @param username: username of session + @param username: {string} username of session """ #username in PDU info packet self._secLayer._info.userName.value = username @@ -109,7 +109,7 @@ class RDPClientController(pdu.layer.PDUClientListener): def setPassword(self, password): """ @summary: Set password for session - @param password: password of session + @param password: {string} password of session """ self.setAutologon() self._secLayer._info.password.value = password @@ -117,7 +117,7 @@ class RDPClientController(pdu.layer.PDUClientListener): def setDomain(self, domain): """ @summary: Set the windows domain of session - @param domain: domain of session + @param domain: {string} domain of session """ self._secLayer._info.domain.value = domain @@ -127,6 +127,13 @@ class RDPClientController(pdu.layer.PDUClientListener): """ self._secLayer._info.flag |= sec.InfoFlag.INFO_AUTOLOGON + def setAlternateShell(self, appName): + """ + @summary: set application name of app which start at the begining of session + @param appName: {string} application name + """ + self._secLayer._info.alternateShell.value = appName + def setKeyboardLayout(self, layout): """ @summary: keyboard layout @@ -269,11 +276,12 @@ class RDPClientController(pdu.layer.PDUClientListener): except InvalidValue: log.info("try send wheel event with incorrect position") - def sendKeyEventScancode(self, code, isPressed): + def sendKeyEventScancode(self, code, isPressed, extended = False): """ @summary: Send a scan code to RDP stack @param code: scan code @param isPressed: True if key is pressed and false if it's released + @param extended: {boolean} extended scancode like ctr or win button """ if not self._isReady: return @@ -281,11 +289,12 @@ class RDPClientController(pdu.layer.PDUClientListener): try: event = pdu.data.ScancodeKeyEvent() event.keyCode.value = code - if isPressed: - event.keyboardFlags.value |= pdu.data.KeyboardFlag.KBDFLAGS_DOWN - else: + if not isPressed: event.keyboardFlags.value |= pdu.data.KeyboardFlag.KBDFLAGS_RELEASE + if extended: + event.keyboardFlags.value |= pdu.data.KeyboardFlag.KBDFLAGS_EXTENDED + #send event self._pduLayer.sendInputEvents([event]) @@ -478,7 +487,7 @@ class RDPServerController(pdu.layer.PDUServerListener): for event in slowPathInputEvents: #scan code if event.messageType.value == pdu.data.InputMessageType.INPUT_EVENT_SCANCODE: - observer.onKeyEventScancode(event.slowPathInputData.keyCode.value, not (event.slowPathInputData.keyboardFlags.value & pdu.data.KeyboardFlag.KBDFLAGS_RELEASE)) + observer.onKeyEventScancode(event.slowPathInputData.keyCode.value, not (event.slowPathInputData.keyboardFlags.value & pdu.data.KeyboardFlag.KBDFLAGS_RELEASE), bool(event.slowPathInputData.keyboardFlags.value & pdu.data.KeyboardFlag.KBDFLAGS_EXTENDED)) #unicode elif event.messageType.value == pdu.data.InputMessageType.INPUT_EVENT_UNICODE: observer.onKeyEventUnicode(event.slowPathInputData.unicode.value, not (event.slowPathInputData.keyboardFlags.value & pdu.data.KeyboardFlag.KBDFLAGS_RELEASE)) @@ -652,11 +661,12 @@ class RDPServerObserver(object): """ raise CallPureVirtualFuntion("%s:%s defined by interface %s"%(self.__class__, "onClose", "RDPClientObserver")) - def onKeyEventScancode(self, code, isPressed): + def onKeyEventScancode(self, code, isPressed, isExtended): """ @summary: Event call when a keyboard event is catch in scan code format - @param code: scan code of key - @param isPressed: True if key is down + @param code: {integer} scan code of key + @param isPressed: {boolean} True if key is down + @param isExtended: {boolean} True if a special key """ raise CallPureVirtualFuntion("%s:%s defined by interface %s"%(self.__class__, "onKeyEventScanCode", "RDPServerObserver")) diff --git a/rdpy/protocol/rdp/sec.py b/rdpy/protocol/rdp/sec.py index 9462715..7a49b5a 100644 --- a/rdpy/protocol/rdp/sec.py +++ b/rdpy/protocol/rdp/sec.py @@ -323,7 +323,7 @@ class RDPInfo(CompositeType): #code page self.codePage = UInt32Le() #support flag - self.flag = UInt32Le(InfoFlag.INFO_MOUSE | InfoFlag.INFO_UNICODE | InfoFlag.INFO_LOGONNOTIFY | InfoFlag.INFO_LOGONERRORS | InfoFlag.INFO_DISABLECTRLALTDEL) + self.flag = UInt32Le(InfoFlag.INFO_MOUSE | InfoFlag.INFO_UNICODE | InfoFlag.INFO_LOGONNOTIFY | InfoFlag.INFO_LOGONERRORS | InfoFlag.INFO_DISABLECTRLALTDEL | InfoFlag.INFO_ENABLEWINDOWSKEY) self.cbDomain = UInt16Le(lambda:sizeof(self.domain) - 2) self.cbUserName = UInt16Le(lambda:sizeof(self.userName) - 2) self.cbPassword = UInt16Le(lambda:sizeof(self.password) - 2)