ASM 取CPU序號 / CPUID,asmcpuid

來源:互聯網
上載者:User

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不然運行不了 別怪我、

 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.