当前位置:编程学习 > C#/ASP.NET >>

c# and c++ 进!!

[DllImport("kernel32.dll")] 
public static extern int ReadProcessMemory( 
      uint jcjb,//进程句柄 
      uint lcdz,//内存地址 
      uint[] retunz,//返回值 
      int sgcscd,//长度上个参数 
      int bd //用0  不懂 
      ); 

问题 1 、我想问下 retunz得到的值是什么? 
          是内存地址 还是内存地址里的值?
          是十进制  还是十六进 

问题 2 、我看很多人都的第4个参数都是4 为什么都只读开始的4个字节啊?

问题 3 、我能不能把 返回的retunz值 当内存地址再传进去? 
          比如! 
          uint di; 
          ReadProcessMemory(jc, 0x2130, di, 4, 0); 
          uint dz; 
          ReadProcessMemory(jc, di+0x02, dz, 4, 0); 
          这样对吗?
         (我不懂的是如果读出来的是内存地址里的值,那就不是内存地址了啊,但有的网友把他等地址在用啊?就象上面!)

问题 4 、 第2个参数是内存地址 那着个“+0x02”是什么意思啊?
          内的排放是不是着样的?
          0x00        //着是基地址
          0x00+0x11   //着就是基地址下的一块吗?
          
问题 5 、  我在用c#引用了c++的api后  
          着样用的ReadProcessMemory()函数          
          uint di; 
          ReadProcessMemory(jc, 0x2130, di, 4, 0); //着时候di的值是1212368195没有“0x”是不是要加个0x 但是加了就太长了
          uint dz; 
          ReadProcessMemory(jc, di+0x02, dz, 4, 0); 
          //是不是我的用法错了啊 
         
--------------------编程问答-------------------- 0x只是表示使用16进制来表示数字, 至于ReadProcessMemory这个API相关问题可以直接查msdn相关文档 --------------------编程问答-------------------- 那通过ReadProcessMemory得到的值是 是十进制  还是十六进 
--------------------编程问答-------------------- 友情UP --------------------编程问答--------------------
public partial class Form1 : Form
    {
        //得到指定内存地址的值
        [DllImport("kernel32.dll")]
        public static extern int ReadProcessMemory(
            uint jcjb,//进程句柄
            uint lcdz,//内存地址
            uint[] retunz,//返回值
            int sgcscd,//长度上个参数
            int bd //用0  不懂
            );

        //得到目标进程句柄的函数
        [DllImport("kernel32.dll")]
        static extern uint OpenProcess(
            uint dwDesiredAccess,//权限
            bool bInheritHandle, //查看系统书 不动意思
            int dwProcessId  //要查的进程id
            );

        //得到内存地址值
        public static uint rm(uint jcjb, uint add)
        {
            uint[] r = new uint[1];
            try
            {
                ReadProcessMemory(jcjb, add, r, 4, 0);
                return r[0];
            }
            catch(Exception ex)
            {
                return 0;
            }
        }

        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process[] ddjb = System.Diagnostics.Process.GetProcessesByName("elementclient");//完美世界的进程名
            int jcid = ddjb[0].Id;                    //得到进程id
            string title = ddjb[0].MainWindowTitle;   //进程窗口标题
            uint jcjb = OpenProcess(0x1F0FFF, false, jcid);//得到进程句柄

            uint ncdz = rm(jcjb, 0x009297D0);   //找内存地址的值(基地址)

            ///ncdz = Convert.ToString(ncdz, 16);   //把十进制数转成十六制      

            ncdz = rm(jcjb, ncdz + 0x08);       //找内存地址的值(基地址内的某个地址)  
            txtjcjb.Text = jcjb.ToString();
            txttitle.Text = title;
        }
    }

帮我看下我写的对不! --------------------编程问答-------------------- uint ncdz = rm(jcjb, 0x009297D0 + 0x1c);  //这里ncdz得到的值是1212368195 

ncdz = rm(jcjb, ncdz + 0x58);  //这样写对吗? 这里得到的值成0了!  
补充:.NET技术 ,  .NET Framework
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,