|
本帖最后由 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
}
} |
评分
-
查看全部评分
|