From 6e833bea8bb99232d40f9ff68f4aa1d481df6b7b Mon Sep 17 00:00:00 2001 From: Austin Williams Date: Fri, 2 Aug 2019 21:40:35 -0500 Subject: [PATCH] Fixed problems preventing the pipe from being used properly when launched from Jollypop Injector --- MonoJabber/.vs/MonoJabber/v15/.suo | Bin 46080 -> 49152 bytes MonoJabber/.vs/MonoJabber/v15/Browse.VC.db | Bin 38400000 -> 38400000 bytes MonoJabber/MonoJabber/MonoJabber.cpp | 29 ++++++++++-------- MonoLoaderDLL/MonoLoaderDLL/MonoLoaderDLL.cpp | 1 + TODO.md | 4 +++ 5 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 TODO.md diff --git a/MonoJabber/.vs/MonoJabber/v15/.suo b/MonoJabber/.vs/MonoJabber/v15/.suo index 25cdf7884d30d46bf398c08c59b94ef913514bde..2f7f926ae97c0ebc574b436d6aecf3cb3d66b67b 100644 GIT binary patch delta 2259 zcmb_dU1%It6y7^Oo6TmXo91VCtLfx#TVmYWT}?LGnBc}t+RYDSqeb$V)LJBH2zHbT z1*Z~!D1#((q_hD=#vU*bdbocYy&{gC-kjFc zI4=d(#C6@ihL~6%ne#Z9A4#$l#*$c@UpBdEPtW-ufBG+a*7YnLK*OXXIVK%R0TP~c zj3Io5NXHfgoomIh0g*tEN~9_&N_(U#J)|P3iV8k`-xWOQIU`5^q+mR-k4JVZ*zPH~ z8C_-U7g%ffEaI1jTYu6FY;jqrNF|9>@GFcqZB1_D?)4?mWW!9UQW}jt;@!^ml)_4< z`;uT3kHc0{H(^W4ioYQ_0o%>rKslU&N=pgKTt<8e*&@8!`j(kgr6aiT6X;q@mL$p= zkEj_;Vn9tJpdWZ0xWTX7;0E0wwY*^sb7p)@W{vm`RY3K|0u@nv_f7@rYY z7SF=WsY8(A>Oe~vW|JyVxA~l{H5troQ=RK;Z6#>{H~so|%^*p&Q-`Q})ebs0%Bez6 zz!+$`@1$NNs5@(C2Tu6jpzwx(4Y8e{bmG&7FupJ*apn}-tNcb&IDu~p}A=rLwO1keh+b6})qk#+9T1T)@uqOs^cTbf9)|}49 z?eiy7j4y{``2UiG>(8EPe6JAwWclRLFZ9DZx7JptK7~I{x7u^3K4#{+4u#8;_Ko!% zGY7p~)q26PSG?0+!AahWbY(Yr>4tnRo$YtiSIb?{_U=5EB6sExzE;wJsk1cBdTJkh zpz3Uw@4Lm)wdMA5wNMSGk*S*hS0fLNkzHFGGDKKjxL{v6_6mcICDm5vzhrRj`2<|O z6t|C@{+@@~;~VzI(k!zUIcr(ilTN%7ZWOFH6N^M!&0*WL#O!6_7ErSnCX`@%UUL|Oz9+)(@v{4w@Uci;5Q^m~$Ky>mD!D0tz+ zIp=wv^PKZM&pGE7i?-rjaVf$4*T?pW%t;5uj>gLSmpwO+{Kx`yPW+BG#29I|Y_&CQ zL3V(WviC)&AP9eKe=bX(i`*EugI3@J46vb z#cLg@dl=FYFbX=r^B@7nz&JPzRB)6}kSEbQ&U-Z29$^obXFt)!8Rn?QR{ZdVPrpEH z&mguFwBd@8Db`|p7-K`YI|vUB5CScL@63+23p4>9Q6t)?Ya0yt6%4phKiYkOht~|A z0-bcFtzC|y7pE`Vye&!etO12#!gfw5{PG1J zQ8=@*5Qb#Of%CRpy;gOJ{4>06Z;Q0&#&!nH@|n~bx}_g*`#qP5n{H_gho8ztyCF1+noGmy7<<_8~1*H`?X({ zj9j4K&bW<}AFRqND-z9~zHi*u9E`3M6hkSPHc~IR>FR|}WB9~3tUOn2+P%y1Ri;P1 z(gIKI`p0paor*LK4@5>U9({S?>?z7bW5$g)r)<=GIYH}}nvI$ACTr(4P79}mdEuP! zs&G*#po)X|WdTIsHq?(QHoCs(rS&zB(R=0xTlq$hB!7ij4MzWJi;arvF*-RKr^+=| qU&~Wo?W6LdhnD&V>D_BRhN&tHf&Rmdec#x!h9&CX*XW45UhYryf~oZY diff --git a/MonoJabber/.vs/MonoJabber/v15/Browse.VC.db b/MonoJabber/.vs/MonoJabber/v15/Browse.VC.db index d6148c7e481f70863d4999b96b4ae40cd52ca23e..b2c00293bb0b37df1798d0905d73c99cbab0d907 100644 GIT binary patch delta 5990 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 J=7`Rs{{U!g=ePg> delta 5995 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 X*yxlP|7 diff --git a/MonoJabber/MonoJabber/MonoJabber.cpp b/MonoJabber/MonoJabber/MonoJabber.cpp index ea4613f..3f28961 100644 --- a/MonoJabber/MonoJabber/MonoJabber.cpp +++ b/MonoJabber/MonoJabber/MonoJabber.cpp @@ -48,7 +48,7 @@ std::string GetMonoLoaderDLLPath() { std::string::size_type positionToTrunc = std::string(buffer).find_last_of("\\/"); std::string currentDirectory = std::string(buffer).substr(0, positionToTrunc); std::string pathToLoaderDLL = currentDirectory + "\\MonoLoaderDLL.dll"; - const char *pathArg = pathToLoaderDLL.c_str(); // Really don't like this. + const char *pathArg = pathToLoaderDLL.c_str(); if (!DoesDLLExist(&pathArg)) { return ""; @@ -58,10 +58,10 @@ std::string GetMonoLoaderDLLPath() { } HANDLE CreatePipe() { - HANDLE hPipe = ::CreateNamedPipe(("\\\\.\\pipe\\MLPipe"), + HANDLE hPipe = ::CreateNamedPipe("\\\\.\\pipe\\MLPipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, - 1, + PIPE_UNLIMITED_INSTANCES, 4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, @@ -154,7 +154,7 @@ int main(int argc, char* argv[]) { EndApplication(); } - // Inject MonoLoaderDLL.dll into the injectee + // Inject MonoLoaderDLL.dll into the target if (!mMemoryFunctions::mInjectDLL(targetProcess, monoLoaderDLLPath)) { printf("Error: Failed to inject MonoLoaderDLL.dll into the target process. Are you running as admin?" "LastErrorCode: %i\n", GetLastError() @@ -163,7 +163,7 @@ int main(int argc, char* argv[]) { } printf("MonoLoader.dll injected.\n"); - // Write the parameter struct to the injectee's memory + // Write the parameter struct to the target's memory LPVOID addressOfParams = VirtualAllocEx(injecteeHandle, NULL, sizeof(LoaderArguments), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (!WriteProcessMemory(injecteeHandle, addressOfParams, &lArgs, sizeof(LoaderArguments), 0)) { printf("Error: WriteProcessMemory returned false. Are you running as admin?" @@ -172,7 +172,7 @@ int main(int argc, char* argv[]) { } printf("Paramater struct written to target.\n"); - // Grab MonoLoaderDLL.dll's Inject method offset, add it to the injectee's base, + // Grab MonoLoaderDLL.dll's Inject method offset, add it to the target's base, // call it with the param struct, then close the handle. uintptr_t targetFunctionAddress = GetMonoLoaderFuncAddress(monoLoaderDLLPath, injecteeHandle); @@ -186,18 +186,21 @@ int main(int argc, char* argv[]) { HANDLE hPipe = CreatePipe(); char buffer[1024]; DWORD dwRead; - while (hPipe != INVALID_HANDLE_VALUE) { - if (ConnectNamedPipe(hPipe, NULL) != FALSE) { - while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) { - printf("-Received result from MonoLoaderDLL-\n"); - printf("MonoLoaderDLL says: %s\n", buffer); - } + if (hPipe != INVALID_HANDLE_VALUE) { + ConnectNamedPipe(hPipe, NULL); // Block until connection is made. TODO: Make asynchronous... Or atleast have a timeout. + while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) { + printf("-Received result from MonoLoaderDLL-\n"); + printf("MonoLoaderDLL says: %s\n", buffer); } + } else { + printf("Error: CreateNamedPipe call failed - Handle is invalid. Last error code: %i\n", GetLastError()); + printf("This means you won't be able to see any error message from the DLL - it'll fail silently.\n"); } - printf("Pipe closed.\n"); DisconnectNamedPipe(hPipe); + CloseHandle(hPipe); } CloseHandle(injecteeHandle); printf("Done.\n"); + return 0; } \ No newline at end of file diff --git a/MonoLoaderDLL/MonoLoaderDLL/MonoLoaderDLL.cpp b/MonoLoaderDLL/MonoLoaderDLL/MonoLoaderDLL.cpp index 5bd2889..db36ee6 100644 --- a/MonoLoaderDLL/MonoLoaderDLL/MonoLoaderDLL.cpp +++ b/MonoLoaderDLL/MonoLoaderDLL/MonoLoaderDLL.cpp @@ -7,6 +7,7 @@ #include #include + HANDLE GetPipe() { HANDLE hPipe = CreateFile(TEXT("\\\\.\\pipe\\MLPipe"), GENERIC_READ | GENERIC_WRITE, diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..85faf4c --- /dev/null +++ b/TODO.md @@ -0,0 +1,4 @@ +[ ] Make pipes optional +[ ] Dynamic pipe names (EG: process named 'x' will have a pipe name of 'x + (PID)') - or use randomized pipe names (pass the pipe name as a param) +[ ] Timeouts on pipe functions +[ ] Asynchronous pipes \ No newline at end of file