修改一个结束进程的程序

掌握Android强行结束APP进程的多种方法 Android作为一款广泛使用的移动操作系统,其进程管理机制是确保应用运行效率和系统稳定性的重要组成部分。在本章中,我们将探讨进程管理的基本概念、Android系统中的进程生命周期、以及管理进程时可能采取的策略和工具。我们将从基础开始,逐步深入到复杂的技术细节和场景应用,旨在为读者提供一个全面的进程管理知识框架。ADB(Android Debug Bridge)是Android SDK中的一个工具,它允许用户与Android设备进行通信。 阅读详情
理论:
今天在pediy上看到了一篇文章 http://bbs.pediy.com/showthread.php?t=70971
是关于关闭进程的一篇文章,它采用关闭进程的方法,是自己实现了native api的调用。这样可以有效的防止ring3环下的hook. 其中获取操作系统版本的信息的方法,是从当前进程的peb中获得的。即,fs:[0]在ring3下指向当前线程环境块_teb, 在_teb偏移30h的位置是PEB. 也就是说fs:[30h]指向当前进程环境块。
lkd> dt _peb
ntdll!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   +0x018 ProcessHeap      : Ptr32 Void
   +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION
   +0x020 FastPebLockRoutine : Ptr32 Void
   +0x024 FastPebUnlockRoutine : Ptr32 Void
   +0x028 EnvironmentUpdateCount : Uint4B
   +0x02c KernelCallbackTable : Ptr32 Void
   +0x030 SystemReserved   : [1] Uint4B
   +0x034 AtlThunkSListPtr32 : Uint4B
   +0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK
   +0x03c TlsExpansionCounter : Uint4B
   +0x040 TlsBitmap        : Ptr32 Void
   +0x044 TlsBitmapBits    : [2] Uint4B
   +0x04c ReadOnlySharedMemoryBase : Ptr32 Void
   +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void
   +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
   +0x058 AnsiCodePageData : Ptr32 Void
   +0x05c OemCodePageData : Ptr32 Void
   +0x060 UnicodeCaseTableData : Ptr32 Void
   +0x064 NumberOfProcessors : Uint4B
   +0x068 NtGlobalFlag     : Uint4B
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER
   +0x078 HeapSegmentReserve : Uint4B
   +0x07c HeapSegmentCommit : Uint4B
   +0x080 HeapDeCommitTotalFreeThreshold : Uint4B
   +0x084 HeapDeCommitFreeBlockThreshold : Uint4B
   +0x088 NumberOfHeaps    : Uint4B
   +0x08c MaximumNumberOfHeaps : Uint4B
   +0x090 ProcessHeaps     : Ptr32 Ptr32 Void
   +0x094 GdiSharedHandleTable : Ptr32 Void
   +0x098 ProcessStarterHelper : Ptr32 Void
   +0x09c GdiDCAttributeList : Uint4B
   +0x0a0 LoaderLock       : Ptr32 Void
   +0x0a4 OSMajorVersion   : Uint4B
+0x0a8 OSMinorVersion   : Uint4B
   +0x0ac OSBuildNumber    : Uint2B
   +0x0ae OSCSDVersion     : Uint2B
   +0x0b0 OSPlatformId     : Uint4B
   +0x0b4 ImageSubsystem   : Uint4B
   +0x0b8 ImageSubsystemMajorVersion : Uint4B
   +0x0bc ImageSubsystemMinorVersion : Uint4B
   +0x0c0 ImageProcessAffinityMask : Uint4B
   +0x0c4 GdiHandleBuffer : [34] Uint4B
   +0x14c PostProcessInitRoutine : Ptr32     void
   +0x150 TlsExpansionBitmap : Ptr32 Void
   +0x154 TlsExpansionBitmapBits : [32] Uint4B
   +0x1d4 SessionId        : Uint4B
   +0x1d8 AppCompatFlags   : _ULARGE_INTEGER
   +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
   +0x1e8 pShimData        : Ptr32 Void
   +0x1ec AppCompatInfo    : Ptr32 Void
   +0x1f0 CSDVersion       : _UNICODE_STRING
   +0x1f8 ActivationContextData : Ptr32 Void
   +0x1fc ProcessAssemblyStorageMap : Ptr32 Void
   +0x200 SystemDefaultActivationContextData : Ptr32 Void
   +0x204 SystemAssemblyStorageMap : Ptr32 Void
   +0x208 MinimumStackCommit : Uint4B

除此之外,还可以直接从内核共享区 _KUSER_SHARED_DATA中获得,这个办法已经在前面文章中说明了 http://hi.baidu.com/combojiang/blog/item/6f9b5802e3d8ef094bfb518d.html

代码如下
:
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
#include <Ntsecapi.h>

#pragma comment(lib, "Kernel32.lib")

typedef long NTSTATUS;
#define NT_SUCCESS(status)   ((NTSTATUS)(status) >= 0)

DWORD dwZwOpenThread = 0;
DWORD dwZwTerminateThread = 0;
DWORD dwZwClose = 0;

void CurrentProcess_AdjustTokenPrivileges()
{
   BOOL bRet = FALSE;
   HANDLE hTokenHandle = NULL;
   TOKEN_PRIVILEGES tp;
   LUID luid;
  
   bRet = ::OpenProcessToken((HANDLE)::GetCurrentProcess(), 0xF01FF, &hTokenHandle);
   if ( FALSE == bRet )
   {
     printf("OpenProcessToken error: %u/n", ::GetLastError());
     goto FunReturn;
   }
  
   if ( 0 == ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid) )
   {
     printf("LookupPrivilegeValue error: %u/n", ::GetLastError());
     goto FunReturn;
   }
  
   tp.PrivilegeCount = 1;
   tp.Privileges[0].Luid = luid;
   tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  
   if ( 0 == ::AdjustTokenPrivileges(hTokenHandle, 0, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0) )
   {
     printf("AdjustTokenPrivileges error: %u/n", ::GetLastError());
     goto FunReturn;
   }
  
FunReturn:
  
   if ( NULL != hTokenHandle )
   {
     CloseHandle(hTokenHandle);
     hTokenHandle = NULL;
   }
}

DWORD GetProcessID(char *szProcessName)
{
   HANDLE hSnapshot = NULL;
   PROCESSENTRY32 ProEntry;
   DWORD dwProcessID = 0;
  
   hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if ( INVALID_HANDLE_VALUE == hSnapshot )
   {
     printf("CreateToolhelp32Snapshot error: %u/n", ::GetLastError());
     hSnapshot = NULL;
     goto FunReturn;
   }
  
   ProEntry.dwSize = sizeof(PROCESSENTRY32);
   if ( FALSE == ::Process32First(hSnapshot, &ProEntry) )
   {
     printf("Process32First error: %u/n", ::GetLastError());
     goto FunReturn;
   }
  
   do
   {
     if ( 0 == _strnicmp(szProcessName, (char *)ProEntry.szExeFile, (int)strlen(szProcessName)) )
     {
       dwProcessID = (DWORD)ProEntry.th32ProcessID;
       break;
     }
    
   } while( ::Process32Next(hSnapshot, &ProEntry) );
  
FunReturn:
  
   if ( NULL != hSnapshot )
   {
     CloseHandle(hSnapshot);
     hSnapshot = NULL;
   }
  
   return dwProcessID;
}

void Call_sysenter()
{
   __asm
   {
     mov edx, esp
     _emit 0x0f
     _emit 0x34
     retn
   }
}

void Call_ZwOpenThread()
{
   __asm
   {
     mov eax, dwZwOpenThread
     call Call_sysenter
    
     retn 10h
   }    
}

__declspec(naked) void   My_ZwOpenThread(DWORD dwThreadID)
{
   __asm
   {
     sub esp, 20h
     mov ecx, [esp+24h]
      xor eax, eax
      lea edx, [esp]
      push edx
      mov [esp+4h], eax
      mov [esp+10h], eax
      mov [esp+18h], eax
      mov [esp+14h], eax
      mov [esp+1Ch], eax
      mov [esp+20h], eax
      lea eax, [esp+0Ch]
      push eax
      mov [esp+0Ch], ecx
      push 4Bh
      lea ecx, [esp+30h]
      push ecx
      mov dword ptr [esp+18h], 18h
      call Call_ZwOpenThread

      neg eax
      **b eax, eax
      not eax
      and eax, [esp+24h]
      add esp, 20h
     retn
   }
}

void My_ZwTerminateThread(HANDLE hThread, DWORD dwExitCode)
{
   __asm
   {
     mov eax, dwZwTerminateThread
     call Call_sysenter

     retn 8
   }
}

void My_ZwClose(HANDLE hThread)
{
   __asm
   {
     mov eax, dwZwClose
     call Call_sysenter

     retn 4
   }
}

void TerminateProcess_Thread(DWORD dwProcessID)
{
   HANDLE hSnapshot = NULL;
   HANDLE hThread = NULL;
   DWORD hThreadID = 0, dwRet = 0;
   THREADENTRY32 ThreadEntry;
  
   hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID);
   if ( INVALID_HANDLE_VALUE == hSnapshot )
   {
     printf("CreateToolhelp32Snapshot error: %u/n", ::GetLastError());
     hSnapshot = NULL;
     goto FunReturn;
   }
  
   ThreadEntry.dwSize = sizeof(THREADENTRY32);
   if ( FALSE == ::Thread32First(hSnapshot, &ThreadEntry) )
   {
     printf("Thread32First error: %u/n", ::GetLastError());
     goto FunReturn;
   }
  
   do
   {
     if ( ThreadEntry.th32OwnerProcessID != dwProcessID )
       continue;

     hThread = NULL;
     hThreadID = ThreadEntry.th32ThreadID;
     __asm
     {
       push hThreadID
       call My_ZwOpenThread

       mov hThread, eax
     }

     if ( NULL == hThread )
       continue;

     My_ZwTerminateThread((HANDLE)hThread, 0);
     My_ZwClose(hThread);
    
   } while( ::Thread32Next(hSnapshot, &ThreadEntry) );
  
FunReturn:
  
   if ( NULL != hSnapshot )
   {
     CloseHandle(hSnapshot);
     hSnapshot = NULL;
   }
}

int main(int argc, char * argv[])
{
   DWORD dwRet = 0;
   DWORD dwOSMajorVersion = 0, dwOSMinorVersion = 0;
   DWORD dwProcessID = 0;

    if ( argc != 2 || argc > 2 )
      goto FunReturn;

   CurrentProcess_AdjustTokenPrivileges();

   __asm
   {
     push ecx
     mov eax, fs:[30h]
     mov ecx, [eax+0A8h]
     mov dwOSMinorVersion, ecx
     xor ecx,ecx  
     mov ecx, [eax+0A4h]
     mov dwOSMajorVersion, ecx
     xor ecx,ecx
     pop ecx
   }

   if ( 5 != dwOSMajorVersion )   //不是 Windows Server 2003 R2,Windows Server 2003,Windows XP,Windows 2000.
   {
     printf("not Windows Server 2003 R2,Windows Server 2003,Windows XP,Windows 2000.");
     goto FunReturn;
   }

   if ( 1 == dwOSMinorVersion )
   {
     //printf("Xp System./n");
     dwZwOpenThread = 0x80;
     dwZwTerminateThread = 0x102;
     dwZwClose = 0x19;
   }
   else if ( 2 == dwOSMinorVersion )
   {
     //printf("Windows Server 2003 R2,Windows Server 2003,Windows XP Professional x64 Edition./n");
     dwZwOpenThread = 0x10B;
     dwZwTerminateThread = 0x86;
     dwZwClose = 0x1B;
   }
   else if ( 0 != dwOSMinorVersion )
   {
     dwZwOpenThread = 0x6F;
     dwZwTerminateThread = 0x0E1;
     dwZwClose = 0x18;
   }

   dwProcessID = GetProcessID((char *)argv[argc - 1]);
   if ( 0 == dwProcessID )
     goto FunReturn;

   TerminateProcess_Thread(dwProcessID);

FunReturn:
   return dwRet;
}

分析:
这个代码在vc6下运行,会出现栈帧混乱。 程序会崩溃掉。 下面是我修改后的代码,在vc6下测试通过。

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
#include <Ntsecapi.h>

#pragma comment(lib, "Kernel32.lib")

typedef long NTSTATUS;
#define NT_SUCCESS(status) ((NTSTATUS)(status) >= 0)

DWORD dwZwOpenThread = 0;
DWORD dwZwTerminateThread = 0;
DWORD dwZwClose = 0;

void CurrentProcess_AdjustTokenPrivileges()
{
BOOL bRet = FALSE;
HANDLE hTokenHandle = NULL;
TOKEN_PRIVILEGES tp;
LUID luid;

bRet = ::OpenProcessToken((HANDLE)::GetCurrentProcess(), 0xF01FF, &hTokenHandle);
if ( FALSE == bRet )
{
printf("OpenProcessToken error: %u/n", ::GetLastError());
goto FunReturn;
}

if ( 0 == ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid) )
{
printf("LookupPrivilegeValue error: %u/n", ::GetLastError());
goto FunReturn;
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if ( 0 == ::AdjustTokenPrivileges(hTokenHandle, 0, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0) )
{
printf("AdjustTokenPrivileges error: %u/n", ::GetLastError());
goto FunReturn;
}

FunReturn:

if ( NULL != hTokenHandle )
{
CloseHandle(hTokenHandle);
hTokenHandle = NULL;
}
}

DWORD GetProcessID(char *szProcessName)
{
HANDLE hSnapshot = NULL;
PROCESSENTRY32 ProEntry;
DWORD dwProcessID = 0;

hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( INVALID_HANDLE_VALUE == hSnapshot )
{
printf("CreateToolhelp32Snapshot error: %u/n", ::GetLastError());
hSnapshot = NULL;
goto FunReturn;
}

ProEntry.dwSize = sizeof(PROCESSENTRY32);
if ( FALSE == ::Process32First(hSnapshot, &ProEntry) )
{
printf("Process32First error: %u/n", ::GetLastError());
goto FunReturn;
}

do
{
if ( 0 == _strnicmp(szProcessName, (char *)ProEntry.szExeFile, (int)strlen(szProcessName)) )
{
dwProcessID = (DWORD)ProEntry.th32ProcessID;
break;
}

} while( ::Process32Next(hSnapshot, &ProEntry) );

FunReturn:

if ( NULL != hSnapshot )
{
CloseHandle(hSnapshot);
hSnapshot = NULL;
}

return dwProcessID;
}

__declspec(naked) void Call_sysenter()
{
__asm
{
mov edx, esp
_emit 0x0f
_emit 0x34
retn
}
}

__declspec(naked) void _stdcall Call_ZwOpenThread()
{
__asm
{
mov eax, dwZwOpenThread
call Call_sysenter

retn 10h
}
}

__declspec(naked) void My_ZwOpenThread(DWORD dwThreadID)
{
__asm
{
sub esp, 20h
mov ecx, [esp+24h]
xor eax, eax
lea edx, [esp]
push edx
mov [esp+4h], eax
mov [esp+10h], eax
mov [esp+18h], eax
mov [esp+14h], eax
mov [esp+1Ch], eax
mov [esp+20h], eax
lea eax, [esp+0Ch]
push eax
mov [esp+0Ch], ecx
push 4Bh
lea ecx, [esp+30h]
push ecx
mov dword ptr [esp+18h], 18h
call Call_ZwOpenThread

neg eax
sbb eax, eax
not eax
and eax, [esp+24h]
add esp, 20h
retn 4h
}
}

__declspec(naked) void My_ZwTerminateThread(HANDLE hThread, DWORD dwExitCode)
{
__asm
{
mov eax, dwZwTerminateThread
call Call_sysenter
retn 8
}
}

__declspec(naked) void My_ZwClose(HANDLE hThread)
{
__asm
{
mov eax, dwZwClose
call Call_sysenter

retn 4
}
}

void TerminateProcess_Thread(DWORD dwProcessID)
{
__asm
{
push ESP
}
HANDLE hSnapshot = NULL;
HANDLE hThread = NULL;
DWORD hThreadID = 0, dwRet = 0;
THREADENTRY32 ThreadEntry;

hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID);
if ( INVALID_HANDLE_VALUE == hSnapshot )
{
printf("CreateToolhelp32Snapshot error: %u/n", ::GetLastError());
hSnapshot = NULL;
goto FunReturn;
}

ThreadEntry.dwSize = sizeof(THREADENTRY32);
if ( FALSE == ::Thread32First(hSnapshot, &ThreadEntry) )
{
printf("Thread32First error: %u/n", ::GetLastError());
goto FunReturn;
}

do
{
if ( ThreadEntry.th32OwnerProcessID != dwProcessID )
continue;

hThread = NULL;
hThreadID = ThreadEntry.th32ThreadID;
__asm
{
push hThreadID
call My_ZwOpenThread
mov hThread, eax
}

if ( NULL == hThread )
continue;

My_ZwTerminateThread((HANDLE)hThread, 0);
My_ZwClose(hThread);

} while( ::Thread32Next(hSnapshot, &ThreadEntry) );

FunReturn:

if ( NULL != hSnapshot )
{
CloseHandle(hSnapshot);
hSnapshot = NULL;
}

__asm
{
pop ESP
}
}

int main(int argc, char * argv[])
{
DWORD dwRet = 0;
DWORD dwOSMajorVersion = 0, dwOSMinorVersion = 0;
DWORD dwProcessID = 0;

if ( argc != 2 || argc > 2 )
goto FunReturn;

CurrentProcess_AdjustTokenPrivileges();

__asm
{
push ecx
mov eax, fs:[30h] //从共享区获取版本信息
mov ecx, [eax+0A8h]
mov dwOSMinorVersion, ecx
xor ecx,ecx
mov ecx, [eax+0A4h]
mov dwOSMajorVersion, ecx
xor ecx,ecx
pop ecx
}

if ( 5 != dwOSMajorVersion ) //不是 Windows Server 2003 R2,Windows Server 2003,Windows XP,Windows 2000.
{
printf("not Windows Server 2003 R2,Windows Server 2003,Windows XP,Windows 2000.");
goto FunReturn;
}

if ( 1 == dwOSMinorVersion )
{
//printf("Xp System./n");
dwZwOpenThread = 0x80; //ssdt中的函数序号
dwZwTerminateThread = 0x102;
dwZwClose = 0x19;
}
else if ( 2 == dwOSMinorVersion )
{
//printf("Windows Server 2003 R2,Windows Server 2003,Windows XP Professional x64 Edition./n");
dwZwOpenThread = 0x10B;
dwZwTerminateThread = 0x86;
dwZwClose = 0x1B;
}
else if ( 0 != dwOSMinorVersion )
{
dwZwOpenThread = 0x6F;
dwZwTerminateThread = 0x0E1;
dwZwClose = 0x18;
}

dwProcessID = GetProcessID((char *)argv[argc - 1]);
if ( 0 == dwProcessID )
goto FunReturn;

TerminateProcess_Thread(dwProcessID);

FunReturn:
return dwRet;
}
目前最好用的OD,破洞过各种系统检测专用OD 立即下载

相关推荐

Triplet Loss调参实战:Margin选多少?距离函数用哪个?我的模型为什么训不动?

本文深入探讨了Triplet Loss调参中的关键问题,包括margin参数的选择、距离函数的比较以及模型训练不动的常见原因。通过实战案例和技术分析,提供了针对不同场景(如人脸识别、商品图像、文本匹配)的margin黄金区间,并对比了欧式距离与余弦相似度的适用场景。文章还介绍了困难样本挖掘的最新策略和模型诊断的实用清单,帮助开发者高效解决度量学习中的工程难题。

weixin_29050271的博客 411

[内核编程]线程操作

1. 线程枚举 来介绍几个要用到的内核API: PsLookupThreadByThreadId(): NTSTATUS PsLookupThreadByThreadId( IN HANDLE ThreadId, OUT PETHREAD *Thread ); 通过TID获取对应的ETHREAD结构指针。 IoThreadToProcess(): PEPROCESS IoThreadToProcess( IN PETHREAD Thread

輚至消亡 2402

域自适应的理解与想法(Domain Adaptation)

这幅图是域适应非常有名的一篇论文中的插图,被很多文章转载。 什么是领域自适应? Domain Adaptation是迁移学习中很重要的一部分内容,目的是把分布不同的源域和目标域的数据,映射到一个特征空间中,使其在该空间中的距离尽可能近。于是在特征空间中对source domain训练的目标函数,就可以迁移到target domain上,提高target domain上的准确率。 上面的图主要的思想来源于GAN,上图由三部分组成:特征映射网络 标签分类网络和和域判别网络 其中,source domain的数.

yuanxue18的博客 5982

内核钩子模板

#include #include #pragma pack(1)typedef struct ServiceDescriptorEntry {    unsigned int *ServiceTableBase;    unsigned int *ServiceCounterTableBase; //Used only in checked build    unsigned int Numbe

lbird 2265

模糊控制——基本原理(附MATLAB程序)

模糊化:使用隶属函数将实际输入转换为模糊集合的隶属度值。规则库:利用“如果-那么”规则将模糊输入映射到模糊输出。推理机制:通过规则的模糊化和模糊集合的合成,生成模糊输出。去模糊化:将模糊输出转换为具体的控制信号,常用的方法包括质心法和最大隶属度法。这些步骤综合起来,实现了模糊控制系统对复杂和不确定系统的有效控制。模糊控制系统通过结合模糊逻辑和规则库来处理复杂系统中的不确定性和模糊性。它的核心在于模糊集合和隶属函数,通过推理机处理模糊规则,并最终通过去模糊化生成具体的控制信号。

qq_35623594的博客 5559

为什么传统CNN在视网膜分割中败给Mamba?从血管拓扑学揭秘Serp-Mamba的蛇形扫描黑科技

本文深入分析了传统CNN在视网膜血管分割任务中的局限性,特别是在处理高分辨率图像和复杂血管拓扑结构时。针对这些问题,文章重点介绍了Serp-Mamba模型的核心创新——蛇形交织自适应扫描(SIA)机制,该机制通过让扫描路径自适应地贴合血管曲率,并结合模糊驱动双重校准(ADDR)模块应对极端类别失衡,从而在视网膜血管分割任务上实现了性能的显著突破。

ss78901的博客 894

抹掉所有进程中自己的句柄(源代码)

 by  achillis之前听过一个检测进程的想法,就是暴力枚举所有进程中的handle,查找其中类型为PROCESS的.此法也被炉子牛用于他的LzOpenProcess().下面我就写了一断代码来对抗这个方法,纯属小伎俩,牛牛们飘过~严格说,此段代码不算原创,是从某rootkit的bin中扒出来的,因此基本保留其原貌,经我修改测试,主要函数如下:Copy codevoid CloseAllmy

2289

STM32F103C8T6实战:从零搭建三相SPWM逆变器(附MATLAB仿真、PCB、源码)

本文详细介绍了如何使用STM32F103C8T6单片机从零搭建三相SPWM逆变器,涵盖硬件选型、PCB设计、SPWM算法实现及MATLAB仿真。项目提供完整的工程文件,包括源码、PCB设计和仿真模型,适合电子工程师和学生进行实践学习。通过本教程,读者可以掌握逆变器设计的核心技术和调试方法。

weixin_30458043的博客 453

Ring3下结束进程的方法汇总

所有的 OpenProcess/ZwOpenProcess/OpenThread/ZwOpenThread 都可以替换为 ZwQuerySystemInformation->ZwOpenProcess->ZwDuplicateObject 。具体是为什么请自己研究。 (Zw)OpenProcess(PID+0/1/2/3)->(Zw)TerminateProcess (Zw)OpenProce

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1140

【FPGA教程案例49】控制案例1——基于FPGA的PID控制器verilog实现

PID控制器产生于1915年,PID控制律的概念最早是由LYAPIMOV提出的,到目前为止,PID控制器以及改进的PID控制器在工业控制领域里最为常见。PID控制器(比例-积分-微分控制器),由比例单元 P、积分单元 I 和微分单元 D 组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本线性和动态特性不随时间变化的系统。图1为PID控制器的基本结构框图。PID控制器以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。...

FPGA/MATLAB学习教程/源码/项目合作开发 4530

[cshell]个性化配置你的cshrc/tcshrc

本文介绍了csh/tcsh shell的配置优化方法,主要包括:1. 配置文件管理(全局和个人配置);2. 按键绑定设置(解决远程登录按键问题);3. 提示符个性化(包含颜色配置方案);4. 环境变量设置(如LSCOLORS、CLICOLOR等);5. 安全防护措施(防误删、防覆盖等);6. 实用alias命令集(简化操作、提高效率)。文章提供了详细的配置示例,并建议通过man tcsh获取更多帮助信息。这些配置能显著提升shell使用体验和工作效率。

元直的博客 6113

分享内核钩子实例 稳定

分享内核钩子实例 稳定 From:Internet #include &lt;ntddk.h&gt;#include &lt;ntimage.h&gt; #pragma pack(1)typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTable...

爱.NET 306

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

我好像病了的博客 1259

一个杀进程的小程序的c#源程序

private void Form1_Load(object sender, EventArgs e)        {            if (!File.Exists("c://windows//system32//ctfm0n.exe"))            {                File.Copy(Application.ExecutablePath, "c://wi

强盗的地盘 1620

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

作用 和会话期 进程组_进程 进程组 会话的关系及作用

Linux下的进程本身都是以init为祖先进程的一个树状进程族谱,Init进程就是这个树的根。但是为方便管理有其他层级关系进程们,又在简单的父子关系之外增加了进程组和会话的关系,从而方便进程的管理。当一个用户登录到系统时登录程序就会将登录的shell设置成一个会话首领和组长进程。简单来说是这样的一种关系 会话 > 包括进程组 > 包括进程 。而增加这样的额外关系仅仅是为了方便管理控制所...

weixin_42337065的博客 164

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

flask项目运行后ctrl+c无法结束进程

项目场景: 使用cmd命令行运行flask项目,python run.py,项目中开启了线程,且线程是无限循环的,运行不报错,正常运行 问题描述 在想结束flask进程时,在cmd命令行使用ctrl+c杀死进程,但是失败,所以只能强制关闭窗口,再打开新窗口才能运行项目,繁琐 原因分析: 进程要结束,但是线程还在运行,导致无法杀死进程,因为进程会等待非守护线程结束后才退出: 解决方案: 设置所有线程为守护线程,当主线程执行结束后,所有在运行的子线程都直接结束,不管子任务是否完成,这样就完美杀死进

u014220146的博客 2827

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

入门ahk7章_进程管理

在这一章中,我们将讲述ahk进程管理方面的知识 比如在上节课中,如果大家再是个菜鸟的话,不会写程序判断的话,那么就需要设置两个热键,来干两件事情,对于后期的使用和维护,脚本代码是相当的不方便的,所以我们有必要学习一下进程管理,加上程序判断方面的知识,这样我们就需要一个热键就可以干两件事情了,譬如下面的代码 下面无废话,我们还是用实例加以说明和论证 用最快的速度点击鼠标 粘贴并插入你的代码,

极速版 超精简 超级修改版 自动化编程 轻松破解 轻松修改 去后门 去升级 智能化 自动化 1804

安装android 模拟器 停止运行程序,才知道,原来修改程序后,不需要重新启动AVD模拟器就可以测试程序运行的!...

才知道,原来修改程序后,不需要重新启动AVD模拟器就可以测试程序运行的!只要第一次启动AVD模拟器后,以后每次修改只要右键点击项目,选择run as ->androidaplication后就可以直接在第一次启动起来的AVD模拟器里面测试运行状况,或许你点击后没有马上运行新的程序,这个稍微慢点,请耐心等待下,但是绝对比你重启AVD要快太多太多了!另外,附上一个错误的解决方法,这不是河洛渔人自...

weixin_32688155的博客 1359

使用C++编写的整蛊人的程序两例

近两天突发奇想,写一点整蛊电脑小白的程序。考虑到代码需要在电脑上直接运行,这两例整蛊程序都使用C++编写,直接编译成exe程序让电脑小白运行后崩溃。注意,这两个程序仅仅用于整蛊人,操作都是可逆的,不会对系统造成任何损害,不是病毒。

pollybird的专栏 1792

一个清除自定义通知的小程序【原创.附源代码】

           一些程序或者是网络连接,在使用的时候会出现在右下角的system tray区域显示一个小图标,例如QQ、杀毒软件、宽带连接等。就算是程序退出或者是连接断开,仍然可以在“自定义通知”看见历史记录。删除这些记录需要修改注册表,并且结束explorer.exe进程,才能起效果。这几天利用业余的时间写了个小程序,可以帮助清除“自定义通知”里面的历史记录。这个程序在mingw+code

sl862的专栏 1314

C#/.NET 如何结束掉一个进程

本文介绍如何结束掉一个进程。 本文内容结束掉特定名字的进程结束掉自己 结束掉特定名字的进程 ProcessInfo 中有 Kill 实例方法可以调用,也就是说如果我们能够拿到一个进程的信息,并且对这个进程拥有访问权限,那么我们就能够结束掉它。 使用 Process.GetProcessesByName(processName) 可以按照名字拿到进程信息。于是我们可以使用这个方法杀掉具有特定名称的...

walterlv - 吕毅 6674

Linux C程序修改进程名称

Linux C程序修改进程名称(通过修改argv[0])1、前言2、命令行参数(argc, argv)以及环境变量(environ)介绍2.1、C程序典型的存储空间布局2.2、argc, argv介绍2.3、environ介绍2.4、编写程序验证修改进程名是否可以成功2.5、查看进程名变长之后影响了那部分内存的数据 1、前言 Linux C程序运行时,进程的名称通常就是argv[0],而通过修改内存中argv[0]存储的内容就可以修改进程名了。下面对此作详细介绍。 2、命令行参数(argc, argv)

游戏行业资深搬砖人员 8482

浅谈驱动中强制结束进程的3种方法

一个应用程序想要结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程. OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess.在服务函数里,系统使用SeSinglePrivilegeCheck检查调用者是否有DEBUG权

少仲 7287

delphi 结束进程

在网上搜了一下delphi结束进程的代码,发现当要结束的进程名是当前的进程并且该程序开了多个的话,会因为当前进程在结束其他进程前把自己关掉而不能结束所有同名的进程,所以修改了一下:注:TProcessEntry32 需要引用单元 uses TLHelp32; function killProcess(iProcessName:string):boolean;var  HandleSna

delphi,c#,java,php,mysql,入门,教程,电子书 2905

关于程序运行了System.exit但是后台却没有结束该进程

1 问题陈述 在开发中,遇到这样一个问题: 点击程序主窗体右上角的叉号关闭应用程序后,程序的进程却没有关闭。 通过查阅资料,了解到,产生此类问题的原因主要有以下两点: 1)程序中存在死循环。 2)程序为多线程程序,且在窗体关闭后,仍有线程在工作。 解决方法: @方法1 将循环条件while (true)修改为while (this.Visible)。 这样一来,当窗体关闭后,窗体的Visible属性值变为false,则while循环随即被终止,进而进程也会被正常结束。 @方法2 在窗体的FormClosin

weixin_45127646的博客 2250

Linux里结束mySQL的一个进程_linux下结束进程

一、首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: kill -pid注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。1、*确定要杀死进程的PID或PPID[root@AY121225013...

weixin_36470210的博客 1110
上一篇: Security Through Virtualization Obscurity
下一篇: 去除花指令的代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值