菜单

C# 不难内部存款和储蓄器补丁

2019年5月12日 - 皇家赌场系统

0x3 网络查找

  未有人生而知之,所以英特网查询也是很重大的一步,查询哪些内容呢?正是查询C#怎么着写内部存款和储蓄器补丁,代码一模二样可是不料定能用。

0x1 看教程

  关于部分学习课程,确实要探望摄像才干驾驭外人的操作,或许一点也不细略3个东西,假如未有人家的辅导那么和睦操作确实不太容易。

0x5 总结

  唯有不断学习才干领略新的学问,同时在上学中升华。许多不懂的定义其实很简短。当然前提是您了解之后。

   当中注意一点。

测试代码下载:WriteProcessMemory的buffer填入二个数组也是足以的。须要总括长度。然后nSize正是,前边的数组作为多少个字节进行利用。

// 重构了些许代码


        //将值写入指定内存地址中
        public static bool WriteMemoryValue(int baseAddress, string processName, int[] value, int len)
        {
            IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限
            bool result = WriteProcessMemory(hProcess, (IntPtr)baseAddress, value, len, IntPtr.Zero);
            CloseHandle(hProcess);

            return result;
        }

// 144=0x90  表示 nop
bool result = ApiHelper.WriteMemoryValue(address, processName, new int[] { 144 + 144 * 256 }, 2);

 

 WinTestRe.zip

0x四 代码执行

  英特网找到的代码也是要在实行中得出能无法使用的。所以这一步也是必不可免的。

于是有了上边包车型大巴代码。须要利用OD找到代码的岗位即和在内部存款和储蓄器竹秋代码的离开地点。

MCF程序  C++ OK方法中

图片 1图片 2

void CMFCTestDlg::OnBnClickedOk()
{
    CString str;
    GetDlgItemText(IDC_EDIT1, str);

    if (str == "test123456789"){
        ::MessageBox(NULL, L"OK", L"提示", 0);
    }
    else{
        ::MessageBox(NULL, L"Fail", L"提示", 0);
    }
}

View Code

C#先后中调用,首先贴1个增加援救类,来源英特网。当然对里面增加和改换了一些办法。

图片 3图片 4

public abstract class ApiHelper
    {
        [DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
        public static extern bool ReadProcessMemory
            (
                IntPtr hProcess,
                IntPtr lpBaseAddress,
                IntPtr lpBuffer,
                int nSize,
                IntPtr lpNumberOfBytesRead
            );

        [DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
        public static extern IntPtr OpenProcess
            (
                int dwDesiredAccess,
                bool bInheritHandle,
                int dwProcessId
            );

        [DllImport("kernel32.dll")]
        private static extern void CloseHandle
            (
                IntPtr hObject
            );

        //写内存
        [DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
        public static extern bool WriteProcessMemory
        (
            IntPtr hProcess,
            IntPtr lpBaseAddress,
            int[] lpBuffer,
            int nSize,
            IntPtr lpNumberOfBytesWritten
        );

        //获取窗体的进程标识ID
        public static int GetPid(string windowTitle)
        {
            int rs = 0;
            Process[] arrayProcess = Process.GetProcesses();
            foreach (Process p in arrayProcess)
            {
                if (p.MainWindowTitle.IndexOf(windowTitle) != -1)
                {
                    rs = p.Id;
                    break;
                }
            }

            return rs;
        }

        //根据进程名获取PID
        public static int GetPidByProcessName(string processName, ref IntPtr baseAddress)
        {
            Process[] arrayProcess = Process.GetProcessesByName(processName);
            foreach (Process p in arrayProcess)
            {
                baseAddress = p.MainModule.BaseAddress;
                return p.Id;
            }

            return 0;
        }

        //根据进程名获取PID
        public static int GetPidByProcessName(string processName)
        {
            Process[] arrayProcess = Process.GetProcessesByName(processName);
            foreach (Process p in arrayProcess)
            {
                return p.Id;
            }

            return 0;
        }

        //根据窗体标题查找窗口句柄(支持模糊匹配)
        public static IntPtr FindWindow(string title)
        {
            Process[] ps = Process.GetProcesses();
            foreach (Process p in ps)
            {
                if (p.MainWindowTitle.IndexOf(title) != -1)
                {
                    return p.MainWindowHandle;
                }
            }
            return IntPtr.Zero;
        }

        //读取内存中的值
        public static int ReadMemoryValue(int baseAddress, string processName)
        {
            try
            {
                byte[] buffer = new byte[2];
                IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
                IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
                ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, buffer.Length, IntPtr.Zero); //将制定内存中的值读入缓冲区
                CloseHandle(hProcess);
                return Marshal.ReadInt32(byteAddress);
            }
            catch
            {
                return 0;
            }
        }

        //将值写入指定内存地址中
        public static bool WriteMemoryValue(int baseAddress, string processName, int[] value)
        {
            IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限
            bool result = WriteProcessMemory(hProcess, (IntPtr)baseAddress, value, value.Length, IntPtr.Zero);
            CloseHandle(hProcess);

            return result;
        }
    }

View Code

终极是在切切实实按键中的调用了。

图片 5图片 6

private string processName = "MFCTest"; //

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr startAddress = IntPtr.Zero;
            int pid = ApiHelper.GetPidByProcessName(processName, ref startAddress);
            if (pid == 0)
            {
                MessageBox.Show("哥们启用之前该运行吧!");
                return;
            }

            int baseAddress = startAddress.ToInt32() + 0x1000;
            int value = ReadMemoryValue(baseAddress);             // 读取基址(该地址不会改变)
            int address = baseAddress + 0x14F3;                   // 获取2级地址
            value = ReadMemoryValue(address);
            bool result = WriteMemory(address, new int[] { 144 });
            address = address + 0x1;
            result = WriteMemory(address, new int[] { 144 });

            MessageBox.Show(result ? "成功" : "失败");
        }


        //读取制定内存中的值
        public int ReadMemoryValue(int baseAdd)
        {
            return ApiHelper.ReadMemoryValue(baseAdd, processName);
        }

        //将值写入指定内存中
        public bool WriteMemory(int baseAdd, int[] value)
        {
            return ApiHelper.WriteMemoryValue(baseAdd, processName, value);
        }

View Code

写在开首:看了某些录像教程,认为OD为啥人家学个破解那么轻便,小编就那么难了啊,也许是未有那么多日子吗。

0x2 学习到一些概念

  断定不容许一向的模拟,做同样的东西,所以要求学以致用就很要紧了。于是乎,用vs201三c++写了几行代码,用于本人测试,用C#写内部存款和储蓄器补丁

演说:个人见解:所谓内存补丁,即:通过修改运维程序的原委,来实现某种指标的操作。修改使用OpenProcess张开,WriteProcessMemory写入,CloseHandle关闭。部分供给读取数据判断使用:ReadProcessMemory

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图