none
C# 2008 下 使用 ASMclass asm = new asmslass() RRS feed

  • 問題

  • C# 2008 下 使用 ASMclass asm = new asmslass() 

    最重要的就是如何 使用內嵌ASM

    拜託 請不要 說 C# 下沒有ASM內嵌 -/-
    我確實有看過人家的ˊ原碼
    但是版本不同 無法使用

    另外 請問 要如何 友 function ?! 看過 不知怎用
    2009年8月13日 下午 01:33

所有回覆

  • 我也不想說,但真的不行啊?

    你要不要把 code 貼上來看看(你說有看過,總得有個證明吧,也讓我們大開眼界一下)?搞不好你看到的是 C 而不是 C# ...
    沒有用指標的 C/C++ 碼,看起來確實很像是 C# 碼。

    http://www.codeproject.com/KB/cs/unmanage.aspx
    這篇雖然名為 Using Unmanaged code and assembler in C#,但他的作法是先封裝 assembly code 在一個 C 的 DLL 再用 C# 呼叫,這才是正統作法。


    小人物一枚。
    2009年8月13日 下午 02:37
    版主
  • 我也不想說,但真的不行啊?

    你要不要把 code 貼上來看看(你說有看過,總得有個證明吧,也讓我們大開眼界一下)?搞不好你看到的是 C 而不是 C# ...
    沒有用指標的 C/C++ 碼,看起來確實很像是 C# 碼。

    http://www.codeproject.com/KB/cs/unmanage.aspx
    這篇雖然名為 Using Unmanaged code and assembler in C#,但他的作法是先封裝 assembly code 在一個 C 的 DLL 再用 C# 呼叫 ,這才是正統作法。


    小人物一枚。


    是媽??!   不過 我查到的ASMCLASS 是 外掛原碼 所以不方便在此討論
    不過

    在他的 C# 原碼中     的確 試
     asmclass as new asmclass()

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Windows.Forms;

    using Iislove.ClassLibrary;




    using Iislove.ClassLibrary;
    這個似乎就是 ASMCLASS

    Iislove ?!?       也就是人家的DLL??!

            public static void dzcall(int addr,int pid)
            {
                AsmClass asm = new AsmClass();
                asm.Pushad();
                asm.Mov_EAX(addr);
                asm.Call_EAX();
                asm.Popad();
                asm.Ret();
                asm.RunAsm(pid);
            }

    如此?!
    Iislove 似乎是人名?! 難道.. 這真得是引用 外部!??

    也就是說 C#下 沒有方便的ASM 內嵌操作記憶體

    難道就只能用
    CallWindowPrc

    另外如果只能用
    API CallWindowPrc
    據說是寫入  陣列 載用 CallWindowPrc(VB下...XD)

    那請問
    如果C# 要用CallWindowPrc

    執行
    push eax
    mov eax,[0x00400000]

    要如何?!

    請求= = 拜託 ASM ..

    據說 操作記憶體 在C語言中是很方便的

    但是我竟然傻傻的以為C# 也是差不多囧.. C# 是很麻煩的 對八..
    2009年8月14日 上午 04:34
  • C# 的執行環境是在 CLR,不是在原生的核心模式,所以不可能使用低階方法執行指令。
    C 和 C++ 因為可以直接在核心模式上跑,內插 asm 碼也就不足為奇(Driver 通常都會這樣寫)。

    你給的碼,也是用外包 DLL 的方法執行指令 ... 實際跑它的還是 C/C++,而且是在原生模式,AsmClass 內部應該是用 P/Invoke 方法去呼叫某支 DLL,讓它跑 assmebly directly call,所以這個套件一定不只一個 DLL,而且其中一個還是 C/C++ 寫出來的。

    public static void dzcall(int addr,int pid)
    {
         AsmClass asm = new AsmClass();
         asm.Pushad();
         asm.Mov_EAX(addr);
         asm.Call_EAX();
         asm.Popad();
         asm.Ret();
         asm.RunAsm(pid);
    }
    


    這段碼我也在網路上找到,不過因為沒有提供 source code,無從得知,但據經驗來看,這個是外包的類別沒錯,它把 MASM 的編譯行為包起來,每一個指令都是一個 assembly 碼,在 AsmClass.RunAsm() 時動態執行它。


    再強調一次,C# 本身沒有執行低階指令的能力,但透過具有執行低階指令碼能力的 DLL 的話,才可以。


    小人物一枚。
    2009年8月14日 上午 06:28
    版主
  • 於是... C#  並沒有 像C 一樣的強大功能....

    於是 C# 跟VB一樣要到處呼叫DLL

    所以     像C# VB 之類ㄉ 都是要透過 CALLwindowprc 去執行ASM??
    2009年8月14日 上午 06:48
  • 是不是透過 CallWindowProc 我不知道(沒在玩 ASM)。
    只要找的到有 DLL 可以做到,又有開放函數的話,就可以利用 P/Invoke 去呼叫它來做。

    C# 本來就沒有要做到 C/C++ 的功能,所以不要把它和 C/C++ 看成同樣的東西,光是執行環境就差很多了...。
    小人物一枚。
    2009年8月14日 上午 09:13
    版主
  • C# 的執行環境是在 CLR,不是在原生的核心模式 ,所以不可能使用低階方法執行指令。
    C 和 C++ 因為可以直接在核心模式上跑,內插 asm 碼也就不足為奇(Driver 通常都會這樣寫)。

    你給的碼,也是用外包 DLL 的方法執行指令 ... 實際跑它的還是 C/C++,而且是在原生模式,AsmClass 內部應該是用 P/Invoke 方法去呼叫某支 DLL,讓它跑 assmebly directly call,所以這個套件一定不只一個 DLL,而且其中一個還是 C/C++ 寫出來的。

    public static void dzcall(int addr,int pid)
    {
        AsmClass asm = new AsmClass();
        asm.Pushad();
        asm.Mov_EAX(addr);
        asm.Call_EAX();
        asm.Popad();
        asm.Ret();
        asm.RunAsm(pid);
    }


    這段碼我也在網路上找到,不過因為沒有提供 source code,無從得知,但據經驗來看,這個是外包的類別沒錯,它把 MASM 的編譯行為包起來,每一個指令都是一個 assembly 碼,在 AsmClass.RunAsm() 時動態執行它。


    再強調一次,C# 本身沒有執行低階指令的能力,但透過具有執行低階指令碼能力的 DLL 的話,才可以。


    小人物一枚。
    我也搜索到這個程式碼, AsmClass在Hook.dll裡。
    我透過Reflactor工具查看內容,確實是用C#實現的,不過寫的非常糟糕, 居然用string紀錄opCode。
    舉出幾個簡單的部分來看:
    class AsmClass
    {
        public string Asmcode;
    
        public void Nop()
        {
            this.Asmcode = this.Asmcode + "90";
        }
    
        public void Ret()
        {
            this.Asmcode = this.Asmcode + "C3";
        }
    }
    而且這分AsmClass的RunAsm(int)是用CreateRemoteThread在目標程式建立新的執行緒來跑ASM,跟內嵌ASM完全沒有任何關聯。

    C#本身和.NET Framework確實都沒有提供任何Native ASM的功能,除非自己實現組譯器。
    我自己就花了一個月的時間實現了一份C#寫的的Win32ASM組譯器,共計6000多行Code而已。
    當然,組譯器只是負責翻譯ASM成opCode而已,並沒有執行能力。
    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    • 已編輯 kgame 2009年8月21日 下午 07:26
    2009年8月21日 下午 07:02
  • 我也搜索到這個程式碼, AsmClass在Hook.dll裡。
    我透過Reflactor工具查看內容,確實是用C#實現的,不過寫的非常糟糕, 居然用string紀錄opCode。
    舉出幾個簡單的部分來看:
    class
     AsmClass
    {
    public string Asmcode;

    public void Nop()
    {
    this .Asmcode = this .Asmcode + "90" ;
    }

    public void Ret()
    {
    this .Asmcode = this .Asmcode + "C3" ;
    }
    }
    而且這分AsmClass的RunAsm(int)是用CreateRemoteThread在目標程式建立新的執行緒來跑ASM,跟內嵌ASM完全沒有任何關聯。


    內嵌ASM 載C# 試跑不暸的?!
    能用 也是只能用 DLL...

    ASM編譯器..    只是翻譯ASM 成 opCode
    也就是說
    nop
    翻譯成90 ??
    如此而已?!

    不過
    DB 90

    和 NOP

    又有不同了?! 不是媽? 不過 都是90 欸??

    請問是如何達成??
    2009年8月24日 上午 03:45
  • 恕我直言...

    你要不要先學習如何把你的問題表達清楚?
    我看下來頂多只看的懂最多一半。

    而且你的用詞(含標點)很多都太情緒化。

    寫作和說話的方式有時候差很多,像程式設計這種領域又不是行銷,隨便講講就可以的,用詞不準很容易誤導看的人,更何況是想幫你解問題的人?
    小人物一枚。
    2009年8月24日 上午 04:36
    版主