Unity3D-WebPlayer上获取机器性能相关的尝试

今天花了数个小时研究如何获取机器性能相关参数,用来给用户做一个推荐配置选项。

首先介绍的是 SystemInfo , 这个是U3D自带类
可以获取除了CPU主频以外的绝大多数参数---除了主频。。
这没花什么时间,然后笔者很悲剧的花了一整天来找寻获取CPU主频的办法。

C#获取主频的方式大抵分为两种:
1、计时,然后自己算
2、直接查询。

我的结论是哪一种都没办法在webplayer里使用,参考:http://forum.unity3d.com/threads/7009-Unsafe-code-in-Unity
“to be more precise about webplayer: Anything relying on P/Invoke is disabled and cut, not only unsafe code”
最终采用的是使用SystemInfo的processorName,从中解析@ 3.00GHz 这类字符串来得到主频,解析不了就拉倒。

所以以下介绍的五种方法,如果客官感兴趣可以继续阅读(如果想知道我遇到的各种坑),否则就采用上述方案吧.

计时的方法有两种:

A)使用 RDTSC指令

具体使用方法搜一下即可,以下代码我没测试,只是转载用来描述RDTSC方法。

说到检测CPU的速度,一般是测试在单位时间内运算的指令条数,但用这种方法有太大的局限
性,
   由于受到很多因素的影响,准确度比较低,特别是在Windows环境下,
   你不知道在你的程序外别的程序占用了多少的时间片。其实,在586及以上档次处理器中,
   已经有了一条专用的指令来测试主频,那就是 RDTSC指令,意思是读取时间标记计数器,
   是处理器内部的一个64位的MSR (model specific register),它每个时钟增加一个记数。
   在处理器复位的时候,初始值为0,RDTSC 指令把 TSC的值低32位装入EAX中,
   高32位装入EDX中。如果CPU的主频是200MHz,那么在一秒钟内,TSC的值增加 200.000.000次。
   所以在计算的时候,把两次的TSC差值除以两次的时间差值就是CPU的主频。
   程序的结构如下: 初始化的时候设置一个定时器,定时时间为1秒,然后在定时器消息中利用 
   RDTSC 取得 TSC计数,再和上次保留的值相减,然后除以时间差即可。
bcb OK
#prgram inline
void __fastcall TForm1::Button1Click(TObject *Sender)
{

     DWORD eax1,edx1,eax2,edx2;
   asm
   {
      rdtsc
      mov eax1,eax
      mov edx1,edx
   }
   Sleep(1000);
   asm{
     rdtsc
     mov eax2,eax
     mov edx2,edx
    }

   eax2-=eax1;
   edx2-=edx1;

   edx2*=2147483647;
   edx2+=eax2;
   Label2->Caption=IntToStr(edx2);
}

U3D应用这种方法有几个难处
首先是asm的调用,c#调用asm很不友好,不过这个还能解决,各位参考如下代码:

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);
        }
    }
}
问题1:代码中0x89,0xD0这类机器码是如何得出来的?
不在乎,而且我也搜索到一个看起来很NB的类,姑且算作备选方案,但是文章后面会说到第2个难处:unsafe code

http://lotyong.blog.163.com/blog/static/98306907200841210340779/
http://lotyong.blog.163.com/blog/static/983069072008412103616779/

全部代码太长,我挪到文章的结尾了

B) 再一种计时方式

忘了(不要打我),不过要注意的是需要将程序所在线程的优先级提高,避免CPU使用权被抢占,反正挺麻烦,而且得的还不准,就没细查了。

直接查询的方式有3种:

A) 使用System.Management

代码中添加
using System.Management.Instrumentation;
using System.Management;

 ManagementClass m = new ManagementClass("Win32_Processor");
            ManagementObjectCollection mn = m.GetInstances();
            MessageBox.Show("CPU个数:"+mn.Count.ToString());
            ManagementObjectSearcher MySearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
            foreach (ManagementObject MyObject in MySearcher.Get())
            {
                MessageBox.Show("主频:"+MyObject.Properties["CurrentClockSpeed"].Value.ToString());
            }
这种方式无法使用的问题在于,unity_web使用的dll是mono.2.0的子集,在这个子集里,是不带Management.dll的。
OK,那我就用调用DLL的方式加进去总可以了吧,于是乎这样干了:
将Editor自带的mono.2.0下的System.Management.dll扔到Assets目录里,然后在MonoDevelpment里编译,过了。

回到Unity-Build,居然报System.CodeDom.TypeDeclaration 不存在...查了一下,web版使用的System.dll压根就没有CodeDom这个namespace
(-___-;) ....

好吧,换方案

B) 使用注册表

如果这个世界上没有360的话,也许这个方案我还会去实验一下,360就是一流氓软件!
CString strPath = L"HARDWARE//DESCRIPTION//System//CentralProcessor//0";  //注册表子键路径 
CRegKey regkey;  //定义注册表类对象 
LONG lResult;    //LONG型变量-反应结果 
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_ALL_ACCESS); //打开注册表键 
if (lResult!=ERROR_SUCCESS) 
{ 
  AfxMessageBox(L"错误:无法查询有关的注册表信息"); 
  return; 
} 
DWORD dwMHz; 
regkey.QueryValue(dwMHz, L"~MHz");//获取VendorIdentifier字段值 
regkey.Close();//关闭注册表 
CString str; 
str.Format(L"%d", dwMHz); 
MessageBox(str);
有需要的同学凑合着看吧,反正少去动注册表,用户是不懂安全不安全的,360说你不安全你就不安全,特么的!
所以这个方案直接pass!

C) 使用系统API CallNtPowerInformation

先说个弯路,GetSystemInfo , 这个API可以获取一些和CPU相关的信息,我摘录了一部分。注意,64位系统应使用 GetNativeSystemInfo。

解释参考MSDN: http://msdn.microsoft.com/en-us/library/ms724381(VS.85).aspx
参考用法 http://blog.csdn.net/cbgn/article/details/4026897

[StructLayout(LayoutKind.Sequential)] 
public struct SYSTEM_INFO
{
    public uint dwOemId;
    public uint dwPageSize;
    public uint lpMinimumApplicationAddress;
    public uint lpMaximumApplicationAddress;
    public uint dwActiveProcessorMask;
    public uint dwNumberOfProcessors;
    public uint dwProcessorType;
    public uint dwAllocationGranularity;
    public uint dwProcessorLevel;
    public uint dwProcessorRevision; 
}


class A
{
    [DllImport("kernel32")]
    private static extern void GetSystemInfo(ref SYSTEM_INFO cpuInfo);


    public SYSTEM_INFO GetCpuInfo()
    {
        SYSTEM_INFO cpuInfo = new SYSTEM_INFO();
        GetSystemInfo(ref cpuInfo);
        return cpuInfo;
    }
}
其中最让人感兴趣的是 dwProcessorLevel ,OK,什么是CPU等级。。。以下是MSDN的解释

wProcessorLevel

The architecture-dependent processor level. It should be used only for display purposes. To determine the feature set of a processor, use theIsProcessorFeaturePresent function.

If wProcessorArchitecture is PROCESSOR_ARCHITECTURE_INTEL, wProcessorLevel is defined by the CPU vendor.

If wProcessorArchitecture is PROCESSOR_ARCHITECTURE_IA64, wProcessorLevel is set to 1.

CPU等级,可以类比显卡能力,就是CPU支持的一些指令集,比如3D-NOW之类的. 虽然很厉害,但是这个不是我想要的....可能以后能用上也说不定,比如显示出很多详细信息,让玩家觉得自己的CPU很NB之类..总之现在对我没用。

CallNtPowerInformation

这个API可以查询到CPU主频,当时在知道真相之前,我简直就跟发现真主了一样--直到我被狠狠的坑了一下.

NTSTATUS WINAPI CallNtPowerInformation(
  _In_   POWER_INFORMATION_LEVEL InformationLevel,
  _In_   PVOID lpInputBuffer,
  _In_   ULONG nInputBufferSize,
  _Out_  PVOID lpOutputBuffer,
  _In_   ULONG nOutputBufferSize
);

如你所见,这是C++,那么怎么在C#里调用呢,花费了大量时间之后,我终于找到了正确写法:

调用时,需要使用到指定的枚举:11

ProcessorInformation 11

The lpInBuffer parameter must be NULL; otherwise the function returns ERROR_INVALID_PARAMETER.

The lpOutputBuffer buffer receives one PROCESSOR_POWER_INFORMATION structure for each processor that is installed on the system. Use the GetSystemInfo function to retrieve the number of processors.

然后是C#的语法,为了写对,花了我好几个小时的时间,那个PLVOID搞死人了
参考《C#调用C++的DLL搜集整理的所有数据类型转换方式》

[StructLayout(LayoutKind.Sequential)] 
public struct _PROCESSOR_POWER_INFORMATION
{
  uint Number;
  uint MaxMhz;
  uint CurrentMhz;
  uint MhzLimit;
  uint MaxIdleState;
  uint CurrentIdleState;
};


class A
{
	[DllImport("powrprof")]
	public static extern int void CallNtPowerInformation(
		System.Int32 InformationLevel,
		System.IntPtr lpInputBuffer,
		System.UInt32 nInputBufferSize,
		System.IntPtr lpOutputBuffer,
		System.UInt32 nOutputBufferSize
	);

	uint _GetMaxMHz()
	{
		Type type = typeof(_PROCESSOR_POWER_INFORMATION);
		int size = Marshal.SizeOf( type);
		uint cb = (uint)( size * SystemInfo.processorCount; // 也可以使用API:GetSystemInfo中获取的CPU数量,这里的尺寸大小,有几个CPU,就需要申请几个结构体
	
		System.IntPtr buffer = Marshal.AllocCoTaskMem((int)cb);
		System.IntPtr nullp = (SystemIntPtr)null;
		try
		{
			int r = CallNtPowerInformation(11,nullp,0,buffer,cb);
		}
		catch
		{
			Marshal.FreeCoTaskMem(buffer);
			return 0;
		}

		byte[] ptr = new byte[size];
		Marshal.Copy(buffer, ptr, 0, size);
		Marshal.FreeCoTaskMem(buffer);

		_PROCESSOR_POWER_INFORMATION info = (_PROCESSOR_POWER_INFORMATION)BytesToStrcut(ptr, type);
		return info.MaxMhz;
	}

	static object BytesToStruct(byte[] bytes, Type structType)
	{
		int size = Marshal.SizeOf(strcutType);
		System.IntPtr buffer = Marshal.AllocCoTaskMem(size);
		try
		{
			Marshal.Copy( bytes, 0, buffer, size);
			return Marshal.PtrToStructure(buffer,structType);
		}
		finally
		{
			Marshal.FreeCoTaskMem(buffer);
		}
	}
}
千辛万苦走到这步,在Unity Editor中已经可以得到我的CPU主频了: 3000 * 4
然后Build,上网页,一分钟后听到了心碎的声音。。。至于原因,你懂的。

最后的尝试:asm / Unity使用Unsafe代码

好吧,我还有asm那个备选方案没尝试,那就试试吧。
c#使用asm,一定会使用到unsafe code的,所以就有“Unity使用Unsafe代码”这个问题出来了,
在网上找了下,unity使用unsafe code是可行的,一共有两种方法:

1、rsp文件,

具体方法是利用 unity 编译代码的工作流特性。
以c#脚本为例,smcs.exe 是用来编译c#脚本的,unity启动时,会调用各种脚本的编译工具,而smcs.exe则使用名为 smcs.rsp文件作为其自定义编译选项配置文件。
rsp文件里只写一行:-unsafe

可以参考以下回答:

We are improving the documentation on Custom Defines, and it's important to update these threads with the correct way of using them in the current versions of Unity. If you want to modify only global defines, you should use Scripting Define Symbols in Player Settings, because this will cover all the compilers. If you choose the .rsp files instead, you'll have to provide one file for every compiler Unity uses, and you won't know when one or another compiler is used. To do this you must add a text file with the extra directives to the "Assets/" folder:

C#<Project Path>/Assets/smcs.rsp
C# - Editor Scripts<Project Path>/Assets/gmcs.rsp
UnityScript<Project Path>/Assets/us.rsp
Boo<Project Path>/Assets/boo.rsp
As an example, if you include the single line "-define:UNITY_DEBUG" in your smcs.rsp file the define UNITY_DEBUG will exist as a global define for C# scripts, except for Editor scripts. Every time you make changes to .rsp files you will need to recompile for them to be effective. You can do this by updating or reimporting a single script (.js, .cs or .boo) file. All this information is being added to our documentation.

我试了下,在3.5.7f6版本该方法无效,切换平台之后一样无效,但是我看应用这个方法并宣称成功的人在2012年就有了,不知道是我RP问题还是什么。。但是我在4.0的版本测试是通过了。

2、使用UnityEditor提供的 Custom defines方法

参考:http://docs.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html

Custom defines

It is also possible to add to the built-in selection of defines by supplying your own. In theOther Settings panel of thePlayer Settings, you will see the Scripting Define Symbols textbox.

Here, you can enter the names of the symbols you want to define for that particular platform, separated by semicolons. These symbols can then be used as the conditions for#if directives just like the built-in ones. 

这也是4.0才有的功能。


也正是因为做到这一步的尝试后,找到了unity开发人员出来辟谣的帖子,终于选用10个小时前就萌生的那个听上去很井的解析字符串的方案,我走了弯路,你会继续吗?


附录1:NB的C#调用ASM的类

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace AsmClassLibrary
{
    public class Class1
    {
        [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
        public static extern int CloseHandle(int hObject);
        [DllImport("kernel32.dll")]
        public static extern Int32 WriteProcessMemory(
            IntPtr hProcess,
            IntPtr lpBaseAddress,
            [In, Out] byte[] buffer,
            int size,
            out IntPtr lpNumberOfBytesWritten);
        [DllImport("kernel32.dll")]
        public static extern Int32 WriteProcessMemory(
            int hProcess,
            int lpBaseAddress,
            byte[] buffer,
            int size,        
            int lpNumberOfBytesWritten);
        [DllImport("kernel32", EntryPoint = "CreateRemoteThread")]
        public static extern int CreateRemoteThread(
            int hProcess,
            int lpThreadAttributes,
            int dwStackSize,
            int lpStartAddress,
            int lpParameter,
            int dwCreationFlags,
            ref int lpThreadId
            );
        [DllImport("Kernel32.dll")]
        public static extern System.Int32 VirtualAllocEx(
            System.IntPtr hProcess,
            System.Int32 lpAddress,
            System.Int32 dwSize,
            System.Int16 flAllocationType,
            System.Int16 flProtect
            );
        [DllImport("Kernel32.dll")]
        public static extern System.Int32 VirtualAllocEx(
            int hProcess,
            int lpAddress,
            int dwSize,
            int flAllocationType,
            int flProtect
            );
        [DllImport("Kernel32.dll")]
        public static extern System.Int32 VirtualFreeEx(
            int hProcess,
            int lpAddress,
            int dwSize,
            int flAllocationType
            );
        [DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
            public static extern int OpenProcess(
            int dwDesiredAccess,
            int bInheritHandle,
            int dwProcessId
            );
        private const int PAGE_EXECUTE_READWRITE = 0x4;
        private const int MEM_COMMIT = 4096;
        private const int MEM_RELEASE = 0x8000;
        private const int MEM_DECOMMIT = 0x4000;
        private const int PROCESS_ALL_ACCESS = 0x1F0FFF;
        private const int PROCESS_CREATE_THREAD = 0x2;
        private const int PROCESS_VM_OPERATION = 0x8;
        private const int PROCESS_VM_WRITE = 0x20;
        public string Asmcode="";
        private string hex(int address)
        {
            string str = address.ToString("X");
            return str;
        }
        public string intTohex(int value, int num)
        {
            string str1;
           string str2 = "";
            str1 = "0000000" + this.hex(value);
            str1 = str1.Substring(str1.Length - num,num);
            for (int i = 0; i < str1.Length/2; i++)
            {
                str2 = str2 + str1.Substring(str1.Length - 2 - 2 * i, 2);
            }
            return str2;
        }
        public void SUB_ESP(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
            {
                this.Asmcode = this.Asmcode + "83EC" + intTohex(addre, 2);
            }
            else
            {
                this.Asmcode = this.Asmcode + "81EC" + intTohex(addre, 8);
            }
        }
             
        public void Nop()
        {
            this.Asmcode = this.Asmcode + "90";
        }
        public void RetA(int addre)
        {
            this.Asmcode = this.Asmcode + intTohex(addre, 4);
        }
        public void IN_AL_DX()
        {
            this.Asmcode = this.Asmcode + "EC";
        }
        public void TEST_EAX_EAX()
        {
            this.Asmcode = this.Asmcode + "85C0";
        }
        public void Leave()
        {
            this.Asmcode = this.Asmcode + "C9";
        }
        public void Pushad()
        {
            this.Asmcode = this.Asmcode + "60";
        }
	public void Popad()
        {
            this.Asmcode = this.Asmcode + "61";
        }
        public void Ret()
        {
            this.Asmcode = this.Asmcode + "C3";
        }        #region ADD
        public void Add_EAX_EDX()
        {
            this.Asmcode = this.Asmcode + "03C2";
        }
        public void Add_EBX_EAX()
        {
            this.Asmcode = this.Asmcode + "03D8";
        }
        public void Add_EAX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "0305" + intTohex(addre, 8);
        }
        public void Add_EBX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "031D" + intTohex(addre, 8);
        }
        public void Add_EBP_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "032D" + intTohex(addre, 8);
        }
        public void Add_EAX(int addre)
        {
            this.Asmcode = this.Asmcode + "05" + intTohex(addre, 8);
        }
        public void Add_EBX(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "83C3" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "81C3" + intTohex(addre, 8);
        }
        public void Add_ECX(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "83C1" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "81C1" + intTohex(addre, 8);
        }
        public void Add_EDX(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "83C2" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "81C2" + intTohex(addre, 8);
        }
        public void Add_ESI(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "83C6" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "81C6" + intTohex(addre, 8);
        }
        public void Add_ESP(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "83C4" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "81C4" + intTohex(addre, 8);
        }
        #endregion 
        #region mov
        public void Mov_DWORD_Ptr_EAX_ADD(int addre, int addre1)
        {
            if ((addre <= 127) && (addre >= -128))
            {
                this.Asmcode = this.Asmcode + "C740" + intTohex(addre, 2) + intTohex(addre1, 8);
            }
            else
            {
                this.Asmcode = this.Asmcode + "C780" + intTohex(addre, 8) + intTohex(addre1, 8);
            }
        }
        public void Mov_DWORD_Ptr_ESP_ADD(int addre,int addre1)
        {
            if ((addre <= 127) && (addre >= -128))
            {
                this.Asmcode = this.Asmcode + "C74424" + intTohex(addre, 2)+intTohex(addre1,8);
            }
            else
            {
                this.Asmcode = this.Asmcode + "C78424" + intTohex(addre, 8) + intTohex(addre1, 8);
            }
        }
        public void Mov_DWORD_Ptr_ESP_ADD_EAX(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
            {
                this.Asmcode = this.Asmcode + "894424" + intTohex(addre, 2);
            }
            else
            {
                this.Asmcode = this.Asmcode + "898424" + intTohex(addre, 8);
            }
        }
        public void Mov_DWORD_Ptr_ESP(int addre)
        {
            this.Asmcode = this.Asmcode + "C70424" + intTohex(addre, 8);
        }
        public void Mov_DWORD_Ptr_EAX(int addre)
        {
            this.Asmcode = this.Asmcode + "A3" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B1D" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B0D" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "A1" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B15" + intTohex(addre, 8);
        }
        public void Mov_ESI_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B35" + intTohex(addre, 8);
        }
        public void Mov_ESP_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B25" + intTohex(addre, 8);
        }
        public void Mov_EBP_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "8B2D" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_EAX(int addre)
        {
            this.Asmcode = this.Asmcode + "8B00";
        }
        public void Mov_EAX_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "8B00";
        }
        public void Mov_EAX_DWORD_Ptr_EBP()
        {
            this.Asmcode = this.Asmcode + "8B4500";
        }
        public void Mov_EAX_DWORD_Ptr_EBX()
        {
            this.Asmcode = this.Asmcode + "8B03";
        }
        public void Mov_EAX_DWORD_Ptr_ECX()
        {
            this.Asmcode = this.Asmcode + "8B01";
        }
        public void Mov_EAX_DWORD_Ptr_EDX()
        {
            this.Asmcode = this.Asmcode + "8B02";
        }
        public void Mov_EAX_DWORD_Ptr_EDI()
        {
            this.Asmcode = this.Asmcode + "8B07";
        }
        public void Mov_EAX_DWORD_Ptr_ESP()
        {
            this.Asmcode = this.Asmcode + "8B0424";
        }
        public void Mov_EAX_DWORD_Ptr_ESI()
        {
            this.Asmcode = this.Asmcode + "8B06";
        }
        public void Mov_EAX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
            {
                this.Asmcode = this.Asmcode + "8B40" + intTohex(addre, 2);
            }
            else
            {
                this.Asmcode = this.Asmcode + "8B80" + intTohex(addre, 8);
            }
        }
        public void Mov_EAX_DWORD_Ptr_ESP_Add(int addre)
        {
             if((addre<=127)&&(addre>=-128))
                this.Asmcode = this.Asmcode + "8B4424" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8424" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_EBX_Add(int addre)
        {
             if((addre<=127)&&(addre>=-128))
                this.Asmcode = this.Asmcode + "8B43" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B83" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B41" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B81" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B42" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B82" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B47" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B87" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B45" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B85" + intTohex(addre, 8);
        }
        public void Mov_EAX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B46" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B86" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B58" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B98" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5C24" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9C24" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5B" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9B" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B59" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B99" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5A" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9A" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5F" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9F" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5D" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9D" + intTohex(addre, 8);
        }
        public void Mov_EBX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5E" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9E" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B48" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B88" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4C24" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8C24" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4B" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8B" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B49" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B89" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4A" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8A" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4F" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8F" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4D" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8D" + intTohex(addre, 8);
        }
        public void Mov_ECX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B4E" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B8E" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B50" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B90" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B5424" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B9424" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B53" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B93" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B51" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B91" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B52" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B92" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B57" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B97" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B55" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B95" + intTohex(addre, 8);
        }
        public void Mov_EDX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8B56" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8B96" + intTohex(addre, 8);
        }
        public void Mov_ECX_EAX()
        {
            this.Asmcode = this.Asmcode + "8BC8";
        }
        public void Mov_EAX(int addre)
        {
            this.Asmcode = this.Asmcode + "B8" + intTohex(addre, 8);
        }
        public void Mov_EBX(int addre)
        {
            this.Asmcode = this.Asmcode + "BB" + intTohex(addre, 8);
        }
        public void Mov_ECX(int addre)
        {
            this.Asmcode = this.Asmcode + "B9" + intTohex(addre, 8);
        }
        public void Mov_EDX(int addre)
        {
            this.Asmcode = this.Asmcode + "BA" + intTohex(addre, 8);
        }
        public void Mov_ESI(int addre)
        {
            this.Asmcode = this.Asmcode + "BE" + intTohex(addre, 8);
        }
        public void Mov_ESP(int addre)
        {
            this.Asmcode = this.Asmcode + "BC" + intTohex(addre, 8);
        }
        public void Mov_EBP(int addre)
        {
            this.Asmcode = this.Asmcode + "BD" + intTohex(addre, 8);
        }
        public void Mov_EDI(int addre)
        {
            this.Asmcode = this.Asmcode + "BF" + intTohex(addre, 8);
        }
        public void Mov_ESI_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "8B7020";
        }
        public void Mov_EBX_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "8B18";
        }
        public void Mov_EBX_DWORD_Ptr_EBP()
        {
            this.Asmcode = this.Asmcode + "8B5D00";
        }
        public void Mov_EBX_DWORD_Ptr_EBX()
        {
            this.Asmcode = this.Asmcode + "8B1B";
        }
        public void Mov_EBX_DWORD_Ptr_ECX()
        {
            this.Asmcode = this.Asmcode + "8B19";
        }
        public void Mov_EBX_DWORD_Ptr_EDX()
        {
            this.Asmcode = this.Asmcode + "8B1A";
        }
        public void Mov_EBX_DWORD_Ptr_EDI()
        {
            this.Asmcode = this.Asmcode + "8B1F";
        }
        public void Mov_EBX_DWORD_Ptr_ESP()
        {
            this.Asmcode = this.Asmcode + "8B1C24";
        }
        public void Mov_EBX_DWORD_Ptr_ESI()
        {
            this.Asmcode = this.Asmcode + "8B1E";
        }
	public void Mov_ECX_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "8B08";
        }
        public void Mov_ECX_DWORD_Ptr_EBP()
        {
            this.Asmcode = this.Asmcode + "8B4D00";
        }
        public void Mov_ECX_DWORD_Ptr_EBX()
        {
            this.Asmcode = this.Asmcode + "8B0B";
        }
        public void Mov_ECX_DWORD_Ptr_ECX()
        {
            this.Asmcode = this.Asmcode + "8B09";
        }
        public void Mov_ECX_DWORD_Ptr_EDX()
        {
            this.Asmcode = this.Asmcode + "8B0A";
        }
        public void Mov_ECX_DWORD_Ptr_EDI()
        {
            this.Asmcode = this.Asmcode + "8B0F";
        }
        public void Mov_ECX_DWORD_Ptr_ESP()
        {
            this.Asmcode = this.Asmcode + "8B0C24";
        }
        public void Mov_ECX_DWORD_Ptr_ESI()
        {
            this.Asmcode = this.Asmcode + "8B0E";
        }
        public void Mov_EDX_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "8B10";
        }
        public void Mov_EDX_DWORD_Ptr_EBP()
        {
            this.Asmcode = this.Asmcode + "8B5500";
        }
        public void Mov_EDX_DWORD_Ptr_EBX()
        {
            this.Asmcode = this.Asmcode + "8B13";
        }
        public void Mov_EDX_DWORD_Ptr_ECX()
        {
            this.Asmcode = this.Asmcode + "8B11";
        }
        public void Mov_EDX_DWORD_Ptr_EDX()
        {
            this.Asmcode = this.Asmcode + "8B12";
        }
        public void Mov_EDX_DWORD_Ptr_EDI()
        {
            this.Asmcode = this.Asmcode + "8B17";
        }
        public void Mov_EDX_DWORD_Ptr_ESI()
        {
            this.Asmcode = this.Asmcode + "8B16";
        }
        public void Mov_EDX_DWORD_Ptr_ESP()
        {
            this.Asmcode = this.Asmcode + "8B1424";
        }
        public void Mov_EAX_EBP()
        {
            this.Asmcode = this.Asmcode + "8BC5";
        }
        public void Mov_EAX_EBX()
        {
            this.Asmcode = this.Asmcode + "8BC3";
        }
        public void Mov_EAX_ECX()
        {
            this.Asmcode = this.Asmcode + "8BC1";
        }
        public void Mov_EAX_EDI()
        {
            this.Asmcode = this.Asmcode + "8BC7";
        }
        public void Mov_EAX_EDX()
        {
            this.Asmcode = this.Asmcode + "8BC2";
        }
        public void Mov_EAX_ESI()
        {
            this.Asmcode = this.Asmcode + "8BC6";
        }
        public void Mov_EAX_ESP()
        {
            this.Asmcode = this.Asmcode + "8BC4";
        }
        public void Mov_EBX_EBP()
        {
            this.Asmcode = this.Asmcode + "8BDD";
        }
        public void Mov_EBX_EAX()
        {
            this.Asmcode = this.Asmcode + "8BD8";
        }
        public void Mov_EBX_ECX()
        {
            this.Asmcode = this.Asmcode + "8BD9";
        }
        public void Mov_EBX_EDI()
        {
            this.Asmcode = this.Asmcode + "8BDF";
        }
        public void Mov_EBX_EDX()
        {
            this.Asmcode = this.Asmcode + "8BDA";
        }
        public void Mov_EBX_ESI()
        {
            this.Asmcode = this.Asmcode + "8BDE";
        }
        public void Mov_EBX_ESP()
        {
            this.Asmcode = this.Asmcode + "8BDC";
        }
        public void Mov_ECX_EBP()
        {
            this.Asmcode = this.Asmcode + "8BCD";
        }
       /* public void Mov_ECX_EAX()
        {
            this.Asmcode = this.Asmcode + "8BC8";
        }*/
        public void Mov_ECX_EBX()
        {
            this.Asmcode = this.Asmcode + "8BCB";
        }
        public void Mov_ECX_EDI()
        {
            this.Asmcode = this.Asmcode + "8BCF";
        }
        public void Mov_ECX_EDX()
        {
            this.Asmcode = this.Asmcode + "8BCA";
        }
        public void Mov_ECX_ESI()
        {
            this.Asmcode = this.Asmcode + "8BCE";
        }
        public void Mov_ECX_ESP()
        {
            this.Asmcode = this.Asmcode + "8BCC";
        }
        public void Mov_EDX_EBP()
        {
            this.Asmcode = this.Asmcode + "8BD5";
        }
        public void Mov_EDX_EBX()
        {
            this.Asmcode = this.Asmcode + "8BD3";
        }
        public void Mov_EDX_ECX()
        {
            this.Asmcode = this.Asmcode + "8BD1";
        }
        public void Mov_EDX_EDI()
        {
            this.Asmcode = this.Asmcode + "8BD7";
        }
        public void Mov_EDX_EAX()
        {
            this.Asmcode = this.Asmcode + "8BD0";
        }
        public void Mov_EDX_ESI()
        {
            this.Asmcode = this.Asmcode + "8BD6";
        }
        public void Mov_EDX_ESP()
        {
            this.Asmcode = this.Asmcode + "8BD4";
        }
        public void Mov_ESI_EBP()
        {
            this.Asmcode = this.Asmcode + "8BF5";
        }
        public void Mov_ESI_EBX()
        {
            this.Asmcode = this.Asmcode + "8BF3";
        }
        public void Mov_ESI_ECX()
        {
            this.Asmcode = this.Asmcode + "8BF1";
        }
        public void Mov_ESI_EDI()
        {
            this.Asmcode = this.Asmcode + "8BF7";
        }
        public void Mov_ESI_EAX()
        {
            this.Asmcode = this.Asmcode + "8BF0";
        }
        public void Mov_ESI_EDX()
        {
            this.Asmcode = this.Asmcode + "8BF2";
        }
        public void Mov_ESI_ESP()
        {
            this.Asmcode = this.Asmcode + "8BF4";
        }
        public void Mov_ESP_EBP()
        {
            this.Asmcode = this.Asmcode + "8BE5";
        }
        public void Mov_ESP_EBX()
        {
            this.Asmcode = this.Asmcode + "8BE3";
        }
        public void Mov_ESP_ECX()
        {
            this.Asmcode = this.Asmcode + "8BE1";
        }
        public void Mov_ESP_EDI()
        {
            this.Asmcode = this.Asmcode + "8BE7";
        }
        public void Mov_ESP_EAX()
        {
            this.Asmcode = this.Asmcode + "8BE0";
        }
        public void Mov_ESP_EDX()
        {
            this.Asmcode = this.Asmcode + "8BE2";
        }
        public void Mov_ESP_ESI()
        {
            this.Asmcode = this.Asmcode + "8BE6";
        }
        public void Mov_EDI_EBP()
        {
            this.Asmcode = this.Asmcode + "8BFD";
        }
        public void Mov_EDI_EAX()
        {
            this.Asmcode = this.Asmcode + "8BF8";
        }
        public void Mov_EDI_EBX()
        {
            this.Asmcode = this.Asmcode + "8BFB";
        }
        public void Mov_EDI_ECX()
        {
            this.Asmcode = this.Asmcode + "8BF9";
        }
        public void Mov_EDI_EDX()
        {
            this.Asmcode = this.Asmcode + "8BFA";
        }
        public void Mov_EDI_ESI()
        {
            this.Asmcode = this.Asmcode + "8BFE";
        }
        public void Mov_EDI_ESP()
        {
            this.Asmcode = this.Asmcode + "8BFC";
        }
        public void Mov_EBP_EDI()
        {
            this.Asmcode = this.Asmcode + "8BDF";
        }
        public void Mov_EBP_EAX()
        {
            this.Asmcode = this.Asmcode + "8BE8";
        }
        public void Mov_EBP_EBX()
        {
            this.Asmcode = this.Asmcode + "8BEB";
        }
        public void Mov_EBP_ECX()
        {
            this.Asmcode = this.Asmcode + "8BE9";
        }
        public void Mov_EBP_EDX()
        {
            this.Asmcode = this.Asmcode + "8BEA";
        }
        public void Mov_EBP_ESI()
        {
            this.Asmcode = this.Asmcode + "8BEE";
        }
        public void Mov_EBP_ESP()
        {
            this.Asmcode = this.Asmcode + "8BEC";
        }
        #endregion
        #region Push
        public void Push68(int addre)
        {
            this.Asmcode = this.Asmcode + "68" + intTohex(addre, 8);
           
        }
        public void Push6A(int addre)
        {
            this.Asmcode = this.Asmcode + "6A" + intTohex(addre, 2);
        }
        public void Push_EAX()
        {
            this.Asmcode = this.Asmcode + "50";
        }
        public void Push_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "FF35" + intTohex(addre, 8);
        }
        public void Push_ECX()
        {
            this.Asmcode = this.Asmcode +"51";
        }
        public void Push_EDX()
        {
            this.Asmcode = this.Asmcode + "52";
        }
        public void Push_EBX()
        {
            this.Asmcode = this.Asmcode + "53";
        }
        public void Push_ESP()
        {
            this.Asmcode = this.Asmcode + "54";
        }
        public void Push_EBP()
        {
            this.Asmcode = this.Asmcode + "55";
        }
        public void Push_ESI()
        {
            this.Asmcode = this.Asmcode + "56";
        }
        public void Push_EDI()
        {
            this.Asmcode = this.Asmcode + "57";
        }
        #endregion
        #region Call
        public void Call_EAX()
        {
            this.Asmcode = this.Asmcode + "FFD0";
        }
        public void Call_EBX()
        {
            this.Asmcode = this.Asmcode + "FFD3";
        }
        public void Call_ECX()
        {
            this.Asmcode = this.Asmcode + "FFD1";
        }
        public void Call_EDX()
        {
            this.Asmcode = this.Asmcode + "FFD2";
        }
        public void Call_ESI()
        {
            this.Asmcode = this.Asmcode + "FFD2";
        }
        public void Call_ESP()
        {
            this.Asmcode = this.Asmcode + "FFD4";
        }
        public void Call_EBP()
        {
            this.Asmcode = this.Asmcode + "FFD5";
        }
        public void Call_EDI()
        {
            this.Asmcode = this.Asmcode + "FFD7";
        }
        public void Call_DWORD_Ptr(int addre)
        {
            this.Asmcode = this.Asmcode + "FF15" + intTohex(addre, 8);
        }
        public void Call_DWORD_Ptr_EAX()
        {
            this.Asmcode = this.Asmcode + "FF10";
        }
        public void Call_DWORD_Ptr_EBX()
        {
            this.Asmcode = this.Asmcode + "FF13";
        }
        #endregion
        #region Lea
        public void Lea_EAX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D40" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D80" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D43" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D83" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D41" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D81" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D42" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D82" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D46" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D86" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D40" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D80" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4424" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8424" + intTohex(addre, 8);
        }
        public void Lea_EAX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D47" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D87" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D58" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D98" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D5C24" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9C24" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D5B" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9B" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D59" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D99" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D5A" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9A" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D5F" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9F" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_EBP_Add(int addre)
        {
            if((addre<=127)&&(addre>=-128))
                this.Asmcode = this.Asmcode + "8D5D" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9D" + intTohex(addre, 8);
        }
        public void Lea_EBX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D5E" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D9E" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D48" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D88" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_ESP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4C24" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8C24" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_EBX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4B" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8B" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_ECX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D49" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D89" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_EDX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4A" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8A" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_EDI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4F" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8F" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_EBP_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4D" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8D" + intTohex(addre, 8);
        }
        public void Lea_ECX_DWORD_Ptr_ESI_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D4E" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D8E" + intTohex(addre, 8);
        }
        public void Lea_EDX_DWORD_Ptr_EAX_Add(int addre)
        {
            if ((addre <= 127) && (addre >= -128))
                this.Asmcode = this.Asmcode + "8D50" + intTohex(addre, 2);
            else
                this.Asmcode = this.Asmcode + "8D90" + intTohex(addre, 8);
        }
	public void Lea_EDX_DWORD_Ptr_ESP_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D5424" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D9424" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_EBX_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D53" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D93" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_ECX_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D51" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D91" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_EDX_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D52" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D92" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_EDI_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D57" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D97" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_EBP_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D55" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D95" + intTohex(addre, 8); 
        } 
        public void Lea_EDX_DWORD_Ptr_ESI_Add(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "8D56" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "8D96" + intTohex(addre, 8); 
        } 
        #endregion 
        #region POP 
        public void Pop_EAX() 
        { 
            this.Asmcode = this.Asmcode + "58"; 
        } 
        public void Pop_EBX() 
        { 
            this.Asmcode = this.Asmcode + "5B"; 
        } 
        public void Pop_ECX() 
        { 
            this.Asmcode = this.Asmcode + "59"; 
        } 
        public void Pop_EDX() 
        { 
            this.Asmcode = this.Asmcode + "5A"; 
        } 
        public void Pop_ESI() 
        { 
            this.Asmcode = this.Asmcode + "5E"; 
        } 
        public void Pop_ESP() 
        { 
            this.Asmcode = this.Asmcode + "5C"; 
        } 
        public void Pop_EDI() 
        { 
            this.Asmcode = this.Asmcode + "5F"; 
        } 
        public void Pop_EBP() 
        { 
            this.Asmcode = this.Asmcode + "5D"; 
        } 
        #endregion         
        #region CMP 
        public void Cmp_EAX(int addre) 
        { 
            if ((addre <= 127) && (addre >= -128)) 
                this.Asmcode = this.Asmcode + "83F8" + intTohex(addre, 2); 
            else 
                this.Asmcode = this.Asmcode + "3D" + intTohex(addre, 8); 
        } 
        public void Cmp_EAX_EDX() 
        { 
            this.Asmcode = this.Asmcode + "3BC2"; 
        } 
        public void Cmp_EAX_DWORD_Ptr(int addre) 
        { 
            this.Asmcode = this.Asmcode + "3B05" + intTohex(addre, 8); 
        } 
        public void Cmp_DWORD_Ptr_EAX(int addre) 
        { 
            this.Asmcode = this.Asmcode + "3905" + intTohex(addre, 8); 
        } 
        #endregion 
        #region DEC 
        public void Dec_EAX() 
        { 
            this.Asmcode = this.Asmcode + "48"; 
        } 
        public void Dec_EBX() 
        { 
            this.Asmcode = this.Asmcode + "4B"; 
        } 
        public void Dec_ECX() 
        { 
            this.Asmcode = this.Asmcode + "49"; 
        } 
        public void Dec_EDX() 
        { 
            this.Asmcode = this.Asmcode + "4A"; 
        } 
        #endregion 
        #region idiv 
        public void Idiv_EAX() 
        { 
            this.Asmcode = this.Asmcode + "F7F8"; 
        } 
        public void Idiv_EBX() 
        { 
            this.Asmcode = this.Asmcode + "F7FB"; 
        } 
        public void Idiv_ECX() 
        { 
            this.Asmcode = this.Asmcode + "F7F9"; 
        } 
        public void Idiv_EDX() 
        { 
            this.Asmcode = this.Asmcode + "F7FA"; 
        } 
        #endregion 
        #region Imul 
        public void Imul_EAX_EDX() 
        { 
            this.Asmcode = this.Asmcode + "0FAFC2"; 
        } 
        public void Imul_EAX(int addre) 
        { 
            this.Asmcode = this.Asmcode + "6BC0" + intTohex(addre, 2); 
        } 
        public void ImulB_EAX(int addre) 
        { 
            this.Asmcode = this.Asmcode + "69C0" + intTohex(addre, 8); 
        } 
        #endregion 
        #region Inc 
        public void Inc_EAX() 
        { 
            this.Asmcode = this.Asmcode + "40"; 
        } 
        public void Inc_EBX() 
        { 
            this.Asmcode = this.Asmcode + "43"; 
        } 
        public void Inc_ECX() 
        { 
            this.Asmcode = this.Asmcode + "41"; 
        } 
        public void Inc_EDX() 
        { 
            this.Asmcode = this.Asmcode + "42"; 
        } 
        public void Inc_EDI() 
        { 
            this.Asmcode = this.Asmcode + "47"; 
        } 
        public void Inc_ESI() 
        { 
            this.Asmcode = this.Asmcode + "46"; 
        } 
        public void Inc_DWORD_Ptr_EAX() 
        { 
            this.Asmcode = this.Asmcode + "FF00"; 
        } 
        public void Inc_DWORD_Ptr_EBX() 
        { 
            this.Asmcode = this.Asmcode + "FF03"; 
        } 
        public void Inc_DWORD_Ptr_ECX() 
        { 
            this.Asmcode = this.Asmcode + "FF01"; 
        } 
        public void Inc_DWORD_Ptr_EDX() 
        { 
            this.Asmcode = this.Asmcode + "FF02"; 
        } 
        #endregion 
        #region jmp 
        public void JMP_EAX() 
        { 
            this.Asmcode = this.Asmcode + "FFE0"; 
        } 
        #endregion 
       
        public void RunAsm(int pid) 
        { 
            int hwnd, addre, threadhwnd; 
            byte[] Asm = this.AsmChangebytes(this.Asmcode); 
            if (pid != 0) 
            { 
                hwnd = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD | PROCESS_VM_WRITE, 0, pid); 
                if (hwnd != 0) 
                { 
                    addre = VirtualAllocEx(hwnd, 0, Asm.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
                    WriteProcessMemory(hwnd, addre, Asm, Asm.Length, 0); 
                    threadhwnd = CreateRemoteThread(hwnd, 0, 0, addre, 0, 0, ref pid); 
                    VirtualFreeEx(hwnd, addre, Asm.Length, MEM_RELEASE); 
                    CloseHandle(threadhwnd); 
                    CloseHandle(hwnd);
                }     
            } 
            this.Asmcode = ""; 
        } 
        private byte[] AsmChangebytes(string asmPram) 
        { 
            byte[] reAsmCode = new byte[asmPram.Length / 2]; 
            for (int i = 0; i < reAsmCode.Length; i++) 
            { 
                reAsmCode[ i] = Convert.ToByte(Int32.Parse(asmPram.Substring(i * 2, 2), System.Globalization.NumberStyles.AllowHexSpecifier)); 
            } 
            return reAsmCode; 
        } 
    } 
} 


如果你看到了这里,说明真的很用心啊,亲!

花了一点时间整理了下今天所学的知识,感觉虽然没完美解决我的问题,但是收获却不小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值