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);
//是不是我的用法错了啊
谢谢 --------------------编程问答-------------------- http://www.seoszcn.com/article/csharp/csharp2009061903.asp
看下对你有没有用 --------------------编程问答-------------------- 请参照:
http://www.cnblogs.com/gussing/archive/2009/07/01/1514925.html
http://baike.baidu.com/view/1281639.htm
Good luck --------------------编程问答-------------------- --------------------编程问答--------------------
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;
}
}
帮我看下我写的对不! --------------------编程问答-------------------- 先学好指针,内存方面的基础知识,学好后就不需要上来提问了。 --------------------编程问答--------------------
问题 1 、甘哥我想问下 retunz得到的值是什么? 是内存地址 还是内存地址里的值?
-------------------------------------------------------------------------
就是int数组啦,你拿来直接用就行了,管它是值还是地址的,如果你一定要问,只能说它是引用。
是十进制 还是十六进
-------------------
这个问题太雷人了。 --------------------编程问答-------------------- uint ncdz = rm(jcjb, 0x009297D0 + 0x1c); //这里ncdz得到的值是1212368195
ncdz = rm(jcjb, ncdz + 0x58); //这样写对吗? 这里得到的值成0了! --------------------编程问答-------------------- 你用C#引用C++API函数时要对参数类型做些变化 甚至可以变为C++/CLI中的数据类型应该能用 你这样直接引用过来是不对的
补充:.NET技术 , C#