开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 164|回复: 1
收起左侧

[C#源码] C# .net内存特征码搜索和内存修改

[复制链接]
发表于 前天 22:29 | 显示全部楼层 |阅读模式   贵州省遵义市
本帖最后由 wtujoxk 于 2025-3-24 22:32 编辑

.net的内存特征码搜索
功能:
1、内存特征码搜索(支持跨进程,堆栈搜索,半码F?、全码??,编写自己的搜索工具)
2、程序集dll、C/C++模块的获取jz和映像大小
3、内存修改(可以带??,如:5F ?? 6E 7D ?? 8A)

部分实现代码:
获取程序最小地址
[C#] 纯文本查看 复制代码
public static ulong Get_Application_MinAddress()
{
    try
    {
        SYSTEM_INFO systemInfo;
        GetSystemInfo(out systemInfo);
        return (ulong)systemInfo.minimumApplicationAddress;
    }
    catch { return 0; }
}

获取程序最大地址
[C#] 纯文本查看 复制代码
public static ulong Get_Application_MaxAddress()
{
    try
    {
        SYSTEM_INFO systemInfo;
        GetSystemInfo(out systemInfo);
        return (ulong)systemInfo.maximumApplicationAddress;
    }
    catch { return 0; }
}

获取程序集模块的jz
[C#] 纯文本查看 复制代码
public static ulong Get_Assembly_Module_BaseAddress(string assemblyName)
{
    try
    {
        if (string.IsNullOrEmpty(assemblyName)) return 0;
        return (ulong)Marshal.GetHINSTANCE(
            AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(m => m.GetModules()
            .Where(n => n.Name.Equals(assemblyName, StringComparison.OrdinalIgnoreCase)))
            .FirstOrDefault());
    }
    catch { return 0; }
}

获取模块的映像大小,.net和C/C++的通用
[C#] 纯文本查看 复制代码
public static ulong Get_Moule_SizeOfImage(ulong baseAddress)
{
    try
    {
        IMAGE_DOS_HEADER dosHeader = (IMAGE_DOS_HEADER)Marshal.PtrToStructure((IntPtr)baseAddress, typeof(IMAGE_DOS_HEADER));
        IMAGE_NT_HEADERS ntHeader = (IMAGE_NT_HEADERS)Marshal.PtrToStructure((IntPtr)(baseAddress + (ulong)dosHeader.e_lfanew),
                typeof(IMAGE_NT_HEADERS));
        return (ulong)ntHeader.OptionalHeader.SizeOfImage;
    }
    catch { return 0; }
}

获取C/C++模块的jz
[C#] 纯文本查看 复制代码
public static ulong Get_C_Module_BaseAddress(string cModuleName)
{
    try
    {
        if (string.IsNullOrEmpty(cModuleName)) return 0;
        return (ulong)Process.GetCurrentProcess()
            .Modules.Cast<ProcessModule>()
            .Where(m => m.ModuleName.Equals(cModuleName, StringComparison.OrdinalIgnoreCase))
            .ToArray().FirstOrDefault().BaseAddress;
    }
    catch { return 0; }
}

获取C/C++模块的映像大小
[C#] 纯文本查看 复制代码
public static ulong Get_C_Module_SizeOfImage(string cModuleName)
{
    try
    {
        if (string.IsNullOrEmpty(cModuleName)) return 0;
        return (ulong)Process.GetCurrentProcess()
            .Modules.Cast<ProcessModule>()
            .Where(m => m.ModuleName.Equals(cModuleName, StringComparison.OrdinalIgnoreCase))
            .ToArray().FirstOrDefault().ModuleMemorySize;
    }
    catch { return 0; }
}

调用
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace Net内存特征码搜索
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("程序最小地址:0x" + PatchPattern.Get_Application_MinAddress().ToString("X"));
            Console.WriteLine("程序最大地址:0x" + PatchPattern.Get_Application_MaxAddress().ToString("X"));

            // System.dll是.NET Framework的核心程序集,ntdll.dll是Windows系统的核心模块
            var systemAssembly = PatchPattern.Get_Assembly_Module_BaseAddress("System.dll");
            Console.WriteLine("System模块jz:0x" + systemAssembly.ToString("X"));
            Console.WriteLine("System模块大小:0x" + PatchPattern.Get_Moule_SizeOfImage(systemAssembly).ToString("X"));
            Console.WriteLine("ntdll模块jz:0x" + PatchPattern.Get_C_Module_BaseAddress("ntdll.dll").ToString("X"));
            Console.WriteLine("ntdll模块大小:0x" + PatchPattern.Get_C_Module_SizeOfImage("ntdll.dll").ToString("X"));

            // Hello World! 的特征码为 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 72 00 6C 00 64 00 21 00
            string testStr = "Hello World!";
            string patternStr = "48 00 65 00 6C 00 6C ?? 6F 00 20 00 ?7 00 6F ?? 72 00 6C 00 64 00 21 00";

            IntPtr hProcess = Process.GetCurrentProcess().Handle;
            // 获取主模块jz和大小
            ulong baseAddress = (ulong)Process.GetCurrentProcess().MainModule.BaseAddress;
            ulong size = (ulong)Process.GetCurrentProcess().MainModule.ModuleMemorySize;
            Console.WriteLine("模块jz:0x" + baseAddress.ToString("X") + "----模块大小:0x" + size.ToString("X"));

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            // 遍历内存,搜索特征码
            // 注意:搜索前确保程序集或者dll已加载
            // 指定搜索范围
            List<ulong> result = PatchPattern.SundayPatternFind(hProcess, baseAddress, baseAddress + size, patternStr, 0);
            // 整个进程搜索
            //List<ulong> result = PatchPattern.SundayPatternFind(hProcess, PatchPattern.Get_Application_MinAddress(), PatchPattern.Get_Application_MaxAddress(), patternStr);
            stopwatch.Stop();

            Console.WriteLine("搜索用时: " + stopwatch.ElapsedMilliseconds + " 毫秒");
            Console.WriteLine("搜索到特征码:" + result.Count + "个");
            result.ForEach(x => Console.WriteLine("特征码地址:0x" + x.ToString("X")));

            // 你好,世界!的unicode编码为 60 4F 7D 59 0C FF 16 4E 4C 75 01 FF
            Encoding.Unicode.GetBytes("你好,世界!").ToList().ForEach(x => Console.Write(x.ToString("X2") + " "));
            Console.WriteLine();
            // 修改搜索到的内存数据
            if (result.Count > 0)
                // 将特征码替换为你好,世界!的unicode编码,并添加截断0000字节
                if (PatchPattern.WriteMemoryData(result[0], "60 4F 7D 59 0C FF 16 4E 4C 75 01 FF" + "0000"))
                {
                    Console.WriteLine("修改内存数据成功");
                    Console.WriteLine("修改为:" + Marshal.PtrToStringAuto((IntPtr)result[0]));
                }
                else Console.WriteLine("修改内存数据失败");

            Console.ReadKey();
        }
    }
}


Net内存特征码搜索.zip (24.23 KB, 下载次数: 3)
结帖率:50% (7/14)

签到天数: 25 天

发表于 昨天 08:25 | 显示全部楼层   安徽省淮北市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表