ASM 取CPU序號 / CPUID,asmcpuid
擷取CPU序號我知道大概有兩種方式一種為ASM另一種為WMI
如果要好點的話肯定是首選彙編了、沒什麼好解釋的哇 不過今天
我們只在C#、C++、E三種語言上內嵌彙編實現擷取CPUID的辦法
首先我們先看看下面各種語言代碼運行後的、
上面是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],eaxmov 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 edipop esipop ebxmov esp,ebppop ebpret}}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/1o602yXs // 含C++、E語言、C#三種語言的原始碼、
C#的原始碼添加到你項目中時記得先把開發環境切換為x86不然運行不了 別怪我、
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。