原创 使用CreateProcess創建進程

// TestCreateProcess.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <W

原创 移動重定位表到新增節

一、爲什麼要移動重定位表 數據目錄中的表是分散在各個節裏的,如果對節進行加密,操作系統找不到表,就無法加載程序。因此加密前要先把表移動到新的節裏。 二、怎麼移動 計算重定位表的大小,首先要遍歷重定位表,累加 SizeOfBlock

原创 操作系統是如何使用重定位表的

一、重定位表的結構 重定位表是數據目錄中第6項,它的結構如圖示: 重定位表由多個塊(block)組成,每個塊內部由三部分組成——VirtualAddress、SizeOfBlock 和若干個2字節偏移。SizeOfBlock 表

原创 導入表注入原理和C語言實現

一、導入表注入的原理 注入是把DLL加載到另一個進程的4GB地址空間中,實現方式有很多種,導入表注入是我學的第一種注入,是通過修改程序的導入表,把自己的DLL添加到導入表中,來實現這個目的。 導入表是連續存儲在節裏的,它後面還有其

原创 移動導出表到新增節

一、爲什麼要移動導出表 移動導出表是指將導出表以及其內部的三張子表移動到新增節,這個操作是軟件加密的第一步。因爲軟件加密會把節進行加密,而數據目錄是在節裏的,加密後操作系統不認識了,因此我們要把數據目錄裏面的東西移動到一個新的節裏

原创 win32線程學習總結(臨界區,互斥體,事件,信號量)

一、臨界區 CRITICAL_SECTION 例程 https://blog.csdn.net/Kwansy/article/details/106485496 臨界區用於資源互斥訪問,性能比互斥體好。 二、互斥體 mutex 例

原创 掛起方式創建進程

創建進程除了用 CREATE_NEW_CONSOLE,還可以用掛起的方式創建,CREATE_SUSPENDED // TestCreateSuspended.cpp : Defines the entry point for th

原创 SECURITY_ATTRIBUTES 句柄繼承

調用 CreateProcess 創建進程時,可以讓子進程繼承父進程句柄表中可以被繼承的內核對象。 一個內核對象能夠被繼承,必須在創建時通過 SECURITY_ATTRIBUTES 結構指定可繼承;另一個條件是 CreatePr

原创 CreateProcess返回錯誤998

解決方法:將 STARTUPINFO 初始化爲0,cb設置爲 sizeof(STARTUPINFO)

原创 創建可繼承的進程

本文演示如何通過 CreateProcess 創建一個進程句柄和主線程句柄可以被繼承的子進程。 BOOL CreateProcess( LPCTSTR lpApplicationName, //

原创 WIN32 多線程喫字母練習

題目大意 有1個資源區,2個緩衝區(大小爲1),4個喫貨,總共有5個線程,其中一個線程從資源區取字母放到緩衝區,哪個緩衝區是空的就往哪放;4個喫貨線程,從緩衝區喫字母。 該題目要求實現對緩衝區的互斥訪問,緩衝區和資源區必須滿足“

原创 win32 實現死鎖的小例子

死鎖的一種情況是兩個線程競爭兩個鎖,需要同時拿到兩個鎖才能執行,然後出現了兩個線程各拿一個鎖的情況,這樣兩個線程就都無法繼續執行,稱爲死鎖。 避免死鎖的方法有很多,有預防死鎖,出現死鎖後通過某些方法釋放鎖等。 下面是一個死鎖的小例

原创 windows結束線程的三種方式

windows 結束線程有三種方式 一、讓線程函數執行到 return 二、在線程函數內調用 ExitThread 三、調用 TerminateThread 其中前兩種方式比較類似,它們都是通過修改某個變量來達到改變子線程執行流程

原创 WIN32多線程搶紅包練習

第一個文本框是獎池,右面三個文本框是三個線程搶到的紅包數,程序運行結果如下: 解決資源搶佔問題,WIN32提供兩種方式:臨界區和互斥體。 臨界區和互斥體的對比: 1、臨界區只能應用於單個進程間的線程控制,互斥體可以跨進程; 2

原创 WIN32 使用 MUTEX 實現禁止多開

WIN32 互斥體 MUTEX 可以跨進程獲取,因此可以用它實現簡易的防多開,進程啓動時嘗試獲取 MUTEX,如果獲取失敗說明沒有多開,如果獲取成功,則提示錯誤信息。 下面是執行結果: 第一個程序已經在運行: 如果嘗試多開,則會