• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    KOJAProgramovani 40+
    JANFROG
    JANFROG --- ---
    KLEINZACH: Presne! Tohle je typ znalosti ktere ma malo lidi (komparativne k mase programatoru) a kdyz si najdes nekoho kdo tohle potrebuje, muzes si diktovat podminky - druheho takoveho tezko najdou (a kdyz, bude stejne zpovykanej :-)
    KLEINZACH
    KLEINZACH --- ---
    SUCHRE: jo je to zajimava lekce, pac to delam poprvy: jeste pred mesicem jsem netusil co dela COM uvnitr, nevedel nic o widlich RPC a uz vubec netusil ze existuje ALPC. oprasil sem trochu asm (psat bych v tom uz asi neumel, ale zbezne to cist jeste umim), nasel celkem paradni nastroje (IDA je fakt bozi, jeste ghidra vypada dobre) ale je to vlastne celkem zabava :) a urcite se to jeste bude hodit az bude nekde neco otravovat..

    CERMI_FOX: lol, ja a microsoft bysme nemeli sedet v jedny lavici :D
    ANT_39: budme radikalni: open sourcnout widle!
    SUCHRE
    SUCHRE --- ---
    Tohle je 40+. Predstava, ze to nekdo pod 30 pise v jave, je jeste desivejsi.
    VOY
    VOY --- ---
    Jakkoliv je tema zajimavy, tak si myslim, ze se pomalu ale jiste dostavame mimo tema 40+ ;-).
    ANT_39
    ANT_39 --- ---
    CERMI_FOX: Kdybys radši dropoval nenápadný plausible-deniability hinty, aby se Kleinzach nažral a NDA zůstalo celý :)
    SUCHRE
    SUCHRE --- ---
    KLEINZACH: jo, tomu rozumim. od urcityho okamziku to tak je. na druhou stranu je treba rict, ze timhle zpusobem se daji ziskat neocenitelny zkusenosti, ze?
    AMBIENTIUM
    AMBIENTIUM --- ---
    CERMI_FOX: taky by mohl jít psát viry a antiviry :-))))
    CERMI_FOX
    CERMI_FOX --- ---
    KLEINZACH: kruty. Nechces jit delat k nam do Microsoftu a zdrojak widli si stahnout z gitu namisto tohohle vyzkumnyho dila? :-)
    KLEINZACH
    KLEINZACH --- ---
    NOHOUS: jj urcite, to k cemu to potrebuju je open source (v podstate modernizuju blackbox4windows (byl jsem dev/maintainer pred tim nez prisly deti, pak jsem to musel povesit na hrebik), bb4win, bbLean a kdovi kolik verzi to melo).
    JANFROG
    JANFROG --- ---
    KLEINZACH: Bez .pdb se to taky da, i kdyz je to vic prace. Odrazis se z export, import a relocation tables v tech .DLL. To pomuze alespon na ta volani co prekracuji hranici tech .dll. Ale jasne. .pdb je o dooost pohodlnejsi.
    NOHOUS
    NOHOUS --- ---
    KLEINZACH: zdokumentujes to pak nekde verejne?
    KLEINZACH
    KLEINZACH --- ---
    dik :) bez tech pdb bych byl v peerdeli, nedokazu si to predstavit delat bez symbolu. mozna nejakej malej izolovanej kousek, ale ne takle pres 2 vrstvy a zpet.

    bohuzel kdyz chce clovek programove zachazet s tema jejich virtualnima desktopama, musi, protoze jediny oficialni co nam mrkvosoft dal, jsou 3 naprosto neuzitecny volani: IVirtualDesktopManager::GetWindowDesktopId IVirtualDesktopManager::IsWindowOnCurrentVirtualDesktop a IVirtualDesktopManager::MoveWindowToDesktop. s tim se neda NIC poradnyho delat. ( https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ivirtualdesktopmanager )

    SUCHRE: vysoka - prakticky s kazdym novym windows sdk (ted je 22621). v kazdy edici widli se zmenej minualne guidy tech interface. to se da jeste dohledat v registrech, pripadne inspekci actxprxy.dll (ale to jsem jeste nedavno nevedel) a pridaj dalsi volani. na internetu je asi tak 5 open source projektu, ktery todle delaj. z toho 2 podporujou maximalne windows 10 (sdk < 22000). jeden je v pascalu (nejakej organizer chat-botu), jeden v dot netu a jeden v rustu (dll pro prepinani workspace v AutoHotkey). inspirovat jima se muzu, ale moc mi to nepomuze s mym problemem ze na w11 to v nekterych volanich pada. a kdyz prijde ta zmena, nemuzu se na ne spolehnout, ze to udelaj kdyz ja potrebuju.. proto to chci umet z widli vydojit sam a navic - ted uz je to osobni ;)
    MLEKAR_STEIN
    MLEKAR_STEIN --- ---
    KLEINZACH: čumím a to jak péro z gauče.
    a más můj obdiv.
    SH_PANDA
    SH_PANDA --- ---
    SH_PANDA: nejvic low level vec co jsem od vysky napsal byl dnes nejaky kus kodu v c#. teda spis jsem rekl copilotu do potrebuji a doladil to pilnikem
    SUCHRE
    SUCHRE --- ---
    Jaka je pravdepodobnost, ze se to v nasledujici verzi zmeni nebo jinak dojebe? Jinak obdivuju tu snahu, taky jsem se kdysi pokousel o neco podobnyho, ale vzdal.
    SH_PANDA
    SH_PANDA --- ---
    kdyz to ctu, tak si pripadam tak nejak menejcenne ... jsem uplny pojidac kolacu ...
    KLEINZACH
    KLEINZACH --- ---
    JANFROG: ja sem si rikal, ze bych mel, ale byl sem moc linej na ten setup :) priste
    JANFROG
    JANFROG --- ---
    KLEINZACH:
    > attachovat se na explorer je prdel, clovek si ze zacatku neuvedomi co nemuze: je to jak xwindows bez window managera :)

    Presne z tohodle duvodu delam tyhle veci zasadne v simulatorech / virtualnich strojich a teprve az to odladim tam, zkousim to na opravdovem zeleze
    (ne ze by to resilo vsechno, bug ve firmwaru do bezici pod OS a zpusobujici pad JVM to neodhali - a teda to je take lahudka hledat :-)
    KLEINZACH
    KLEINZACH --- ---
    blizim se :)

    rpc bylo hodne, ale pak mi doslo jedno biblicke rceni: "co je marshalovano, musi byt nekde demarshalovano". takze jsem si dal breakpoint na combase.dll!CoUnmarshalInterface. tech uz nebylo tolik a kdyz jsem je proklikaval, tak se periodicky stridalo rekneme 5 com unmarshalu. po kratke prohlidce stacku jsem na jednom z nich nasel actxprxy.dll a OneCoreCommonProxyStub.dll (ci tak nejak) o kterych vim, ze se me tykaj. tendle thread jsem sledoval a dovedl me do twinui.pcshell.dll, ktery jsem prohlidnul a zacal v nem nachazet fragmenty toho, co me zajima (IVirtualDesktopManagerInternal a podobne). napsal jsem si test, kterej na tomdle interfacu zavola GetCount, attachnul na explorera, dal breakpoint do twinui.pcshell.dll!CVirtualDesktopManager::GetCount, pustil test a bang! :)

    co dela klient:
    TLDR: com/interface -> com/proxy -> rpc -> alpc

    >	rpcrt4.dll!LRPC_BASE_CCALL::DoSendReceive()	Unknown
     	rpcrt4.dll!LRPC_CCALL::SendReceive()	Unknown
     	rpcrt4.dll!I_RpcSendReceive()	Unknown
     	combase.dll!CMessageCall::RpcSendRequestReceiveResponse(const _GUID & moidForTracing) Line 4281	C++
     	[Inline Frame] combase.dll!ThreadSendReceive(tagRPCOLEMESSAGE *) Line 7282	C++
     	[Inline Frame] combase.dll!CSyncClientCall::SwitchAptAndDispatchCall(tagRPCOLEMESSAGE * pMessage) Line 5735	C++
     	combase.dll!CSyncClientCall::SendReceive2(tagRPCOLEMESSAGE * pMessage, unsigned long * pstatus) Line 5297	C++
     	[Inline Frame] combase.dll!SyncClientCallRetryContext::SendReceiveWithRetry(tagRPCOLEMESSAGE *) Line 1494	C++
     	[Inline Frame] combase.dll!CSyncClientCall::SendReceiveInRetryContext(SyncClientCallRetryContext *) Line 582	C++
     	combase.dll!DefaultSendReceive(CSyncClientCall * pClientCall, tagRPCOLEMESSAGE * pMsg, unsigned long * pulStatus) Line 540	C++
     	combase.dll!CSyncClientCall::SendReceive(tagRPCOLEMESSAGE * pMessage, unsigned long * pulStatus) Line 787	C++
     	combase.dll!CClientChannel::SendReceive(tagRPCOLEMESSAGE * pMessage, unsigned long * pulStatus) Line 659	C++
     	combase.dll!NdrExtpProxySendReceive(void * pThis, _MIDL_STUB_MESSAGE * pStubMsg) Line 1989	C++
     	rpcrt4.dll!NdrpClientCall3()	Unknown
     	combase.dll!ObjectStublessClient(void * ParamAddress, __int64 * FloatRegisters, long Method) Line 366	C++
     	combase.dll!ObjectStubless() Line 176	Unknown
    


    tady je videt druha strana - server - toho volani (nekde okolo NdrStubCall3 je ten CoUnmarshalInterface):
    TLDR: alpc -> rpc -> com/stub -> com/interface -> dll
    >	twinui.pcshell.dll!CVirtualDesktopManager::GetCount(unsigned int *)	Unknown
     	rpcrt4.dll!Invoke()	Unknown
     	rpcrt4.dll!Ndr64StubWorker()	Unknown
     	rpcrt4.dll!NdrStubCall3()	Unknown
     	combase.dll!CStdStubBuffer_Invoke(IRpcStubBuffer * This, tagRPCOLEMESSAGE * prpcmsg, IRpcChannelBuffer * pRpcChannelBuffer) Line 1479	C++
     	[Inline Frame] combase.dll!InvokeStubWithExceptionPolicyAndTracing::__l6::::operator()() Line 1151	C++
     	combase.dll!ObjectMethodExceptionHandlingAction<>(InvokeStubWithExceptionPolicyAndTracing::__l6:: action, ObjectMethodExceptionHandlingInfo * pExceptionHandlingInfo, ExceptionHandlingResult * pExceptionHandlingResult, void *) Line 94	C++
     	[Inline Frame] combase.dll!InvokeStubWithExceptionPolicyAndTracing(IRpcStubBuffer * pMsg, tagRPCOLEMESSAGE *) Line 1149	C++
     	combase.dll!DefaultStubInvoke(bool bIsAsyncBeginMethod, IServerCall * pServerCall, IRpcChannelBuffer * pChannel, IRpcStubBuffer * pStub, unsigned long * pdwFault) Line 1218	C++
     	combase.dll!SyncServerCall::StubInvoke(IRpcChannelBuffer * pChannel, IRpcStubBuffer * pStub, unsigned long * pdwFault) Line 791	C++
     	[Inline Frame] combase.dll!StubInvoke(tagRPCOLEMESSAGE * pMsg, const _GUID &) Line 1483	C++
     	combase.dll!ServerCall::ContextInvoke(tagIPIDEntry * ipidEntry) Line 1421	C++
     	combase.dll!ComInvokeWithLockAndIPID(ServerCall * pServerCall, tagIPIDEntry * pIPIDEntry) Line 2152	C++
     	[Inline Frame] combase.dll!ThreadInvokeReturnHresult(_RPC_MESSAGE *) Line 6944	C++
     	combase.dll!ThreadInvoke(_RPC_MESSAGE * message) Line 7044	C++
     	rpcrt4.dll!DispatchToStubInCNoAvrf()	Unknown
     	rpcrt4.dll!RPC_INTERFACE::DispatchToStubWorker()	Unknown
     	rpcrt4.dll!RPC_INTERFACE::DispatchToStubWithObject()	Unknown
     	rpcrt4.dll!LRPC_SCALL::DispatchRequest()	Unknown
     	rpcrt4.dll!LRPC_SCALL::HandleRequest(struct _PORT_MESSAGE *,struct _PORT_MESSAGE *,void *,unsigned __int64,class RPCP_ALPC_HANDLE_ATTR *)	Unknown
     	rpcrt4.dll!LRPC_SASSOCIATION::HandleRequest()	Unknown
     	rpcrt4.dll!LRPC_ADDRESS::HandleRequest()	Unknown
     	rpcrt4.dll!LRPC_ADDRESS::ProcessIO(void *)	Unknown
     	rpcrt4.dll!LrpcIoComplete()	Unknown
     	ntdll.dll!TppAlpcpExecuteCallback()	Unknown
     	ntdll.dll!TppWorkerThread()	Unknown
     	kernel32.dll!BaseThreadInitThunk()	Unknown
     	ntdll.dll!RtlUserThreadStart()	Unknown
    

    dalsim krokem je tedy vytahnout z toho dll/pdb/debugu interface toho, co me zajima a udelat z toho headery (ty nezdokumentovany interfacy ne ze by tam byly nejak explicitne, ze bych je vykopiroval a hotovo, spis ve forme forward deklaraci nebo tak neco)

    --
    attachovat se na explorer je prdel, clovek si ze zacatku neuvedomi co nemuze: je to jak xwindows bez window managera :)
    napr: jdu od kompu, loaduje to symboly tak to zamknu, aby mi to deti nestoply... shit! uz to neodemknu! dam breakpoint do klavesovy zkratky win+tab, abych videl kam to vede, attachnu, zmacknu, breakpoint hitne, ale zustanu viset v nabidce virtualnich desktopu, protoze explorer visi v breakpointu v debuggeru na pozadi :) po kazdym takovymdle omylu hard reset, pac z toho neni cesta ven
    KLEINZACH
    KLEINZACH --- ---
    hehe :) stouram se v exploderu (kdyz mam cas: jsme po rekonstrukci, takze ho zase tolik neni.. od patku jsem presouval predmety a cistil plochy).

    to moje RPC konci ve volani NtAlpcSendWaitReceivePort. pokracuje se dal pres nedokumentovane Asynchronous Local Procedure Call ( ALPC ), ktere je zdokumentovane (reverzne) zde, docela zajimave cteni:
    Offensive Windows IPC Internals 3: ALPC · csandker.io
    https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC.html

    druhej konec je tedy ALPC port OLExxxxxx v exploreru.

    ted se snazim v exploderu neceho chytnout. kdyz se pichnu na rpcrt4.dll!I_RpcSendReceive, tak tam toho chodi strasne moc (mozna bych mel to debugovat na cisty instalaci, treba by toho bylo min.. mam ruzny shell extensions atp). uz jsem zahlid na callstacku ServiceProvider a ImmersiveShell *), coz jsou cca keywordy ktery by mohly vest k cili. musim to nejak odfiltrovat podle toho ALPC portu, nebo podle guidu ci tak neco.

    do toho zkousim tooly co by mi pomohly - decompilery (relyze, cutter, jeste me ceka ghidra) atp. hodne pouzivam IDA pro (free) protoze je to strasne pohodlny na hrabani v symbolech a tak. skoda ze jejich dekompiler je standalone a tak drahej (~2700$), protoze samotna ida home by mozna za tech $300 stala. $2700 uz je zavazek :) windbg je hodne spartansky, ale narozdil od vizualka aspon nepada (dela mu problem krokovani asembleru kdyz se attachnu na explorer, na brouzdani callstackama je to ok).

    taky jsem zkousel v polospanku prochazet windousi dll, ktery by se mohly tykat tematu, ale widle maj tech dll strasne moc, tudy asi ne-e

    --

    *) tvl proc se ve widlich jmenuje takova spousta veci Immersive.* (ImmersiveTask, ImmersiveIcon, ImmersiveShell, ImmersiveWindow, ImmersiveColorImpl, ImmersiveContextMenuHelper.. na tech vecech neni nic imersivniho, to jsou zakladni veci! cejtim vliv managementu ;)
    Kliknutím sem můžete změnit nastavení reklam