ASM 取CPU序列号 / CPUID

ASM 取CPU序列号 / CPUID

分类:

获取CPU序列号我知道大概有两种方式一种为ASM另一种为WMI

如果要好点的话肯定是首选汇编了、没什么好解释的哇 不过今天

首先我们先看看下面各种语言代码运行后的效果图、

上面是C#嵌入汇编运行后获取到的CPUID 我们在看看易语言上的

上面是E语言嵌入汇编后运行的结果 两者输出的值是相同、

可以证明嵌入的汇编运行上没有问题、

上面是C++嵌入汇编后运行的结果 两者输出的值是相同、

我特定找了两台不同的电脑用于测试本代码是否有效

效验图一:

效验图二:

从上图中你可以清楚看到、两款不同的CPU那么它们的CPUID也不应一致

但是你从上图已经明确看到序列号不一的结果、所以不必担心代码有问题

#include "stdafx.h"#include <stdio.h>int* GetGPUID(){__asm{mov eax,00hxor edx,edxcpuidmov dword ptr [ebp-4],edxmov dword ptr [ebp-8],eaxmov eax,01hxor ecx,ecxxor edx,edxcpuidmov dword ptr [ebp-12],edxmov dword ptr [ebp-16],eaxmoveax,dword ptr [ebp-4]movdword ptr [ebp-20],eaxmoveax,dword ptr [ebp-8]movdword ptr [ebp-24],eaxmoveax,dword ptr [ebp-12]movdword ptr [ebp-28],eaxmoveax,dword ptr [ebp-16]movdword ptr [ebp-32],eaxleaeax, dword ptr[ebp-20]popedipopesipopebxmovesp,ebppopebpret}}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上次我在写另一片文章中专门提到过这个问

但要相信真诚的爱情,对爱情永远怀有单纯的向往。

ASM 取CPU序列号 / CPUID

相关文章:

你感兴趣的文章:

标签云: