国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#編寫程序的課程學(xué)習(xí)

開發(fā) 后端
這里介紹C#編寫程序,這一課是些簡(jiǎn)單的東西,了解的可以直接越過。考慮到大多數(shù)使用c#的人都是做網(wǎng)站的,可能沒有機(jī)會(huì)接觸這些,所以我在這里做一下粗略的介紹。
本文向大家介紹C#編寫程序,可能好多人還不了解C#編寫程序,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。

C#編寫程序第一課:C#使用WINDOW API和對(duì)內(nèi)存的操作

這一課是些簡(jiǎn)單的東西,了解的可以直接越過。考慮到大多數(shù)使用c#的人都是做網(wǎng)站的,可能沒有機(jī)會(huì)接觸這些,所以我在這里做一下粗略的介紹。

step 1:認(rèn)識(shí)WINAPI   

windows系統(tǒng)里提供了很多的函數(shù),我們?nèi)绻鐾鈷斓脑挘托枰玫狡渲械暮瘮?shù)(以下簡(jiǎn)稱API)。(廢話:這些API被封裝在系統(tǒng)路徑下的DLL文件里。事實(shí)上,我們不用關(guān)心它在哪,我們只要知道怎么用就可以了,)用起來(lái)很簡(jiǎn)單,格式如下:

  1. public partial class Form1 : Form  
  2. {  
  3.     [DllImport("kernel32.dll")]          \  
  4.     public static extern int ReadProcessMemory( |  
  5.         int hProcess,               |  
  6.         int lpBaseAddress,             |  
  7.         int[] lpBuffer,                >代碼段1  
  8.         int nSize,                    |  
  9.         int lpNumberOfBytesWritten         |  
  10.     );                      /  
  11.     ...  
  12.     public Form1()  
  13.     {  
  14.         InitializeComponent();  
  15.         ReadProcessMemory(processhandle,...          >代碼2  
  16.         ...  
  17.     }  
  18.     ...  

代碼段1就是引用api的代碼。我們引用的函數(shù),是做外掛時(shí)最常用的函數(shù),從它的名字就可以看的出來(lái)它的作用---讀取進(jìn)程內(nèi)存。(廢話:從代碼里,我們很容易看的出來(lái),這個(gè)函數(shù)被封裝在了kernel32.dll這個(gè)文件里。)引用之后,我們就可以在自己的代碼中使用這個(gè)函數(shù)了(如代碼2)。

(廢話:WINDOWS還提供很多的API,如果你有興趣了解的話,可以到網(wǎng)上搜WINAPI手冊(cè)。想深入了解的話,可以看MSDN。)

step 2:讀寫內(nèi)存

下面我來(lái)說一下,如何使用上一步引用的那個(gè)API讀取游戲的數(shù)據(jù)。先來(lái)看看參數(shù):

  1. publicstaticexternintReadProcessMemory(  
  2.  
  3. inthProcess  
  4. //進(jìn)程,如果你是做外掛的話,它代表你要掛的那個(gè)游戲。  
  5.  
  6. intlpBaseAddress  
  7. //你要讀取的內(nèi)存地址  
  8.  
  9. int[]lpBuffer  
  10. //從上面那個(gè)參數(shù)地址里讀出來(lái)的東西(調(diào)用這個(gè)函數(shù)的就是為了它)不管這個(gè)參數(shù)是什么類型,它應(yīng)該是一個(gè)數(shù)組,否則讀不出東西來(lái)  
  11.  
  12. intnSize  
  13. //長(zhǎng)度,上一個(gè)參數(shù),類型是int,那個(gè)長(zhǎng)度應(yīng)該用4  
  14.  
  15. intlpNumberOfBytesWritten//用0就行了,想知道它是干嘛的,自己去MSND吧  

關(guān)于第一個(gè)參數(shù)hProcess如何獲取,我過會(huì)再說。假設(shè)它已經(jīng)搞定了,那么這個(gè)函數(shù),我們需要關(guān)心的只有l(wèi)pBaseAddress和lpBuffer,既讀的地址,和讀出來(lái)的值。(廢話:對(duì)了,這個(gè)函數(shù)貌似還有個(gè)返回值,我們這里用不到它。如果你有興趣了解,MSDN)讀出來(lái)的值out int lpBuffer我們?cè)谝肁PI的時(shí)候聲明為int型了,但是,我們要從內(nèi)存里讀的值不一定總是int。我們可以多次引用這個(gè)API,第3個(gè)參數(shù)分別用不同的類型。

下面,我們結(jié)合實(shí)際,來(lái)寫一段讀取誅仙人物HP的代碼。首先,我們需要知道人物HP的地址,(廢話:如何知道這個(gè)地址,用CE還是IE,你自己搞定吧。)我是用IE在這里http://www.ghoffice.com/bbs/read.php?tid-35908-fpage-2.html找到的,它這里是這樣寫的:

人物基址:[[&H12F830]+&H28]=base

生命:[base+&H254]

(注:&H表示16進(jìn)制,在C#里我們用0x表示)

一對(duì)[]表示讀一次地址。也就是說123表示值123,而[123]就表示從地址123讀出來(lái)的值。幾對(duì)[],就要用幾次

  1. ReadProcessMemory,我們來(lái)寫下代碼:  
  2. int[] Base=new int[1];  
  3.     int[] hp=new int[1];  
  4.     ReadProcessMemory(process, 0x12F830, Base;, 4, 0);//相當(dāng)于Base=[&H12F830]  
  5.     ReadProcessMemory(process, Base+0x28, Base;, 4, 0);//相當(dāng)于Base=[Base+&H28]  
  6.     //讀出了人物基址base  
  7.     ReadProcessMemory(process, Base+0x254, hp;, 4, 0);//相當(dāng)于hp=[base+&H254]  
  8.     //讀出了hp 

怎么樣,很簡(jiǎn)單吧。

我們讀HP只用了3行ReadProcessMemory。有的時(shí)候,讀某個(gè)值可能需要很多對(duì)[],就要寫N行ReadProcessMemory,這樣寫起來(lái)就很麻煩,看起來(lái)也很暈。下面我們來(lái)寫個(gè)函數(shù),讓讀內(nèi)存的過程看起來(lái)和[]表示法差不多。

  1. //為了看起來(lái)好看,函數(shù)的名字最好短些,所以我們用r,表示read  
  2. public static int r(int add)  
  3. {  
  4.     int[] r=new int[1];  
  5.     try 
  6.     {  
  7.         ReadProcessMemory(process, add, r, 4, 0);  
  8.       return r[0];  
  9.     }  
  10.     catch (Exception ex)  
  11.     {  
  12.         return -1;  
  13.     }  

這個(gè)函數(shù)很簡(jiǎn)單,不用我多說了吧。

有了這個(gè)函數(shù),上面的讀取HP的代碼,我們就可以寫成這樣了: 

  1. int Base;  
  2.  int hp;  
  3.  Base=r(r(0x12F830)+0x28);  
  4.  //讀出了人物基址base  
  5.  hp=r(base+&H254);  
  6.  //讀出了hp 

看起來(lái)清晰多了吧。

下面我來(lái)說下讀取字符串,首先引用API:

  1. [DllImport("kernel32.dll")]  
  2. public static extern int ReadProcessMemory(  
  3.     int hProcess,   
  4.     int lpBaseAddress,   
  5.     byte[] lpBuffer,   
  6.     int nSize,   
  7.     int lpNumberOfBytesRead  
  8. ); 

然后和上面一樣,寫一個(gè)讀字符串的方法。 

  1.        public static string rString(IntPtr process, uint add)  
  2.         {  
  3.             string[] r;  
  4.             string temp;  
  5.           
  6.  
  7. byte[] b = new byte[256];  
  8.             try 
  9.             {  
  10.                 API.ReadProcessMemory(process, (IntPtr)add, b, 256, (IntPtr)0);  
  11.                 //讀出的byte[]要按Unicode編碼為字符串  
  12.                 temp = System.Text.Encoding.Unicode.GetString(b);  
  13.                 //截取第一段字符串  
  14.                 r = temp.Split(''\0'');  
  15.                 return r[0];  
  16.             }  
  17.             catch (Exception ex)  
  18.             {  
  19.                 return "error";  
  20.             }  
  21.         } 

這個(gè)函數(shù)和上面那個(gè)函數(shù)差不多,多的東西注釋里已經(jīng)寫了,也很簡(jiǎn)單,不必我廢話了。

下面,我們來(lái)讀人物的名字。還是剛才那個(gè)帖子里得到的,人物名字偏移如下:

人物角色名:[[base+3a4]+0]

代碼如下:

  1. string name;  
  2. name=rString(r(basse + 0x3a4)+0x0);//+0x0可以去掉 

讀其他類型的數(shù)據(jù)和讀INT的雷同,我就不廢話了,大家自己搞定吧。

現(xiàn)在萬(wàn)事俱備,就差這個(gè)process了,下面我來(lái)說下,如果獲得游戲的進(jìn)程句柄(廢話:進(jìn)程句柄:一個(gè)用來(lái)表示某進(jìn)程的整形值。推廣到一般,**句柄,就是表示某**的整形值)。分兩步,第一步:

  1. System.Diagnostics.Process[] GamesProcess  
  2.                 = System.Diagnostics.Process.GetProcessesByName("elementclient");  

這一步用的是.NET本身的方法,System.Diagnostics.Process是.NET里的進(jìn)程類,GetProcessesByName靜態(tài)方法是通過進(jìn)程的名字獲得進(jìn)程數(shù)組。這行語(yǔ)句執(zhí)行之后,所有游戲進(jìn)程就放在了GamesProcess里面。如果你想做多開掛的話,可以通過數(shù)組GamesProcess的下標(biāo),來(lái)確定你要掛的游戲。

第二步:

  1. int ProcessID=GamesProcess[0].Id;  
  2. int process = OpenProcess(0x1F0FFF, 0, ProcessID); 

第1行是獲得進(jìn)程ID,就是任務(wù)管理器里看到的PID。第2行就是獲得進(jìn)程句柄。OpenProcess也是一個(gè)系統(tǒng)API,也是在kernel32.dll里。他的3個(gè)參數(shù)和返回值都聲明為INT就OK了。如何引用請(qǐng)看step 1。大家應(yīng)該可以看出來(lái)怎么用,第3個(gè)參數(shù)是進(jìn)程ID,返回的就是進(jìn)程句柄(廢話:1,2參數(shù)做何用,想知道的自己看MSDN。懶人直接用示例里的參數(shù)就行了。以后此類廢話不再多說了)。

看到這里,大家可以試著寫一個(gè)讀取人物資料的小東西試試了。當(dāng)然,前提是你要知道資料的地址。

寫內(nèi)存:

  1. WriteProcessMemory(process, (IntPtr)add, bytes, (UInt32)bytes.Length, 0);  

寫進(jìn)程內(nèi)存函數(shù)。這個(gè)API的各參數(shù)和ReadProcessMemory是一一對(duì)應(yīng)的。大家自己聲明,用用看吧。喜歡的話,也可以向上面一樣自己寫個(gè)函數(shù),以簡(jiǎn)化寫內(nèi)存的代碼。在下一課,我們要用這個(gè)函數(shù)來(lái)向游戲里寫代碼。

下一課將是些更有趣的東西。我們要通過外掛讓游戲執(zhí)行一些操作。敬請(qǐng)期待吧,呵呵。

C#編寫程序第二課 C#注入

這一課其實(shí)也很簡(jiǎn)單,只不過知道的人不多而已。

step 3:注入

注入沒什么復(fù)雜的,它是一個(gè)很簡(jiǎn)單的過程。用語(yǔ)言描述就一句話:在別的程序里寫入你的代碼,并執(zhí)行。

實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,就幾行代碼:

  1. byte[] bytes={0xC3};//我們要寫入的代碼  
  2. int addr = VirtualAllocEx(process, 0, bytes.Length, 0x1000, 0x40);//一,申請(qǐng)空間  
  3. WriteProcessMemory(process, addr, bytes, bytes.Length, 0);//二,把代碼寫進(jìn)去  
  4. int hThread = CreateRemoteThread(process, 0, 0, addr, 0, 0, threadId);//三,執(zhí)行寫入的代碼  
  5. WaitForSingleObject(hThread, 0xFFFFFFFF);//等待線程結(jié)束  
  6. VirtualFreeEx(process, addr, 0, 0x8000); //四,釋放申請(qǐng)的空間  
  7. CloseHandle(hThread);//五,關(guān)閉線程句餅  

仔細(xì)看一下這幾行代碼,你會(huì)發(fā)現(xiàn)非常簡(jiǎn)單,幾乎不需要我多說什么。這幾個(gè)豆耐特里豆不出來(lái)的函數(shù),都是API。根據(jù)上面的使用方法,引用一下,就可以用了。你能看懂的那幾個(gè)參數(shù)和返回值,就是需要你關(guān)心的。不知道的的參數(shù)都不用理會(huì),直接用上面的值就行了。還有疑問的話,可以參考WINAPI手冊(cè)。值得注意的地方是,第四步釋放申請(qǐng),如果你看了API手冊(cè),會(huì)發(fā)現(xiàn)第三個(gè)參數(shù)是大小,但如果你用bytes.Length的話就錯(cuò)了,一定要用0。

(廢話:如果你不知道怎么根據(jù)上面的使用方法引用API,我就簡(jiǎn)單說兩句。以第二行為例,我們看到VirtualAllocEx的返回值和5個(gè)參數(shù)都是int行,那么這樣聲明就行:

  1. [DllImport("Kernel32.dll")]//沒有特殊說明的話,API一般都是從這個(gè)DLL引用的  
  2. public static extern int VirtualAllocEx(  
  3.     int p1,  
  4.     int p2,  
  5.     int p3,  
  6.     int p4,  
  7.     int p5  
  8. ); 

大家可以看出來(lái),要申明一個(gè)API只要知道各參數(shù)和返回值的類型,以及DLL文件名就可以了。喜歡的話,你可以把參數(shù)的名字起的有意義些。)

簡(jiǎn)簡(jiǎn)單單幾行代碼就實(shí)現(xiàn)了注入,是不是沒你想像的復(fù)雜?呵呵。

現(xiàn)在的一個(gè)問題就是,代碼從何而來(lái)?

大家可以使用我的工具將你找到的CALL轉(zhuǎn)換為機(jī)器碼。(廢話:這個(gè)工具的原理,就是調(diào)用MASM編譯,所以任何你在MASM里能使用的語(yǔ)法和指令(限函數(shù)內(nèi)),都可以在這里用,當(dāng)然,語(yǔ)法和MASM里的語(yǔ)法規(guī)則是一樣的。使用的方法在附件里有詳細(xì)的說明,我就不在這里浪費(fèi)篇章了。)

工具轉(zhuǎn)換得到的結(jié)果是型如60b8d0305a00ffd08b561c83c40461c3的字符串,大家可以用下面的方法把它轉(zhuǎn)換為byte[]

  1.         public static byte[] getBytes(string HEX)  
  2.         {  
  3.             byte[] bytes = new byte[HEX.Length / 2];  
  4.             for (int i = 0; i <  bytes.Length; i++)  
  5.             {  
  6.                 bytes[i] = Convert.ToByte(Int32.Parse(HEX.Substring(i * 2 , 2),  
  7.  
  8. System.Globalization.NumberStyles.AllowHexSpecifier));  
  9.             }  
  10.             return bytes;  
  11.         } 

OK,C#編寫程序的課程就到這里,大家可以著手試著用C#調(diào)用一下游戲里的攻擊CALL了.(如果你不會(huì)找CALL,你可以試著在此論壇里找找)

【編輯推薦】

  1. 解密C#-SQLite是如何移植的
  2. 看看如何透過JavaScript調(diào)用C#函數(shù)
  3. 淺析C#事件注冊(cè)和注銷
  4. 示例:C#通過AMO對(duì)象瀏覽SQL SERVER 2005 SSAS
  5. C#隱藏窗口的幾種方法
責(zé)任編輯:book05 來(lái)源: hi.baidu
相關(guān)推薦

2010-01-18 17:31:54

C++編寫程序

2009-08-20 17:49:53

學(xué)習(xí)C#程序

2009-08-19 17:11:49

C#程序集

2011-06-27 13:57:42

JavaScript

2011-07-05 17:54:43

QT Sqlite ARM

2025-07-03 09:16:51

Python編程代碼

2015-09-08 13:47:24

C#編寫自動(dòng)關(guān)機(jī)

2009-08-24 15:46:46

C# SmartPho

2023-07-13 17:17:59

VSCode鴻蒙

2020-07-15 14:51:39

代碼C+開發(fā)

2009-08-24 16:02:10

C# Windows應(yīng)

2009-08-25 15:38:12

C# Windows服

2009-08-28 15:05:35

C#編寫Calenda

2009-08-18 17:08:50

C#編寫XML文檔

2009-08-25 13:26:49

C#編寫asp+

2009-08-18 16:31:19

Visual C#編寫

2009-08-06 16:58:40

C#編寫ActiveX

2009-08-12 18:04:44

編寫C#多線程

2009-08-14 09:43:59

C#復(fù)制構(gòu)造函數(shù)

2009-08-13 17:04:09

C#語(yǔ)言C#程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品中文字幕一区二区小辣椒| 国产精品久久久久久中文字| 国产精品毛片无码| 国产成人av福利| 精品福利影视| 2023国产精品久久久精品双| 91精品国产91久久久久久吃药| 色猫猫成人app| 国产网站欧美日韩免费精品在线观看 | 日韩极品视频在线观看| 天堂一区二区在线| 日日夜夜精品网站| 久久国产生活片100| 在线观看视频黄色| 国产成人精品免费在线| 免费在线黄网站| 丁香六月综合激情| 国产91xxx| 国产女主播在线一区二区| 九热视频在线观看| 国产精品色眯眯| 91大神网址| 亚洲国产日产av| 日本不卡免费播放| 欧美精品乱码久久久久久按摩| 欧美激情黑人| 亚洲精品国产品国语在线| 国产 日韩 欧美一区| 久久影院模特热| 亚洲午夜免费| 国产成人精品久久| 极品日韩av| 欧美亚洲免费在线| 国精产品一区一区三区mba视频 | 中文亚洲欧美| 伊人久久大香线蕉av一区| 国产精品911| 69久久久久久| 婷婷久久综合九色综合伊人色| 超碰免费在线观看| 日韩av在线网站| 136国产福利精品导航网址应用| 欧美做受高潮电影o| 欧美精品一级| 一区二区三区免费看| 国产999精品久久| 不卡的av中文字幕| 欧美无砖砖区免费| 91天天综合| 国产成人av网址| 六月婷婷一区| 三级在线免费看| 欧美午夜电影在线播放| jizz免费一区二区三区| 国产精品com| 免费在线观看一区二区三区| 国产成人精品视频ⅴa片软件竹菊| 亚洲午夜精品17c| 四虎影视成人| 久久久久久久激情视频| 亚洲精品国产日韩| 日日碰狠狠丁香久燥| 欧洲一区在线电影| av一级久久| 国产日韩亚洲精品| 久久亚洲精华国产精华液| 日韩黄色影片| 深夜福利91大全| 亚洲激情偷拍| 99热热99| 亚洲国产成人精品久久久国产成人一区 | 中文字幕视频一区| 日本成人不卡| 国产精品成人v| 国产精品1区二区.| 日韩av免费观影| 久久影视电视剧免费网站清宫辞电视 | 亚洲精一区二区三区| 日本成年人网址| 欧美久久久久久蜜桃| 国产精品宾馆| 日韩 欧美 自拍| 欧美亚洲愉拍一区二区| 91九色鹿精品国产综合久久香蕉| 久久偷看各类wc女厕嘘嘘偷窃| 日本一区二区三区国色天香 | 亚洲国产精品女人久久久| 激情五月色综合国产精品| 丰满女人性猛交| 色久优优欧美色久优优| 国产毛片久久久| www成人免费| 日韩一区二区在线观看| 伊人久久综合影院| 欧美三级在线观看视频| 欧美大片日本大片免费观看| 四季av在线一区二区三区| 免费看国产黄色片| 尤物精品国产第一福利三区| 久久资源在线| 二区在线视频| 国产日韩精品在线| 国产精品久久久久国产精品日日| 涩涩视频在线播放| 久久偷窥视频| 欧美在线观看禁18| 伊人久久大香线| 中文字幕av在线| 国产成人综合av| 欧美经典三级视频一区二区三区| 国产精品亚洲d| 超碰10000| 亚洲欧美制服第一页| 日韩成人免费电影| h网站久久久| 国产一区二区视频在线免费观看| 午夜精品免费在线| 妖精一区二区三区精品视频 | 国产精品久久久久久久久久久新郎 | 尹人成人综合网| 天天射综合网站| 欧美一级视频免费在线观看| 国产亚洲一二三区| 亚洲日韩中文字幕一区| 亚洲人成无码网站久久99热国产| 亚洲精选一区二区| 国产高清在线精品| 国产成人a视频高清在线观看| 日本手机在线视频| 久久视频在线观看免费| 久久久国产精品午夜一区ai换脸| 99综合久久| 播九公社成人综合网站| 日本精品久久久久影院| 亚洲一区二区三区四区在线观看| 日韩精品免费| h视频在线观看免费| 久久久久久久久一区| 日韩欧美资源站| 黄页网站大全一区二区| 国产综合av| 999精品网站| 国产成+人+综合+亚洲欧美丁香花| 亚洲综合视频网| 色综合狠狠操| 日本在线视频网| 中国一区二区三区| 久久久91精品国产一区不卡| 国产精品高潮呻吟| 91精品国产麻豆国产在线观看 | 婷婷综合在线观看| 亚洲成人直播| 阿v视频在线观看| 男女私大尺度视频| 91黄色8090| 色综合久久综合网| 蜜乳av一区二区| 国产视频一区二| 免费av播放| 国产一级精品aaaaa看| 精品精品欲导航| wwww国产精品欧美| 日韩影院二区| 密臀av在线| 一本色道无码道dvd在线观看| 国产欧美在线视频| 亚洲爱爱爱爱爱| 国产欧美一区二区精品性色| 欧美黄色录像片| av色在线观看| 最新天堂中文在线| 国产区二精品视| 日韩有码在线视频| 色哟哟日韩精品| 成人性色生活片| 久久成人福利| 91大神在线网站| 99精品在线免费视频| 国产美女久久精品| 日韩精品视频免费在线观看| 国产农村妇女毛片精品久久麻豆 | 久久久久久电影| 牛夜精品久久久久久久99黑人| 女海盗2成人h版中文字幕| 丰满少妇又爽又紧又丰满69| 久久国产精品99久久久久久丝袜| 久久精品99久久久久久久久| 婷婷国产v国产偷v亚洲高清| 国产在线精品一区在线观看麻豆| 特黄特色欧美大片| 亚洲羞羞网站| 午夜视频免费在线观看| 国产视频在线观看网站| 亚洲一区美女视频在线观看免费| 日韩最新免费不卡| 欧美日韩中文另类| 亚洲男女毛片无遮挡| 成人丝袜高跟foot| 国产精品一国产精品k频道56| 青青草原在线亚洲|