Ìpàdé RDP nílò àdírẹ́sì oníbàárà, àwọn orísun tó hàn gbangba kò sì fohùn ṣọ̀kan. CLIENTNAME ń fún ni ní orúkọ kọ̀mpútà, ìforúkọsílẹ̀ ń pa àwọn iye mọ́ láti ìpàdé mìíràn, ẹ̀gbẹ́ kejì sọ́kẹ́tì sì lè jẹ́ àdírẹ́sì ẹnubodè tàbí NAT dípò oníbàárà. Windows ń fi àdírẹ́sì oníbàárà tí a ròyìn hàn fún ìpàdé kọ̀ọ̀kan, ṣùgbọ́n o gbọ́dọ̀ béèrè fún ìpàdé tó tọ́ kí o sì túmtú ìdáhùn dáadáa.

So ìwárí mọ́ ìpàdé kan

Bẹ̀rẹ̀ pẹ̀lú ìpàdé, kì í ṣe ènìyàn. Olùgbàlejò RDP Windows lè gbé ìpàdé púpọ̀ fún àkọsílẹ̀ kan, àdírẹ́sì tí a rí ṣáájú àtúnso pẹ̀lú sì lè máà bára ìsopọ̀ tó ń ṣiṣẹ́ mu mọ́. Ṣàkọ́sílẹ̀ ID ìpàdé, olùmúlò àti àkókò àkíyèsí papọ̀. ID ìpàdé ni kọ́kọ́rọ́ tí API ń retí, òun sì ni iye tó ń dá àbò bo ìpàdé méjì kúrò nínú ìdàrúdàpọ̀.

Lórí olùgbàlejò, àwọn irinṣẹ́ ìpàdé tí a fi sórí ń ṣàkọsílẹ̀ ohun tó wà; lo ìwò àbójútó nígbà tí o bá ní ẹ̀tọ́ sí i. Jẹ́rìí ID tí o yàn ní kété ṣáájú ìbéèrè, nítorí ID tí a tún lò ń dá dátà ìpàdé mìíràn padà.

qwinsta

Pe WTSQuerySessionInformationW fún ID yẹn

API Terminal Services ń dá ìbéèrè lóhùn pẹ̀lú kíláàsì ìsọfúnni 14, WTSClientAddress. Ìbòmọ́lẹ̀ ctypes kékeré tó lórí Windows, ó sì yẹra fún kíkà hive olùmúlò mìíràn. Kóòdù tó wà nísàlẹ̀ ń gba ID ìpàdé tó ṣe kedere ó sì béèrè lọ́wọ́ olùgbàlejò àdúgbò.

import ctypes
import ipaddress
import socket
from ctypes import wintypes

class WTS_CLIENT_ADDRESS(ctypes.Structure):
    _fields_ = [("AddressFamily", wintypes.DWORD),
                ("Address", ctypes.c_ubyte * 20)]

wts = ctypes.WinDLL("Wtsapi32", use_last_error=True)
query = wts.WTSQuerySessionInformationW
query.argtypes = [wintypes.HANDLE, wintypes.DWORD, ctypes.c_int,
                  ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(wintypes.DWORD)]
query.restype = wintypes.BOOL
free = wts.WTSFreeMemory
free.argtypes = [ctypes.c_void_p]

def client_address(session_id):
    buf = ctypes.c_void_p()
    size = wintypes.DWORD()
    if not query(None, session_id, 14, ctypes.byref(buf), ctypes.byref(size)):
        raise ctypes.WinError(ctypes.get_last_error())
    try:
        if size.value < ctypes.sizeof(WTS_CLIENT_ADDRESS):
            raise RuntimeError("short WTS buffer")
        value = ctypes.cast(buf, ctypes.POINTER(WTS_CLIENT_ADDRESS)).contents
        raw = bytes(value.Address)
        if value.AddressFamily == socket.AF_INET:
            addr = ipaddress.ip_address(raw[2:6])
        elif value.AddressFamily == socket.AF_INET6:
            addr = ipaddress.ip_address(raw[:16])
        else:
            return None
        return None if addr.is_unspecified else str(addr)
    finally:
        free(buf)

Fi ID ìpàdé odidi tí o ṣẹ̀ṣẹ̀ jẹ́rìí ránṣẹ́, kí o sì pa ọwọ́ sáàbà òdo mọ́ fún ẹ̀rọ àdúgbò. Ka ìpè tí kò yọrí sí àṣeyọrí gẹ́gẹ́ bí àṣìṣe kì í ṣe àdírẹ́sì tó kùnà, nítorí àwọn méjèèjì ń yọrí sí àwọn ìparí tó yàtọ̀. Ìbéèrè ìpàdé olùmúlò mìíràn nílò àṣẹ Query Information tó yẹ, nítorí náà ṣiṣẹ́ irinṣẹ́ náà lábẹ́ àkọsílẹ̀ tí a fún ní àṣẹ yẹn dípò gbígbé àǹfààní ga ní àkókò kúkúrú. Bọ́ọ̀sì tí a dá padà jẹ́ ti API ó sì gbọ́dọ̀ tú sílẹ̀ pàápàá nígbà tí ìtúmtú bá kùnà.

Túmtú ẹbí, kí o sì tú bọ́ọ̀sì sílẹ̀

Ìtò náà kì í ṣe okùn IP. Pápá ẹbí rẹ̀ ń pinnu bí a ṣe ń ka ogún báìtì àdírẹ́sì: IPv4 bẹ̀rẹ̀ ní àléfọ̀ méjì, nígbà tí IPv6 bẹ̀rẹ̀ ní àléfọ̀ òdo. Àdírẹ́sì tí a kò pàtó ń túmọ̀ sí pé oníbàárà kò ròyìn ọ̀kankan, èyí kò jẹ́ ohun kan náà pẹ̀lú okùn òfo. Àwọn ìsopọ̀ Remote Desktop Gateway ni a kọ sílẹ̀ gẹ́gẹ́ bí ipò tí àdírẹ́sì kò sí, nítorí náà ìpàdé tí ó gba ẹnubodè kò ròyìn ohunkóhun tó wúlò nípa àdírẹ́sì gidi oníbàárà. Nígbà náà ìsopọ̀ gbọ́dọ̀ lọ sí àwọn àkọsílẹ̀ ẹnubodè fúnra rẹ̀.

Tẹ̀ ẹbí jáde lẹ́gbẹ̀ẹ́ àdírẹ́sì nígbà tí o ń ṣe àtúnṣe, nítorí àìbáramu láàrin àwọn méjèèjì ni ohun tó ń fa iye tó dàbí ojúlówó ṣùgbọ́n tí kò tọ́. Tú bọ́ọ̀sì náà sílẹ̀ pẹ̀lú WTSFreeMemory nínú blọ́ọ̀kì finally kí ìyàtọ̀ má baà jẹ́ kó tú jáde.

Ya àdírẹ́sì tí a ròyìn kúrò nínú ẹ̀rí

Àdírẹ́sì oníbàárà tí a ròyìn jẹ́ gbólóhùn tí oníbàárà pèsè, kì í ṣe àkíyèsí tí a lè gbẹ́kẹ̀ lé. Kì í ṣe ẹ̀gbẹ́ kejì TCP, kì í ṣe tábìlì ìyásọ́tọ̀ ẹnubodè VPN, kì í sì í ṣe àdírẹ́sì gbangba oníbàárà. Nígbà tí ìbéèrè gidi bá jẹ́ ìyásọ́tọ̀ VPN wo ni ó jẹ́ ti ènìyàn kan, so àkọsílẹ̀ ìpàdé tí a fìdí rẹ̀ múlẹ̀ ti sáàbà VPN pọ̀ ní àkókò kan náà. Nígbà tí ìbéèrè bá jẹ́ orísun wo ni ó dé ọ̀dọ̀ olùgbọ́, ka tábìlì ìsopọ̀ tàbí àwọn àkọsílẹ̀ ẹ̀gbẹ́ sáàbà tí a gbà láàyè.

Pa àwọn iye wọ̀nyí mọ́ pẹ̀lú àmì ọ̀tọ̀ọ̀tọ̀ nínú irinṣẹ́ àtìlẹ́yìn èyíkéyìí. Àbájáde WTS tí ó ṣáìnì gbọ́dọ̀ wà ní ṣáìnì dípò kí ó padà sí iye ìforúkọsílẹ̀ àìdájú láti ìpàdé mìíràn. Ṣàkọsílẹ̀ ID ìpàdé lẹ́gbẹ̀ẹ́ àdírẹ́sì, nítorí olùmúlò kan náà lè tún sopọ̀ kí ó sì gba iye tuntun. Bóyá orúkọ oníbàárà tàbí àdírẹ́sì tí a ròyìn kò tó ẹ̀rí láti fúnni ní àǹfààní.

Àwọn àpilẹ̀kọ tó jọra