标签:
获取CPU序列号我知道大概有两种方式一种为ASM另一种为WMI
如果要好点的话肯定是首选汇编了、没什么好解释的哇 不过今天
我们只在C#、C++、E三种语言上内嵌汇编实现获取CPUID的办法
首先我们先看看下面各种语言代码运行后的效果图、
上面是C#嵌入汇编运行后获取到的CPUID 我们在看看易语言上的
上面是E语言嵌入汇编后运行的结果 两者输出的值是相同、
可以证明嵌入的汇编运行上没有问题、
上面是C++嵌入汇编后运行的结果 两者输出的值是相同、
#include "stdafx.h" #include <stdio.h> int* GetGPUID() { __asm { mov eax,00h xor edx,edx cpuid mov dword ptr [ebp-4],edx mov dword ptr [ebp-8],eax mov eax,01h xor ecx,ecx xor edx,edx cpuid mov dword ptr [ebp-12],edx mov dword ptr [ebp-16],eax mov eax,dword ptr [ebp-4] mov dword ptr [ebp-20],eax mov eax,dword ptr [ebp-8] mov dword ptr [ebp-24],eax mov eax,dword ptr [ebp-12] mov dword ptr [ebp-28],eax mov eax,dword ptr [ebp-16] mov dword ptr [ebp-32],eax lea eax, dword ptr[ebp-20] pop edi pop esi pop ebx mov esp,ebp pop ebp ret } } int _tmain(int argc, _TCHAR* argv[]) { int* ptr = GetGPUID(); int s1 = *ptr++; int s2 = *ptr++; int s3 = *ptr++; int s4 = *ptr; printf("%X%X%X%X", s1, s2, s3, s4); getchar(); return 0; }
上面是在C++中内嵌的汇编代码部分、功能与C#与E语言的相同
.版本 2 .支持库 eAPI .子程序 __启动窗口_创建完毕 .局部变量 ptr, 整数型 .局部变量 s1, 整数型 .局部变量 s2, 整数型 .局部变量 s3, 整数型 .局部变量 s4, 整数型 ptr = CallWindowProc ({ 85, 139, 236, 129, 236, 192, 0, 0, 0, 83, 86, 87, 141, 189, 64, 255, 255, 255, 185, 48, 0, 0, 0, 184, 204, 204, 204, 204, 243, 171, 184, 0, 0, 0, 0, 51, 210, 15, 162, 137, 85, 252, 137, 69, 248, 184, 1, 0, 0, 0, 51, 201, 51, 210, 15, 162, 137, 85, 244, 137, 69, 240, 139, 69, 252, 137, 69, 236, 139, 69, 248, 137, 69, 232, 139, 69, 244, 137, 69, 228, 139, 69, 240, 137, 69, 224, 141, 69, 236, 95, 94, 91, 139, 229, 93, 195 }, #NULL, #NULL, #NULL, #NULL) s1 = 指针到整数 (ptr) s2 = 指针到整数 (ptr + 4) s3 = 指针到整数 (ptr + 8) s4 = 指针到整数 (ptr + 12) 信息框 (格式化文本 (“%X%X%X%X”, s1, s2, s3, s4), #信息图标, , )
上面是E语言内嵌汇编的调用的代码、不过我倒是很建议大家下载打包的源代码
里面包含C++、E语言、C#三种不同的代码 我不是很喜欢Java你们可以看不起我、
我不否认我是一名C#屌丝程序员、虽然我一直很菜菜啦、但是我相当快乐、咔咔
上面的汇编是在x86上进行的、所以你需要在C#项目属性中把 目标平台 / 开发环境
修改为x86不然等会你把代码全部搞定运行不了、才搞笑的心慌 你说是不是?
现在我们开始编写代码,我们需要把常量以及需要的API全部声明出来
不然等会怎么用、嘻嘻 的吧
static partial class Program { [DllImport("kernel32.dll", SetLastError = true)] private static extern bool VirtualProtect(byte[] lpAddress, int dwSize, uint flNewProtect, out uint lpflOldProtect); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr CallWindowProc(byte[] lpPrevWndFunc, int hWnd, int Msg, int wParam, int lParam); private const int NULL = 0; private const int PAGE_EXECUTE_READWRITE = 64; }
现在我们必须要把嵌入到C#里面的汇编以机器码的形式写出来
static partial class Program { private static readonly byte[] buf_asm = { 85, 139, 236, 129, 236, 192, 0, 0, 0, 83, 86, 87, 141, 189, 64, 255, 255, 255, 185, 48, 0, 0, 0, 184, 204, 204, 204, 204, 243, 171, 184, 0, 0, 0, 0, 51, 210, 15, 162, 137, 85, 252, 137, 69, 248, 184, 1, 0, 0, 0, 51, 201, 51, 210, 15, 162, 137, 85, 244, 137, 69, 240, 139, 69, 252, 137, 69, 236, 139, 69, 248, 137, 69, 232, 139, 69, 244, 137, 69, 228, 139, 69, 240, 137, 69, 224, 141, 69, 236, 95, 94, 91, 139, 229, 93, 195 }; }
现在我们开始进入正规了、编写修改内存保护的代码 否则等会
一调用就GameOver上次我在写另一片文章中专门提到过这个问
题,如果有需要可以看看 http://blog.csdn.net/u012395622/article/details/46801475
static partial class Program { private static void VirtualProtect(byte[] address) { uint lpflOldProtect; VirtualProtect(address, address.Length, PAGE_EXECUTE_READWRITE, out lpflOldProtect); } }
好的、热血澎湃的时刻到了 准备好编写下面的代码 快快快 呵呵
static partial class Program { private static string GetCPUID() { VirtualProtect(buf_asm); IntPtr ptr = CallWindowProc(buf_asm, NULL, NULL, NULL, NULL); int s1 = Marshal.ReadInt32(ptr); int s2 = Marshal.ReadInt32(ptr, 4); int s3 = Marshal.ReadInt32(ptr, 8); int s4 = Marshal.ReadInt32(ptr, 12); return s1.ToString("X") + s2.ToString("X") + s3.ToString("X") + s4.ToString("X"); } }
我的废话一下,因为在汇编中返回的是一个整型数组的指针、而
整形数组只有4个值,所以你会看到上面我一直在调用Marshal.ReadInt32
当然你也可以使用C#中的原生指针、那感觉很酸爽 哈哈、
然后在把s1-s4的所有值转换成“%X十六进制格式文本”链接在一起
返回给调用方,OK解决问题、上次我是使用委托调用汇编本次换为
CallWindowProc去呼叫函数地址、两个差不多 我只是不想在写委托了、
static partial class Program { [STAThread] static void Main() { Console.WriteLine(GetCPUID()); Console.ReadKey(false); } }
上面是在C#滴Main函数中调用GetCPUID函数的部分,本次的意义
并不大、反正逼格已经完美 再也不担心妈妈说我不懂编程了、呵呵
源代码:http://pan.baidu.com/s/1ntBtQUd // 含C++、E语言、C#三种语言的源代码、
C#的源代码添加到你项目中时记得先把开发环境切换为x86不然运行不了 别怪我、
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u012395622/article/details/47209359