天龙外挂 部分源码

本文介绍了天龙外挂的部分源码,涉及API的定义,探讨了相关字符串处理、ListView交互、字节操作以及对象和异常处理等内容。
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);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值