using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TL_Waiter.Common;
namespace TL_Waiter
{
public partial class TL_Waiter : Form
{
public TL_Waiter()
{
InitializeComponent();
}
private int baseAddress = 0x7b0d68; //人物基址和环境技能共有
private int mapBaseAddress = 0x7b946c; //游戏地图基址
private int petAndArticlesBaseAddress = 0x7b104c; //宠物和物品共有基址
private string processName = "Game"; //游戏进程名字
public int ReadMemoryValue(int baseAddress)
{
return API.ReadMemoryValue(baseAddress, processName);
}
public float ReadMemoryFloat(int baseAddress)
{
return API.ReadMemoryFloat(baseAddress, processName);
}
public string ReadMemoryString(int baseAdd)
{
return API.ReadMemoryString(baseAdd, processName);
}
public void WriteMemory(int baseAddress, int value)
{
API.WriteMemoryValue(baseAddress, processName, value);
}
private void TL_Waiter_Load(object sender, EventArgs e)
{
if (API.GetPidByProcessName(processName) == 0)
{
MessageBox.Show("请先启动游戏");
this.Close();
}
else
{
GetPetList();
}
}
/// <summary>
/// 得到人物信息
/// </summary>
public void GetOtherInfo()
{
int tempName = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x30);
string Uname = ReadMemoryString(tempName);
this.lbl_UnameText.Text = Uname;//显示角色名
int tempCMap = (ReadMemoryValue(ReadMemoryValue(mapBaseAddress) + 0x3A38) + 0x68);
string CMap = ReadMemoryString(tempCMap);
this.lbl_CMapText.Text = CMap;//显示当前地图名
int tempLvea = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x60);
string lvea = ReadMemoryValue(tempLvea).ToString();
this.lbl_lveaText.Text = lvea; //当前等级
int tempHp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1e70);
string Hp = ReadMemoryValue(tempHp).ToString();
int tempMHp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1ee4);
string MHp = ReadMemoryValue(tempMHp).ToString();
this.lbl_CHPText.Text = Hp + " | " + MHp; //当前血值和最大血值
int tempMp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E74);
string Mp = ReadMemoryValue(tempMp).ToString();
int tempMmp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1EE8);
string MMp = ReadMemoryValue(tempMmp).ToString();
this.lbl_CMPText.Text = Mp + " | " + MMp; //当前气值和最大气值
int tempNp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x64);
string Np = ReadMemoryValue(tempNp).ToString();
this.lbl_CNPText.Text = Np + " | " + "1000"; //当前怒气和最大怒气
int tempHlp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E84);
string hlp = ReadMemoryValue(tempHlp).ToString();
int tempMHlp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E88);
string mhlp = ReadMemoryValue(tempMHlp).ToString();
this.lbl_CHLPText.Text = hlp + " | " + mhlp; //当前活力和最大活力
int tempJp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E8C);
string jp = ReadMemoryValue(tempJp).ToString();
int tempMjp = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E90);
string mjp = ReadMemoryValue(tempMjp).ToString();
this.lbl_CJPText.Text = jp + " | " + mjp; //当前精力和最大精力
int tempX = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x48);
string x = ReadMemoryFloat(tempX).ToString();
string[] strX = x.Split('.');
int tempY = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x50);
string y = ReadMemoryFloat(tempY).ToString();
string[] strY = y.Split('.');
this.lbl_XText.Text = strX[0] + " | " + strY[0]; //当前X坐标Y坐标
int tempJy = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E78);
string jy = ReadMemoryValue(tempJy).ToString();
this.lbl_CJYText.Text = jy; //当前经验值
int tempM = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1E7C);
string m = ReadMemoryValue(tempM).ToString();
if (m != "0")
{
if (m.Length == 4)
{
this.lbl_CMText.Text = "0" + "金" +
m[m.Length - 4].ToString() + m[m.Length - 3].ToString() + "银" +
m[m.Length - 2].ToString() + m[m.Length - 1].ToString() + "铜";
}
else if (m.Length == 3)
{
this.lbl_CMText.Text = "0" + "金" +
"0" + m[m.Length - 3].ToString() + "银" +
m[m.Length - 2].ToString() + m[m.Length - 1].ToString() + "铜";
}
else if (m.Length == 2)
{
this.lbl_CMText.Text = "0" + "金" + "0" + "银" + m[m.Length - 2].ToString() + m[m.Length - 1].ToString() + "铜";
}
else if (m.Length == 1)
{
this.lbl_CMText.Text = "0" + "金" + "0" + "银" + "0" + m[m.Length - 1].ToString() + "铜";
}
else
{
this.lbl_CMText.Text = m.Remove(m.Length - 4, 4) + "金" +
m[m.Length - 4].ToString() + m[m.Length - 3].ToString() + "银" +
m[m.Length - 2].ToString() + m[m.Length - 1].ToString() + "铜";
//当前金钱值
}
}
int tempYm = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1FD4);
string ym = ReadMemoryValue(tempYm).ToString();
this.lbl_CYMText.Text = ym; //当前元宝值
}
/// <summary>
/// 得到宠物名并加载进ListBox
/// </summary>
public void GetPetList()
{
for (int i = 1; i < 10; i++)
{
for (int j = 0x24; j <= i * j; )
{
int tempPetName = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + j);
string petName = ReadMemoryString(tempPetName);
if (petName != "")
{
this.listBox_Pet.Items.Add(petName.ToString());
j += 0x144;
}
else
{
return;
}
}
}
}
/// <summary>
/// 得到宠物信息
/// </summary>
public void GetPetInfo()
{
if (listBox_Pet.SelectedItem != null)
{
string petName = this.listBox_Pet.SelectedItem.ToString();
for (int i = 0; i <= listBox_Pet.Items.Count; i++)
{
int levelASM = 0x3C; //等级偏移
int petId = 0xc; //ID偏移
int petCHp = 0x44; //当前血偏移
int petMHp = 0x48; //最大血偏移
int petHappy = 0x54; //快乐度偏移
for (int j = 0x24; j <= i * j; )
{
int tempPetName = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + j);
string petNameTemp = ReadMemoryString(tempPetName);
if (petName.Equals(petNameTemp))
{
int tempPetId = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + petId);
string petIdTemp = ReadMemoryValue(tempPetId).ToString();
int intPetId = Convert.ToInt32(petIdTemp);
this.lbl_petId.Text = intPetId.ToString("x").ToUpper(); //当前宠物ID
this.lbl_PetName.Text = petNameTemp.ToString();//当前宠物名称
int tempLevel = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + levelASM);
string level = ReadMemoryValue(tempLevel).ToString();
this.lbl_PetLevel.Text = level; //当前宠物等级
int tempChp = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + petCHp);
string chp = ReadMemoryValue(tempChp).ToString();
int tempMhp = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + petMHp);
string mhp = ReadMemoryValue(tempMhp).ToString();
this.lbl_PetCHP.Text = chp + " | " + mhp; //当前宠物当前血值
int tempHap = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + petHappy);
string hap = ReadMemoryValue(tempHap).ToString();
this.lbl_PetHap.Text = hap; //当前宠物当前血值
return;
}
else
{
j += 0x144;
petId += 0x144;
levelASM += 0x144;
petCHp += 0x144;
petMHp += 0x144;
petHappy += 0x144;
}
}
}
}
}
/// <summary>
/// 遍历当前出征宠物
/// </summary>
public void GetPetNowInfo()
{
int tempId = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x1b8) + 0x4) + 0x1eb0);
string id = ReadMemoryValue(tempId).ToString();//当前出征宠物ID
if (id != "0")
{
if (listBox_Pet.SelectedItem != null)
{
for (int i = 0; i <= listBox_Pet.Items.Count; i++)
{
int levelASM = 0x3C; //等级偏移
int petId = 0xc; //ID偏移
int petCHp = 0x44; //当前血偏移
int petMHp = 0x48; //最大血偏移
int petHappy = 0x54; //快乐度偏移
for (int j = 0x24; j <= i * j; )
{
int tempPetId = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + petId);
string petIdTemp = ReadMemoryValue(tempPetId).ToString();
if (petIdTemp.Equals(id))
{
int tempPetName = (ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0x4BD04) + j);
string petNameTemp = ReadMemoryString(tempPetName);
this.lbl_PetNow.Text = petNameTemp.ToString();//当前宠物名称
this.lbl_PetNow.ForeColor = Color.Red;
return;
}
else
{
j += 0x144;
petId += 0x144;
levelASM += 0x144;
petCHp += 0x144;
petMHp += 0x144;
petHappy += 0x144;
}
}
}
}
}
else
{
this.lbl_PetNow.Text = "未出征任何珍兽";
this.lbl_PetNow.ForeColor = Color.Blue;
}
}
/// <summary>
/// 得到物品栏信息并加载进ListView1
/// </summary>
public void GetArticlesInfo()
{
this.listView1.Items.Clear();
int articlesNumber = ReadMemoryValue(petAndArticlesBaseAddress) + 0xfd8;
byte articlesNumberTemp = (byte)ReadMemoryValue(articlesNumber); //物品栏格子数目
int temp = 0x0;
ListViewItem lvi = new ListViewItem();
for (int i = 0; i < articlesNumberTemp; i++)
{
int tempNumber = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x14) + 0x3c);
byte numberTemp = (byte)ReadMemoryValue(tempNumber);
if (numberTemp != 0)
{
int tempName = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x18) + 0x0);
string NameTemp = ReadMemoryString(tempName);
int tempType = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x50) + 0x0);
string typeTemp = ReadMemoryString(tempType);
if (NameTemp == "" && typeTemp == "")
{
int tempNameT = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x28) + 0x0);
string NameTempT = ReadMemoryString(tempNameT);
int tempTypeT = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x58) + 0x0);
string typeTempT = ReadMemoryString(tempTypeT);
int tempNumberT = 1;
listView1.Items.Add(new ListViewItem(new string[] { NameTempT, typeTempT, tempNumberT.ToString() }));
temp = temp + 0x4;
}
else
{
listView1.Items.Add(new ListViewItem(new string[] { NameTemp, typeTemp, numberTemp.ToString() }));
temp = temp + 0x4;
}
}
else
{
temp = temp + 0x4;
}
}
}
/// <summary>
/// 得到材料栏信息并加载进ListView2
/// </summary>
public void GetMaterialsInfor()
{
this.listView2.Items.Clear();
int materialsNumber = ReadMemoryValue(petAndArticlesBaseAddress) + 0xfd9;
byte materialsNumberTemp = (byte)ReadMemoryValue(materialsNumber); //材料栏格子数目
int temp = 0x78;
ListViewItem lvi = new ListViewItem();
for (int i = 0; i < materialsNumberTemp; i++)
{
int tempNumber = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x14) + 0x3c);
byte numberTemp = (byte)ReadMemoryValue(tempNumber);
if (numberTemp != 0)
{
int tempName = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x18) + 0x0);
string NameTemp = ReadMemoryString(tempName);
int tempType = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x50) + 0x0);
string typeTemp = ReadMemoryString(tempType);
if (NameTemp != "" && typeTemp != "")
{
listView2.Items.Add(new ListViewItem(new string[] { NameTemp, typeTemp, numberTemp.ToString() }));
temp = temp + 0x4;
}
else
{
int typeP = 0x1c;
int tempTypeP = typeP + 0x114;
int tempTypeT = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + tempTypeP) + 0x0);
string typeTempT = ReadMemoryString(tempTypeT);
if (typeTempT.IndexOf("宝石") > 0)
{
int tempNameT = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + typeP) + 0x0);
string NameTempT = ReadMemoryString(tempNameT);
listView2.Items.Add(new ListViewItem(new string[] { NameTempT, typeTempT, "1" }));
temp = temp + 0x4;
}
else
{
temp = temp + 0x4;
}
}
}
else
{
temp = temp + 0x4;
}
}
}
/// <summary>
/// 得到任务栏信息并加载进ListView3
/// </summary>
public void GetTasksInfo()
{
this.listView3.Items.Clear();
int taskNumber = ReadMemoryValue(petAndArticlesBaseAddress) + 0xfda;
byte taskNumberTemp = (byte)ReadMemoryValue(taskNumber); //任务栏格子数目
int temp = 0xf0;
ListViewItem lvi = new ListViewItem();
for (int i = 0; i < taskNumberTemp; i++)
{
int tempNumber = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x14) + 0x3c);
byte numberTemp = (byte)ReadMemoryValue(tempNumber);
if (numberTemp != 0)
{
int tempName = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x18) + 0x0);
string NameTemp = ReadMemoryString(tempName);
int tempType = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(petAndArticlesBaseAddress) + 0xFC0) + temp) + 0x28) + 0x50) + 0x0);
string typeTemp = ReadMemoryString(tempType);
listView3.Items.Add(new ListViewItem(new string[] { NameTemp, typeTemp, numberTemp.ToString() }));
temp = temp + 0x4;
}
else
{
temp = temp + 0x4;
}
}
}
public void GetNearInfo()
{
int allTemp = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x60) + 0x4);
//int countTemp = ReadMemoryValue(nearBaseAddress) + 0x64; //附近NPC 数量
this.listView4.Items.Clear();
GetNPCInfo(allTemp);
}
/// <summary>
/// 递归遍历游戏2叉树数据并加载进listView4
/// </summary>
/// <param name="root">根节点地址</param>
public void GetNPCInfo(int root)
{
int left = ReadMemoryValue(root);//取左节点
int right = ReadMemoryValue(root) + 0x8;//取右节点
int sign = ReadMemoryValue(root) + 0x15;
byte signTemp = (byte)ReadMemoryValue(sign);//取标志地址指向的值
if (signTemp == 0)
{
int name = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x1b8) + 0x4) + 0x30);
string nameTemp = ReadMemoryString(name);//获得怪物名字
if (nameTemp != "")
{
int id = ReadMemoryValue(root) + 0xc;
byte idTemp = (byte)ReadMemoryValue(id);
int tempX = (ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x48);
string x = ReadMemoryFloat(tempX).ToString();
string[] strX = x.Split('.');
int tempY = (ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x50);
string y = ReadMemoryFloat(tempY).ToString();
string[] strY = y.Split('.');
int metempX = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x48);//当前我的X坐标
string meX = ReadMemoryFloat(metempX).ToString();
int metempY = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x50);//当前我的Y坐标
string meY = ReadMemoryFloat(metempY).ToString();
double distanceX = Convert.ToDouble(x) - Convert.ToDouble(meX);
double distanceY = Convert.ToDouble(y) - Convert.ToDouble(meY);
string[] distance = Math.Pow(distanceX * distanceX + distanceY * distanceY, 0.5).ToString().Split('.'); //坐标距离计算
int type = ReadMemoryValue(root) + 0x10;
int typeTempT = ReadMemoryValue(type);
int typeTemp = ReadMemoryValue(typeTempT); //获取类型
if (typeTemp == 0x6ddee0)
{
listView4.Items.Add(new ListViewItem(new string[] { idTemp.ToString(), nameTemp, strX[0] + " | " + strY[0], distance[0], "NPC|怪物|宠物" }));
}
else
{
listView4.Items.Add(new ListViewItem(new string[] { idTemp.ToString(), nameTemp, strX[0] + " | " + strY[0], distance[0], "玩家" }));
}
GetNPCInfo(right);
GetNPCInfo(left);
}
else
{
name = (ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x110) + 0x4) + 0x0);
nameTemp = ReadMemoryString(name);//获得怪物名字
int id = ReadMemoryValue(root) + 0xc;
byte idTemp = (byte)ReadMemoryValue(id);
int tempX = (ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x48);
string x = ReadMemoryFloat(tempX).ToString();
string[] strX = x.Split('.');
int tempY = (ReadMemoryValue(ReadMemoryValue(root) + 0x10) + 0x50);
string y = ReadMemoryFloat(tempY).ToString();
string[] strY = y.Split('.');
int metempX = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x48);//当前我的X坐标
string meX = ReadMemoryFloat(metempX).ToString();
int metempY = (ReadMemoryValue(ReadMemoryValue(baseAddress) + 0x6c) + 0x50);//当前我的Y坐标
string meY = ReadMemoryFloat(metempY).ToString();
double distanceX = Convert.ToDouble(x) - Convert.ToDouble(meX);
double distanceY = Convert.ToDouble(y) - Convert.ToDouble(meY);
string[] distance = Math.Pow(distanceX * distanceX + distanceY * distanceY, 0.5).ToString().Split('.'); //坐标距离计算
int type = ReadMemoryValue(root) + 0x10;
int typeTempT = ReadMemoryValue(type);
int typeTemp = ReadMemoryValue(typeTempT); //获取类型 //6df628工艺台//6df4f8包裹
if (typeTemp == 0x6df780)
{
listView4.Items.Add(new ListViewItem(new string[] { idTemp.ToString(), nameTemp, strX[0] + " | " + strY[0], distance[0], "铜矿|草药|宝箱|渔" }));
}
else if (typeTemp == 0x6df4f8)
{
listView4.Items.Add(new ListViewItem(new string[] { idTemp.ToString(), "包裹", strX[0] + " | " + strY[0], distance[0], "包裹" }));
}
GetNPCInfo(right);
GetNPCInfo(left);
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
GetOtherInfo();
GetPetNowInfo();
}
private void listBox_Pet_Click(object sender, EventArgs e)
{
GetPetInfo();
}
private void tabControl3_Selected(object sender, TabControlEventArgs e)
{
}
private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
GetMaterialsInfor();
GetTasksInfo();
GetArticlesInfo();
}
private void tabControl2_Selected(object sender, TabControlEventArgs e)
{
listBox_Pet.SelectedItem = listBox_Pet.Items[0];
GetPetInfo();
}
private void button5_Click(object sender, EventArgs e)
{
GetNearInfo();
}
}
}
定义API
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using TL_Waiter.Common;
namespace TL_Waiter.Common
{
public static class API
{
[DllImport("kernel32.dll")]
private static extern void CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
[DllImportAttribute("kernel32.dll", EntryPoint = "IsBadReadPtr")]
public static unsafe extern bool IsBadReadPtr(void* lp, uint ucb);
[DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, int[] data, int nSize, IntPtr lpNumberOfBytesRead);
[DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, float[] data, int nSize, IntPtr lpNumberOfBytesRead);
[DllImportAttribute("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] data, int nSize, IntPtr lpNumberOfBytesRead);
[DllImportAttribute("kernel32.dll", EntryPoint = "OpenProcess")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
//写内存
[DllImportAttribute("kernel32.dll", EntryPoint = "WriteProcessMemory")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, int[] lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//获取窗体的进程标识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)
{
Process[] arrayProcess = Process.GetProcessesByName(processName);
foreach (Process p in arrayProcess)
{
return p.Id;
}
return 0;
}
//根据进程名获取句柄
public static IntPtr FindWindow(string processName)
{
Process[] arrayProcess = Process.GetProcessesByName(processName);
foreach (Process p in arrayProcess)
{
return p.MainWindowHandle;
}
return IntPtr.Zero;
}
//读取内存中的值
public static int ReadMemoryValue(int baseAddress, string processName)
{
try
{
int[] addr = new int[1];
byte[] temp = System.BitConverter.GetBytes(baseAddress);
Process.EnterDebugMode();
IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
ReadProcessMemory(hProcess, (IntPtr)baseAddress, addr, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区
CloseHandle(hProcess);
return addr[0];
}
catch (Exception ex)
{
return 0;
}
}
public static float ReadMemoryFloat(int baseAddress, string processName)
{
try
{
float[] addr = new float[1];
byte[] temp = System.BitConverter.GetBytes(baseAddress);
Process.EnterDebugMode();
IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
ReadProcessMemory(hProcess, (IntPtr)baseAddress, addr, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区
CloseHandle(hProcess);
return addr[0];
}
catch (Exception ex)
{
return 0;
}
}
public static string ReadMemoryString(int baseAddress, string processName)
{
try
{
byte[] buffer = new byte[256];
IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
byte[] buf = new byte[256];
IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
ReadProcessMemory(hProcess, (IntPtr)baseAddress, buf, 256, IntPtr.Zero); //将制定内存中的值读入缓冲区
string temp = System.Text.Encoding.Default.GetString(buf);
string[] str = temp.Split('\0');
CloseHandle(hProcess);
return str[0];
}
catch
{
return "";
}
}
//将值写入指定内存地址中
public static void WriteMemoryValue(int baseAddress, string processName, int value)
{
Process.EnterDebugMode();
IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限
WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
CloseHandle(hProcess);
}
}
}
本文介绍了天龙外挂的部分源码,涉及API的定义,探讨了相关字符串处理、ListView交互、字节操作以及对象和异常处理等内容。
222

被折叠的 条评论
为什么被折叠?



