C#hook代码如下

发布于:2024-06-24 ⋅ 阅读:(18) ⋅ 点赞:(0)
using Celeste;
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using static System.Net.WebRequestMethods;

namespace ClassLibrary1
{
    public class Class1
    {
        public static int EntryPoint(string arg)
        {
            //加载hook lib
            System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "----------------start log----------------\r\n");
            var harmony = new Harmony("com.example.patch");
            harmony.PatchAll();

            return 0;
        }

        //hook 发送数据的类和方法
        [HarmonyPatch(typeof(Steamworks.InteropHelp))]  //类
        [HarmonyPatch("TestIfAvailableClient")]  //方法,防止写错尽量用nameof()
        class Patch01
        {

            //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
            [HarmonyPrefix]
            static bool Prefix()
            {
                
                System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "TestIfAvailableClient\r\n");
                return false;
            }
            Postfix永远执行
            //[HarmonyPostfix]
            //static void Postfix(ref int __result)  //__result表示Hook方法的返回值
            //{
            //    __result = 0;
            //}
        }

        //hook 发送数据的类和方法
        [HarmonyPatch(typeof(Steamworks.SteamUserStats))]  //类
        [HarmonyPatch("RequestCurrentStats")]  //方法,防止写错尽量用nameof()
        class Patch02
        {

            //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
            [HarmonyPrefix]
            static bool Prefix()
            {
                //Achievements.Register(Achievement.PICO8);
                System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "RequestCurrentStats\r\n");
                return false;
            }
            //Postfix永远执行
            [HarmonyPostfix]
            static void Postfix(ref bool __result)  //__result表示Hook方法的返回值
            {
                __result = false;
            }
        }

        //hook 发送数据的类和方法
        [HarmonyPatch(typeof(Steamworks.SteamUserStats))]  //类
        [HarmonyPatch("RequestGlobalStats")]  //方法,防止写错尽量用nameof()
        class Patch03
        {

            //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
            [HarmonyPrefix]
            static bool Prefix()
            {
                System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "RequestGlobalStats\r\n");
                return false;
            }

        }



        //hook 发送数据的类和方法
        [HarmonyPatch(typeof(Steamworks.SteamUserStats))]  //类
        [HarmonyPatch("GetAchievement")]  //方法,防止写错尽量用nameof()
        class Patch04
        {

            //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
            [HarmonyPrefix]
            static bool Prefix()
            {
                System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "GetAchievement\r\n");
                return false;
            }

            //Postfix永远执行
            [HarmonyPostfix]
            static void Postfix(ref bool __result)  //__result表示Hook方法的返回值
            {
                __result = false;
            }
        }

        //hook 发送数据的类和方法
        [HarmonyPatch(typeof(Steamworks.SteamUserStats))]  //类
        [HarmonyPatch("SetAchievement")]  //方法,防止写错尽量用nameof()
        class Patch05
        {

            //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
            [HarmonyPrefix]
            static bool Prefix()
            {
                System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "SetAchievement\r\n");
                return false;
            }

        }

        //不知道为什么这个不能进行hook
        hook 发送数据的类和方法
        //[HarmonyPatch(typeof(Celeste.Achievements))]  //类
        //[HarmonyPatch("Has")]  //方法,防止写错尽量用nameof()
        //class Patch06
        //{
        //    //Prefix返回一个bool,如果false,则不执行后续Prefix,不执行原始方法
        //    [HarmonyPrefix]
        //    static bool Prefix()
        //    {

        //        System.IO.File.AppendAllText("E:\\Celeste\\log.txt", "Has\r\n");
        //        return false;
        //    }
        //    //Postfix永远执行
        //    [HarmonyPostfix]
        //    static void Postfix(ref bool __result)  //__result表示Hook方法的返回值
        //    {
        //        __result = true;
        //    }
        //}

    }
}

注入代码如下


#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <mscoree.h>
#include <metahost.h>
#include <assert.h>

#define BUFFER_SIZE 500
typedef long (__stdcall *CLRCreateInstance_Des)(REFCLSID clsid, REFIID riid, /*iid_is(riid)*/ LPVOID* ppInterface);


static CLRCreateInstance_Des CLRCreateInstance_Fun;

void StartTheDotNetRuntime(LPCWSTR runtimeVersion, LPCWSTR dllPath, LPCWSTR startClass, LPCWSTR startMethod, LPCWSTR startArgument)
{
	ICLRMetaHost* pMetaHost = NULL;
	ICLRMetaHostPolicy* pMetaHostPolicy = NULL;
	ICLRDebugging* pCLRDebugging = NULL;

	
	CLRCreateInstance_Fun(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
	CLRCreateInstance_Fun(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, (LPVOID*)&pMetaHostPolicy);
	CLRCreateInstance_Fun(CLSID_CLRDebugging, IID_ICLRDebugging, (LPVOID*)&pCLRDebugging);

	DWORD dwVersion = 0;
	DWORD dwImageVersion = 0;
	ICLRRuntimeInfo* pRuntimeInfo;
	HRESULT result;
	result = pMetaHost->GetRuntime(runtimeVersion, IID_ICLRRuntimeInfo, (LPVOID*)&pRuntimeInfo);
	assert(SUCCEEDED(result));

	ICLRRuntimeHost* pRuntimeHost = NULL;
	result = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pRuntimeHost);
	assert(SUCCEEDED(result));

	result = pRuntimeHost->Start();
	assert(SUCCEEDED(result));

	DWORD dwRetCode = 0;
	result = pRuntimeHost->ExecuteInDefaultAppDomain(dllPath, startClass, startMethod, startArgument, &dwRetCode);
	assert(SUCCEEDED(result));
	pRuntimeHost->Stop();
	pRuntimeHost->Release();
	pRuntimeInfo->Release();
	pCLRDebugging->Release();
	pMetaHostPolicy->Release();
	pMetaHost->Release();
}

extern "C" void Loader()
{
	HMODULE hValve = LoadLibrary(L"mscoree.dll");
	if (hValve!=NULL) {
		CLRCreateInstance_Fun = (CLRCreateInstance_Des)GetProcAddress((HMODULE)hValve, "CLRCreateInstance");
		if (CLRCreateInstance_Fun != nullptr) {
			StartTheDotNetRuntime(L"v4.0.30319", L"ClassLibrary1.dll", L"ClassLibrary1.Class1", L"EntryPoint", L"");
		}
	}
	
}



网站公告

今日签到

点亮在社区的每一天
去签到