From 4fe9b8854b9e32ebd9c23ac298c923da2a1ff88a Mon Sep 17 00:00:00 2001 From: Daniel Keeton Jr Date: Tue, 16 Jun 2020 19:10:03 -0500 Subject: [PATCH] Initial commit. --- .gitignore | 6 ++++ Makefile | 23 +++++++++++++ README.md | 23 +++++++++++++ build.cmd | 9 +++++ cncnet5.dll | Bin 0 -> 30208 bytes inc/patch.h | 61 +++++++++++++++++++++++++++++++++ src/ares.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/rename.c | 54 +++++++++++++++++++++++++++++ 8 files changed, 270 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 build.cmd create mode 100755 cncnet5.dll create mode 100644 inc/patch.h create mode 100644 src/ares.c create mode 100644 src/rename.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0cdd33e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +config.mk + +*.o + +*.dll +!cncnet5.dll diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..110d298 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +-include config.mk + +OUTPUT = rename.dll +CFLAGS = -std=c99 -Iinc/ +DLL_LDFLAGS = -mdll -Wl,--enable-stdcall-fixup + +OBJS = src/rename.o src/ares.o + +CC ?= gcc +STRIP ?= strip +RM ?= rm + +.PHONY: default +default: $(OUTPUT) + +.PHONY: all +all: rename.dll + +$(OUTPUT): $(OBJS) + $(CC) $(CFLAGS) $(DLL_LDFLAGS) -o $@ $^ -lmsvcrt + $(STRIP) $@ +clean: + $(RM) $(OUTPUT) $(OBJS) diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0ed845 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +CnCNet for Ares +================================================================================ + +Spawns Yuri's Revenge and connects players through cncnet5. This project should be used in conjunction with the [xna-cncnet-client](https://github.com/CnCNet/xna-cncnet-client) and [Ares](https://launchpad.net/ares/+download) + +### Usage + - Place cncnet5.dll in you mod folder with the xna-cncncet-client and the Ares files. + - Optionally place rename.dll in the mod directory. + - Syringe from Ares will automatically detect and include cncnet5.dll. + - Configure xna-cncnet-client to execute Syringe.exe rather than game(md).exe + +### Building + - Download cncnet-for-ares + - Edit src/rename.c, change the strings for the Gane name and file locations. Do not exceed the size of the existing strings in the game. + - Download [win-builds](https://downloads.cncnet.org/win-builds-for-patching.zip) and install it by double clicking win-install.bat + - In the cncnet5-for-ares run build.cmd by double clicking on it. Read the output window any errors you may introduced. + - You should now have rename.dll. Now you can rename rename.dll to something appropriate for your mod (the name will not stop it from being loaded by Syringe). + + +### Caveats + - Source code for cncnet5.dll is not public, only the cncnet5.dll file is provided here. + - You do not need to use the command line -SPAWN argument. + - You may need to edit build.cmd if win-builds did not get installed into C:\win-builds-patch-32\ diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..0ab6632 --- /dev/null +++ b/build.cmd @@ -0,0 +1,9 @@ +@echo off +REM +REM cnc-patch environment config +REM +set PATH=C:\win-builds-patch-32\bin +gmake clean +pause +gmake all +pause diff --git a/cncnet5.dll b/cncnet5.dll new file mode 100755 index 0000000000000000000000000000000000000000..7ab39c02274e5a2debaa1719bb6ec4dd550665bd GIT binary patch literal 30208 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

?1$1iL8dh!&&(XX4_}3lk|DZqjT&_ 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 literal 0 HcmV?d00001 diff --git a/inc/patch.h b/inc/patch.h new file mode 100644 index 0000000..8051d15 --- /dev/null +++ b/inc/patch.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2013, 2014, 2020 Toni Spets + * Daniel Keeton Jr + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#define CLEAR(start, value, end) \ + __asm ( \ + ".section .patch,\"d0\";" \ + ".long " #start ";" \ + ".long " #end "-" #start ";" \ + ".fill " #end "-" #start ", 1, " #value ";" \ + ) + +#define LJMP(src, dst) \ + __asm ( \ + ".section .patch,\"d0\";" \ + ".long " #src ";" \ + ".long 5;" \ + ".byte 0xE9;" \ + ".long " #dst "-" #src " - 5;" \ + ) + +#define CALL(src, dst) \ + __asm ( \ + ".section .patch,\"d0\";" \ + ".long " #src ";" \ + ".long 5;" \ + ".byte 0xE8;" \ + ".long " #dst "-" #src " - 5;" \ + ) + +#define SETDWORD(dst, value) \ + __asm ( \ + ".section .patch,\"d0\";" \ + ".long " #dst ";" \ + ".long 4;" \ + ".long " #value ";" \ + ) + +#define SETSTRING(dst, value) \ + __asm ( \ + ".section .patch,\"d0\";" \ + ".long " #dst ";" \ + ".long (_memcpy_end_" #dst \ + " - _memcpy_start_" #dst ");" \ + "_memcpy_start_" #dst ":;" \ + ".asciz " #value ";" \ + "_memcpy_end_" #dst ":;" \ + ) diff --git a/src/ares.c b/src/ares.c new file mode 100644 index 0000000..97f155e --- /dev/null +++ b/src/ares.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2013, 2014 Toni Spets + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +// this tricks syringe to load this dll +__asm ( + ".section .syhks00,\"d8\";" // AlexB said the alignment has to be 16 bytes + ".long 0;" + ".long 0;" + ".string \"stub\";" +); + +#ifdef WWDEBUG +#define dprintf printf +#else +#define dprintf(fmt, ...) +#endif + +static DWORD get_dword(char **p) +{ + DWORD ret = *(DWORD *)*p; + *p += sizeof(DWORD); + return ret; +} + +BOOL WINAPI __declspec(dllexport) +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + { + char buf[MAX_PATH + 1] = { 0 }; + GetModuleFileName(NULL, buf, sizeof buf); + + dprintf("Patching CnCNet 5 to %s\n", buf); + + PIMAGE_DOS_HEADER dos_hdr = (void *)hinstDLL; + PIMAGE_NT_HEADERS nt_hdr = (void *)((char *)hinstDLL + dos_hdr->e_lfanew); + + char *patch = NULL; + int patch_len = 0; + + for (int i = 0; i < nt_hdr->FileHeader.NumberOfSections; i++) + { + PIMAGE_SECTION_HEADER sct_hdr = IMAGE_FIRST_SECTION(nt_hdr) + i; + + if (strcmp(".patch", (char *)sct_hdr->Name) == 0) + { + patch = (char *)((char *)hinstDLL + sct_hdr->VirtualAddress); + patch_len = sct_hdr->Misc.VirtualSize; + break; + } + + sct_hdr++; + } + + dprintf("Found .patch @ %p (%d bytes)\n", patch, patch_len); + + if (patch) + { + for (char *p = patch; p < patch + patch_len;) + { + DWORD paddress = get_dword(&p); + if (paddress == 0) break; + + DWORD plength = get_dword(&p); + + dprintf("PATCH %8u bytes -> %8X\n", (unsigned int)plength, (unsigned int)paddress); + DWORD protect = 0; + VirtualProtect((void *)paddress, plength, PAGE_EXECUTE_READWRITE, &protect); + memcpy((void *)paddress, p, plength); + VirtualProtect((void *)paddress, plength, protect, NULL); + + p += plength; + } + } + } + + return TRUE; +} diff --git a/src/rename.c b/src/rename.c new file mode 100644 index 0000000..9527a26 --- /dev/null +++ b/src/rename.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Daniel Keeton Jr + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "patch.h" + +/* + * Change the following strings + * Do not make your new strings longer than the original strings. + * Use the line of ); as a guide, if they aren't all lined up + * then your new string isn't the correct length. + */ + +SETSTRING( 0x00849F48, "Yuri's Revenge" ); +SETSTRING( 0x0082668C, "EXPANDMD%02d.MIX" ); +SETSTRING( 0x0082621C, "AIMD.INI" ); +SETSTRING( 0x00826254, "ARTMD.INI" ); +SETSTRING( 0x00826198, "BATTLEMD.INI" ); +SETSTRING( 0x008261A8, "BATTLEMD*.INI" ); +SETSTRING( 0x008295E8, "%sMD.INI" ); +SETSTRING( 0x00825DF0, "EVAMD.INI" ); +SETSTRING( 0x00830370, "MAPSELMD.INI" ); +SETSTRING( 0x00839724, "MISSIONMD.INI" ); +SETSTRING( 0x00826260, "RULESMD.INI" ); +SETSTRING( 0x0082626C, "RULEMD*.INI" ); +SETSTRING( 0x00825E50, "SOUNDMD.INI" ); +SETSTRING( 0x0081C24C, "THEMEMD.MIX" ); +SETSTRING( 0x00825D94, "THEMEMD.INI" ); +SETSTRING( 0x00826444, "RA2MD.INI" ); +SETSTRING( 0x00826614, "ELOCAL*.MIX" ); +SETSTRING( 0x00826620, "ECACHE*.MIX" ); +SETSTRING( 0x0081C284, "MULTIMD.MIX" ); +SETSTRING( 0x00826780, "MULTIMD.MIX" ); +SETSTRING( 0x0081C2EC, "MAPSMD%02d.MIX" ); +SETSTRING( 0x0082679C, "MAPSMD*.MIX" ); +SETSTRING( 0x0081C210, "MOVMD%02d.MIX" ); +SETSTRING( 0x008266A0, "MIXFILES\\MOVMD03.MIX" ); +SETSTRING( 0x008266B8, "MOVMD03.MIX" ); +SETSTRING( 0x008266C4, "MIXFILES\\MOVMD*.MIX" ); +SETSTRING( 0x008266D8, "MIXFILES\\MOVMD01.MIX" ); +SETSTRING( 0x008266F0, "MOVMD01.MIX" ); +SETSTRING( 0x00826748, "MOVMD*.MIX" );