PDA

View Full Version : حرفه ای: استفاده از کدهای اسمبلی به صورت inline در سی شارپ



CYCLOPS
جمعه 16 بهمن 1388, 19:06 عصر
سلام به همه دوستان
من تو یه پروژه لازم دارم یه سری کارها رو با زبان اسمبلی انجام بدم حالا سوالم اینه که چطوری میتونم کدهای اسمبلی رو به صورت inline در بین کدهای سی شارپ استفاده کنم ؟؟
تو C++‎‎ با دستور asm__ اینکار رو میکردیم اینجا قضیه چطوری هست ؟؟

پیشاپیش از دوستانی که همکاری میکنند متشکرم :چشمک:

FastCode
جمعه 16 بهمن 1388, 19:13 عصر
دقیقا" میخواستم همین رو بپرسم.:گیج::کف::متعجب:شما زودتر پریسدی.
یه روش بلدم که با DEP حال نمیکنه.
یه روش دیگه هم بلدم که مشکل codesize داره.

CYCLOPS
جمعه 16 بهمن 1388, 19:33 عصر
دقیقا" میخواستم همین رو بپرسم.:گیج::کف::متعجب:شما زودتر پریسدی.
یه روش بلدم که با DEP حال نمیکنه.
یه روش دیگه هم بلدم که مشکل codesize داره.

:چشمک:
حالا شما لطف کن همین دو روشی که میدونی رو بگو تا بعدا ببینیم دوستان دیگه روش بهتری میدونند یا نه ؟؟

Nima NT
جمعه 16 بهمن 1388, 20:57 عصر
تا اونجایی که بنده اطلاع دارم همچین قابلیتی در #C وجود نداره , علتش هم فکر کنم به خاطر رفتارهای پر خطری هست که میشه با اسمبلی انجام داد ؛ در واقع مایکروسافت در فریم ورک دات نت یکی از عمده تلاشهاش اینه که کمترین ریسک در برنامه های تولیدی تحت دات نت وجود داشته باشه.

FastCode
جمعه 16 بهمن 1388, 21:34 عصر
:چشمک:
حالا شما لطف کن همین دو روشی که میدونی رو بگو تا بعدا ببینیم دوستان دیگه روش بهتری میدونند یا نه ؟؟

روش اول اینه که متغیر _methodpter رو درون شی دلگیت به یه متغیر ارجا میدیم.
روش دوم اینه که یه پراسیجر با lots of spaghetti درست مکنیم.بعد آدرسش رو میگیریم و توشو عوش میکنیم.
اولی با DEP مشکل داره و دومی هم اندازه ی کد.
من از هر دو روش جواب گرفتم ولی دنبال یه چیز بهتر هستم.

CYCLOPS
شنبه 17 بهمن 1388, 09:20 صبح
روش اول اینه که متغیر _methodpter رو درون شی دلگیت به یه متغیر ارجا میدیم.
روش دوم اینه که یه پراسیجر با lots of spaghetti درست مکنیم.بعد آدرسش رو میگیریم و توشو عوش میکنیم.
اولی با DEP مشکل داره و دومی هم اندازه ی کد.
من از هر دو روش جواب گرفتم ولی دنبال یه چیز بهتر هستم.

دوست عزیز متاسفانه چیزی از مطالبی که گفتی سر در نیاوردم
خواهشا یه تکه کد که خودت هم جواب گرفتی به عنوان مثال بذار
بازم ممنون

FastCode
شنبه 17 بهمن 1388, 14:38 عصر
1.

using System;
using System.Reflection;

class Program
{
public delegate uint Ret1ArgDelegate(uint arg1);
static uint PlaceHolder1(uint arg1) { return 0; }

public static byte[] asmBytes = new byte[]
{
0x89,0xD0, // MOV EAX,EDX
0xD1,0xC8, // ROR EAX,1
0xC3 // RET
};

unsafe static void Main(string[] args)
{
fixed(byte* startAddress = &asmBytes[0]) // Take the address of our x86 code
{
// Get the FieldInfo for "_methodPtr"
Type delType = typeof(Delegate);
FieldInfo _methodPtr = delType.GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);

// Set our delegate to our x86 code
Ret1ArgDelegate del = new Ret1ArgDelegate(PlaceHolder1);
_methodPtr.SetValue(del, (IntPtr)startAddress);

// Enjoy
uint n = (uint)0xFFFFFFFC;
n = del(n);
Console.WriteLine("{0:x}", n);
}
}
}
DEP (http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors .html)

2.(کدش رو پیدا نمیکنم.:خجالت:)

3.این یکی با DEP مشکل نداره ولی هنوز هم قابلیت کدنویسی نداره:(همین الان پیدا کردم):


[DllImport("coredll.dll", SetLastError = true)]
static extern int[] VirtualAlloc(int lpAddress, int dwSize,uint
flAllocationType, uint flProtect);



IntPtr pExecutableBuffer = VirtualAlloc(
IntPtr.Zero,
new IntPtr(byteCount),
AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
MemoryProtection.PAGE_EXECUTE_READWRITE);