找回密码
 注册帐号
查看: 2228|回复: 15

[编程问题] 自己写的一个信息监视模块C#语言搞的。丝路传说模块,欢迎使交流用.

[复制链接]
发表于 2010-8-12 11:45:25 | 显示全部楼层 |阅读模式
本帖最后由 ouyanghanwen 于 2010-8-21 02:45 编辑

这个论坛是易语言的,但也有C#的开发玩家,经过长时间的过渡终于把一些信息监视的代码完成,第一写这样的程序,C#里特别是api 调用非常麻烦,托管数据和非托管数据的转换非常复杂。
本开始打算用VC++.net开发,最后卡在数据转换上了;废话不多说,上代码:
最后写完了才发现人物hp,mp和一些信息的基址我竟然找错了,如果有朋友知道确切的数据希望能共享一下,我这个基址可以用,但不是真实的,如果骑马就成了坐骑的数据了,不信自己去试试。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace SRO_Master
{
    /// <summary>
    /// win32API 申明类
    /// </summary>
    class Win32
    {
#region 常量申明
        private static IntPtr _SROHWND;
        /// <summary>
        /// SHOWWINDOW
        /// </summary>
        public enum SW_CONST
        {
            SW_SHOW=5,
            SW_HIDE=0
        }
        public const int WM_KEYDOWN = 0x100;
        public const int WM_KEYUP = 0x101;
        public const int PROCESS_ALL_ACCESS = 0x1F0FFF;
        public const int PROCESS_VM_READ = 0x10;
        public static IntPtr SroHwnd
        {
            get { return _SROHWND; }
            set { _SROHWND = value; }
        }
#endregion

        #region api申明
        [DllImport("user32", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId);
        [DllImport("user32")]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
        [DllImport("user32", EntryPoint = "ShowWindow", SetLastError = true)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int ReadProcessMemory(int hProcessid, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten);
        [DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
        public static extern bool WriteProcessMemory
            (
                IntPtr hProcess,
                IntPtr lpBaseAddress,
                int[] lpBuffer,
                int nSize,
                IntPtr lpNumberOfBytesWritten
            );
        [DllImport("kernel32.dll")]
        private static extern void CloseHandle
            (
                IntPtr hObject
            );

        #endregion
        
        
#region 常用基本方法

        /// <summary>
        /// 获取进程标识符
        /// </summary>
        /// <returns></returns>
        public static int GetPProcessID()
        {
            int pid = 0;
            Win32.GetWindowThreadProcessId(SroHwnd, ref pid);
            if (pid == 0) return 0;
            int processid = Win32.OpenProcess(Win32.PROCESS_VM_READ, 0, pid);
            return processid;
        }

        /// <summary>
        /// 读取内存数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryValue(int baseAdress)
        {
            int processid = GetPProcessID();
            byte[] buffer = new byte[20];
            IntPtr byteBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
            try
            {
                Win32.ReadProcessMemory(processid, (IntPtr)baseAdress, byteBuffer, buffer.Length, IntPtr.Zero);
                return byteBuffer;
            }
            catch
            {
                return IntPtr.Zero;
            }
            finally
            {
                CloseHandle((IntPtr)processid);
            }

        }
        /// <summary>
        /// 写内存数据
        /// </summary>
        /// <param name="baseAddress"></param>
        /// <param name="value"></param>
        public static void WriteMemoryValue(int baseAddress, int value)
        {
            int hProcess =GetPProcessID();
            WriteProcessMemory((IntPtr)hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
            CloseHandle((IntPtr)hProcess);
        }
        /// <summary>
        /// 读取内存基址+一级偏移数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <param name="officeAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryByBaseOffice(int baseAdress, int officeAdress)
        {
            IntPtr lveOneAdress = ReadMemoryValue(baseAdress);
            IntPtr nameInt = ReadMemoryValue(Marshal.ReadInt32(lveOneAdress) + officeAdress);
            return nameInt;
        }
        /// <summary>
        /// 读取内存基址+二级偏移数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <param name="officeAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryByBaseOffice(int baseAdress, int officeAdress, int officeAdress2)
        {
            IntPtr lveOneAdress = ReadMemoryValue(baseAdress);
            IntPtr nameInt = ReadMemoryValue(Marshal.ReadInt32(lveOneAdress) + officeAdress);
            IntPtr Int2 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2);
            return Int2;
        }
        /// <summary>
        /// 读取内存基址+三级偏移数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <param name="officeAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryByBaseOffice(int baseAdress, int officeAdress, int officeAdress2, int officeAdress3)
        {
            IntPtr lveOneAdress = ReadMemoryValue(baseAdress);
            IntPtr nameInt = ReadMemoryValue(Marshal.ReadInt32(lveOneAdress) + officeAdress);
            IntPtr Int2 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2);
            IntPtr Int3 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2,officeAdress3);
            return Int3;
        }
        /// <summary>
        /// 读取内存基址+四级偏移数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <param name="officeAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryByBaseOffice(int baseAdress, int officeAdress, int officeAdress2, int officeAdress3, int officeAdress4)
        {
            IntPtr lveOneAdress = ReadMemoryValue(baseAdress);
            IntPtr nameInt = ReadMemoryValue(Marshal.ReadInt32(lveOneAdress) + officeAdress);
            IntPtr Int2 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2);
            IntPtr Int3 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2, officeAdress3);
            IntPtr Int4 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2, officeAdress3,officeAdress4);
            return Int4;
        }
        /// <summary>
        /// 读取内存基址+五级偏移数据
        /// </summary>
        /// <param name="baseAdress"></param>
        /// <param name="officeAdress"></param>
        /// <returns></returns>
        public static IntPtr ReadMemoryByBaseOffice(int baseAdress, int officeAdress, int officeAdress2, int officeAdress3, int officeAdress4, int officeAdress5)
        {
            IntPtr lveOneAdress = ReadMemoryValue(baseAdress);
            IntPtr nameInt = ReadMemoryValue(Marshal.ReadInt32(lveOneAdress) + officeAdress);
            IntPtr Int2 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2);
            IntPtr Int3 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2, officeAdress3);
            IntPtr Int4 = ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2, officeAdress3,officeAdress4);
            IntPtr Int5= ReadMemoryByBaseOffice(Marshal.ReadInt32(nameInt), officeAdress2, officeAdress3, officeAdress5);
            return Int5;
        }
        /// <summary>
        /// 读取角色名称
        /// </summary>
        /// <returns></returns>
        public static string ReadRoleName()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x114;
            return Marshal.PtrToStringUni(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取站盟名称
        /// </summary>
        /// <returns></returns>
        public static string ReadOathName()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x7d4;
            return Marshal.PtrToStringUni(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取任务称号
        /// </summary>
        /// <returns></returns>
        public static string ReadRoleTitle()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x198;
            return Marshal.PtrToStringUni(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取当前HP
        /// </summary>
        /// <returns></returns>
        public static int ReadMainHP()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x450;
            return Marshal.ReadInt32(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取最大HP
        /// </summary>
        /// <returns></returns>
        public static int ReadMaxHP()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x458;
            return Marshal.ReadInt32(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取当前MP
        /// </summary>
        /// <returns></returns>
        public static int ReadMainMP()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x454;
            return Marshal.ReadInt32(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        /// <summary>
        /// 读取最大MP
        /// </summary>
        /// <returns></returns>
        public static int ReadMaxMP()
        {
            int BaseAdress = 0x00E6CC98;
            int OfficeAdress = 0x45c;
            return Marshal.ReadInt32(ReadMemoryByBaseOffice(BaseAdress, OfficeAdress));
        }
        
#endregion
    }
}

评分

参与人数 1魅力 -1 金币 -1 收起 理由
lzx0577 -1 -1 请注意您帖子内容是否与主题相关!

查看全部评分

 楼主| 发表于 2010-8-12 11:46:14 | 显示全部楼层
最后写完了才发现人物hp,mp和一些信息的基址我竟然找错了,如果有朋友知道确切的数据希望能共享一下,我这个基址可以用,但不是真实的,如果骑马就成了坐骑的数据了,不信自己去试试。


如果发这个帖违规了麻烦版主删除然后通知我。
 楼主| 发表于 2010-8-12 11:47:40 | 显示全部楼层
这个只是测试用的,里面的数据并非真实数据,比如基址不是真实基址,这个地址和坐骑共用。我也是刚开始弄,基址都还不会找,更不说什么call了,如果论坛有其它C#开发的玩家可以加我qq595132673一起来讨论一些技术问题。
 楼主| 发表于 2010-8-12 11:48:30 | 显示全部楼层
另外顶一下版主,谢谢,谢谢论坛提供的测试基址数据。
发表于 2010-8-12 12:29:01 | 显示全部楼层
楼主真牛比啊~~~~小弟佩服
这样是用来监视什么东西的呢
 楼主| 发表于 2010-8-15 13:43:04 | 显示全部楼层
这个内容和帖子不相关吗?如果看不懂编程语言请别乱说.看到你这个版主评分真气死人了.不说你菜,基本的东西都不会看.
回复 支持 反对

使用道具 举报

发表于 2010-8-15 17:23:18 | 显示全部楼层
呵呵,原创的再顶一个~
楼主也不要生气,你有技术,但别人有权力。
回复 支持 反对

使用道具 举报

发表于 2010-8-15 23:09:38 | 显示全部楼层
n你这是模块吗??汗
回复 支持 反对

使用道具 举报

发表于 2010-8-15 23:20:19 | 显示全部楼层
为心可佳,,性情温和,,要顶下,,,支持有这方面技术的人为大家做出更好的软件,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-16 07:41:24 | 显示全部楼层
这不是模块是什么?C#里叫累.vb里叫模块,C#里没有模块这个定义,一个外部功能的封装,复制过去就可以用的功能函数集合不叫模块叫什么,版主真是的,你有权利乱说,我也有权利不来.别把你的无知挑战我的耐性.
回复 支持 反对

使用道具 举报

发表于 2010-8-19 16:57:06 | 显示全部楼层
支持C语言开发更多的程序。
楼主继续
回复 支持 反对

使用道具 举报

发表于 2010-8-21 02:23:38 | 显示全部楼层
呵呵 C++中的模板,版主你不应该扣分啊
失误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-21 02:44:30 | 显示全部楼层
真是晕了,这是丝路传说的好不,我只是把基址该了两个地址而已.
回复 支持 反对

使用道具 举报

发表于 2010-8-25 01:31:47 | 显示全部楼层
来理解下   我 看看
回复 支持 反对

使用道具 举报

发表于 2010-12-19 20:14:12 | 显示全部楼层
555看不懂啊教下密密麻麻的字母看到头晕
回复 支持 反对

使用道具 举报

发表于 2011-1-7 15:28:08 | 显示全部楼层
终于找到个用C编写的程序了,学过C的再看易语言不太好看啊
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|依人网络官方网站 ( 陕ICP备19025998号-1 )

GMT+8, 2024-5-3 04:48 , Processed in 0.055145 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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