Хорошо ... Я хочу сделать win32api WriteProcessMemory.WriteProcessMemory
(Только для обучения WinAPI на .Net платформах!^___^)
Я использую Nemerle но синтаксис похож на C# и я могу читать C# код уверен.
Так вот мой шаги:
1) получить победу функция апи
[DllImport("kernel32.dll",SetLastError = true)]
public static extern WriteProcessMemory
(hProcess : IntPtr,
lpBaseAddress : int,
lpBuffer : array[byte],
nSize : int,
lpNumberOfBytesWritten : out int) : bool;
2) Открытый процесс, получить отладочные привилегии^_^и ... вызвать функцию
def WriteToMem(ProcessHandle : IntPtr, BaseAddress : int, NewVal : array[byte]) : bool
{
mutable BytesWritten : int = 0;
WriteProcessMemory(ProcessHandle, BaseAddress, NewVal, NewVal.Length, out BytesWritten)
}
3) параметры:
PatchOptions.noerror =
if (this.textBox1.Text=="" && !this.checkBox1.Checked)
{
MessageBox.Show("Wind header caption could not be empty");
false
}
else
if (this.textBox4.Text=="" && this.checkBox1.Checked)
{
MessageBox.Show("Process Id could not be empty");
false
}
else
if (this.textBox2.Text=="")
{
MessageBox.Show("BaseAddress could not be empty");
false
}
else
if (this.textBox3.Text=="")
{
MessageBox.Show("NewValue could not be empty");
false
}
else
{
try
{
if(checkBox1.Checked)
{
PatchOptions.WinHeader=this.textBox4.Text.ToString();
PatchOptions.window=false;
}
else
{
PatchOptions.WinHeader=this.textBox1.Text.ToString();
PatchOptions.window=true;
}
PatchOptions.BaseAddress=Int32.Parse(this.textBox2.Text.ToString());
PatchOptions.NewValue=BitConverter.GetBytes(Int32.Parse(this.textBox3.Text.ToString()));
this.Close();
true
}
catch
{
e is Exception => MessageBox.Show("You entered incorrect values.");
false
}
}
4) вызов:
def isinjected() : string
{
if (Options.PatchOptions.noerror)
{
try
{
Memory.Patch(Options.PatchOptions.WinHeader,Options.PatchOptions.BaseAddress,Options.PatchOptions.NewValue,Options.PatchOptions.window);
}
catch
{
| e is Exception => MessageBox.Show("Memory Patching error");
""
}
}
else
{
MessageBox.Show("Patch options Error");
""
}
}
def injection = isinjected();
unless (injection=="")
this.label1.Text =injection;
5) Блокнот ShowStatus смещение: D (для теста)
00b550d2 - 89 35 2c c0 b5 00 - mov [00b5c02c],esi
00b5509d - 89 3d 2c c0 b5 00 - mov [00b5c02c],edi
6) Преобразование Hex в декабре, используя выигрыш Calc: (вот беда)
00b550d2 = B550D2 = 11882706 ... надеюсь, что это правильно (это базовый адрес, я думаю) hm ... что такое NewValue? И как я могу ввести массив байтов в виде целого числа: S
помогите мне пожалуйста> _ <
Если вы просто пытаетесь узнать .NET, вы, вероятно, не должны начинать с 'WriteProcessMemory', который чрезвычайно сложный и обычно не полезный. –