Hi,
würde gern in eSRO Packets senden & empfangen, jedoch habe ich da ein Problem. Wollte es genauso wie z.B. in rSRO machen, also als Proxy den phConnector nehmen und mit dem edxLoader die IP redirecten, jedoch ist in eSRO der GameGuard aktiv. Nun ist es so, dass wenn ich beim edxLoader das Kästchen zum IP redirecten ankreuze, entweder die Fehlermeldung "Game or gameguard has been altered." kommt, oder der GameGuard startet, jedoch bleibt er dann hängen, nämlich in dem kleinen Fenster oben links, in dem er nach Updates sucht. Wenn ich den GameGuard abschalte (gibt ja Tutorials dafür), dann bekomm ich nach 5min DC, da er ja ein Packet zur Bestätigung an den Server senden muss..gibt es da vielleicht noch irgendeine andere Möglichkeit?
eSRO - IP Redirect & GameGuard
-
- [Sonstige]
- Fisticuff
-
-
-
Kannst einfach die Media.pk2 patchen
-
+
Die phConnector Config ändern.Kuh :>
-
-
Danke, aber was soll ich da ändern?
-
Injecte doch ne eigene .dll für das redicreten. Kannste Twice Detour funktionen benutzten.
http://www.stagetwo.eu/develop…ost-umleiten/#post1203829
Ist sogar C+P Code dabei.
-
Den einen Port da von 15778 auf 15779.
Kuh :>
-
-
Injecte doch ne eigene .dll für das redicreten. Kannste Twice Detour funktionen benutzten.
http://www.stagetwo.eu/develop…ost-umleiten/#post1203829
Ist sogar C+P Code dabei.
Von wo bekomme ich die "APIHooking.h" Datei, die included wird? -
Da gibts die ganzen Funktionen:
[Software] Detour Function -
Habe die DLL jetzt erstellt und mit C# versucht, sie in den RSRO Client zu injecten, allerdings passiert nichts.
Um die DLL zu injecten, benutze ich folgende Klasse, die ich im Internet gefunden habe.Code- public static class Inject
- {
- private static class WINAPI
- {
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern IntPtr OpenProcess(
- UInt32 dwDesiredAccess,
- Int32 bInheritHandle,
- UInt32 dwProcessId);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern Int32 CloseHandle(
- IntPtr hObject);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern IntPtr GetProcAddress(
- IntPtr hModule,
- string lpProcName);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern IntPtr GetModuleHandle(
- string lpModuleName);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern IntPtr VirtualAllocEx(
- IntPtr hProcess,
- IntPtr lpAddress,
- IntPtr dwSize,
- uint flAllocationType,
- uint flProtect);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern Int32 WriteProcessMemory(
- IntPtr hProcess,
- IntPtr lpBaseAddress,
- byte[] buffer,
- uint size,
- out IntPtr lpNumberOfBytesWritten);
- [DllImport("kernel32.dll", SetLastError = true)]
- public static extern IntPtr CreateRemoteThread(
- IntPtr hProcess,
- IntPtr lpThreadAttribute,
- IntPtr dwStackSize,
- IntPtr lpStartAddress,
- IntPtr lpParameter,
- uint dwCreationFlags,
- IntPtr lpThreadId);
- public static class VAE_Enums
- {
- public enum AllocationType
- {
- MEM_COMMIT = 0x1000,
- MEM_RESERVE = 0x2000,
- MEM_RESET = 0x80000,
- }
- public enum ProtectionConstants
- {
- PAGE_EXECUTE = 0X10,
- PAGE_EXECUTE_READ = 0X20,
- PAGE_EXECUTE_READWRITE = 0X40,
- PAGE_EXECUTE_WRITECOPY = 0X80,
- PAGE_NOACCESS = 0X01
- }
- }
- }
- public static bool DoInject(
- Process pToBeInjected,
- string sDllPath,
- out string sError)
- {
- IntPtr hwnd = IntPtr.Zero;
- if (!CRT(pToBeInjected, sDllPath, out sError, out hwnd)) //CreateRemoteThread
- {
- //close the handle, since the method wasn't able to get to that
- if (hwnd != (IntPtr)0)
- WINAPI.CloseHandle(hwnd);
- return false;
- }
- int wee = Marshal.GetLastWin32Error();
- return true;
- }
- private static bool CRT(
- Process pToBeInjected,
- string sDllPath,
- out string sError,
- out IntPtr hwnd)
- {
- sError = String.Empty; //in case we encounter no errors
- IntPtr hndProc = WINAPI.OpenProcess(
- (0x2 | 0x8 | 0x10 | 0x20 | 0x400), //create thread, query info, operation
- //write, and read
- 1,
- (uint)pToBeInjected.Id);
- hwnd = hndProc;
- if (hndProc == (IntPtr)0)
- {
- sError = "Unable to attatch to process.\n";
- sError += "Error code: " + Marshal.GetLastWin32Error();
- return false;
- }
- IntPtr lpLLAddress = WINAPI.GetProcAddress(
- WINAPI.GetModuleHandle("kernel32.dll"),
- "LoadLibraryA");
- if (lpLLAddress == (IntPtr)0)
- {
- sError = "Unable to find address of \"LoadLibraryA\".\n";
- sError += "Error code: " + Marshal.GetLastWin32Error();
- return false;
- }
- IntPtr lpAddress = WINAPI.VirtualAllocEx(
- hndProc,
- (IntPtr)null,
- (IntPtr)sDllPath.Length, //520 bytes should be enough
- (uint)WINAPI.VAE_Enums.AllocationType.MEM_COMMIT |
- (uint)WINAPI.VAE_Enums.AllocationType.MEM_RESERVE,
- (uint)WINAPI.VAE_Enums.ProtectionConstants.PAGE_EXECUTE_READWRITE);
- if (lpAddress == (IntPtr)0)
- {
- if (lpAddress == (IntPtr)0)
- {
- sError = "Unable to allocate memory to target process.\n";
- sError += "Error code: " + Marshal.GetLastWin32Error();
- return false;
- }
- }
- byte[] bytes = CalcBytes(sDllPath);
- IntPtr ipTmp = IntPtr.Zero;
- WINAPI.WriteProcessMemory(
- hndProc,
- lpAddress,
- bytes,
- (uint)bytes.Length,
- out ipTmp);
- if (Marshal.GetLastWin32Error() != 0)
- {
- sError = "Unable to write memory to process.";
- sError += "Error code: " + Marshal.GetLastWin32Error();
- return false;
- }
- IntPtr ipThread = WINAPI.CreateRemoteThread(
- hndProc,
- (IntPtr)null,
- (IntPtr)0,
- lpLLAddress,
- lpAddress,
- 0,
- (IntPtr)null);
- if (ipThread == (IntPtr)0)
- {
- sError = "Unable to load dll into memory.";
- sError += "Error code: " + Marshal.GetLastWin32Error();
- return false;
- }
- return true;
- }
- private static byte[] CalcBytes(string sToConvert)
- {
- byte[] bRet = System.Text.Encoding.ASCII.GetBytes(sToConvert);
- return bRet;
- }
- }
Nachdem ich dann DoInject aufrufe,
direkt nachdem ich den sro_client gestartet habe, startet es ganz normal. Normalerweise müsste dann ja der C9 Fehler kommen.
DoInject liefert auch true zurück. -
-
direkt nachdem ich den sro_client gestartet habe, startet es ganz normal. Normalerweise müsste dann ja der C9 Fehler kommen.
DoInject liefert auch true zurück.
Complie das ganze mal als x86 Anwendung. Hatte mal das gleiche Problem.
Und für in die .dll ne messagebox o.ä. ein um zu checken ob die .dll auch geladen wird. -
Also es erscheint schon mal eine MessageBox.
Edit: Habe mal versucht, den Client über WriteProcessMemory zu redirecten. Ich habe erst mit Ollydbg die Addresse der sockaddr heraus gesucht und dann mal ausgelesen, wenn der Client an der connect Funktion ankommt:
Habe es dann auch geschafft, die IP zu ändern, so dass dann auf 127.0.0.1 und Port 15779 connected wird. Aber wie könnte ich jetzt den Port ändern?
Der Port sollte ja eigentlich etwas mit 61, 163 zu tun haben:
Wenn ich bspw. 61 zu 60 ändere, dann kommt auch der C9 Fehler. Wie also komme ich von 15779 auf 61, 163 bzw. von einem beliebigen Port auf diese zwei Bytes? -
Es steht doch schon in deiner struct, dass das ein WORD ist.
*( WORD* )&your_byte_array_or_whatevery[ 2 ] = 1337; // Or what port you'd like.
MfG
-
-
Es steht doch schon in deiner struct, dass das ein WORD ist.
*( WORD* )&your_byte_array_or_whatevery[ 2 ] = 1337; // Or what port you'd like.
MfG
Danke für die Antwort, allerdings ist der Port ja normalerweise 15779. Da wo der Port aber stehen sollte, kommt, nachdem ich es ausgelesen habeIch verstehe jetzt noch nicht ganz, wie ich die beiden Werte ändern muss, um auf meinen gewünschten Port zu kommen.
-
Nochmal, du hast 16 Bits, die den Port angeben. Du gibst aber nur Bytes (8 Bits) aus. Deswegen shiftest du die 61 8 Bits nach links und addierst die 163 drauf:
WORD port = 61 << 8 + 163; // Das ist 15779.
Andersrum geht das so:
BYTE high = port >> 8;
BYTE low = port - ( high << 8 );MfG
PS: Mir stellt sich natürlich die Frage, warum du nicht direkt die sockaddr_in struktur nimmst.
-
PS: Mir stellt sich natürlich die Frage, warum du nicht direkt die sockaddr_in struktur nimmst.
Ja, das hatte ich erst auch versucht, allerdings wusste ich dann nicht, wie ich es mit WriteProcessMemory da rein bekomme.^^Nochmal, du hast 16 Bits, die den Port angeben. Du gibst aber nur Bytes (8 Bits) aus. Deswegen shiftest du die 61 8 Bits nach links und addierst die 163 drauf:
WORD port = 61 << 8 + 163; // Das ist 15779.
Andersrum geht das so:
BYTE high = port >> 8;
BYTE low = port - ( high << 8 );
Habe es aber jetzt so gemacht und es funktioniert. Danke -