|
楼主 |
发表于 2013-11-5 13:24:23
|
显示全部楼层
下面是对进程的一些了解
#include<stdio.h>
#include<windows.h>
#include<Error.h>
#include<Psapi.h>//包含进程状态的api头文件
#include<Tlhelp32.h>//包含运行的程序的程序信息函数文件
#define ID_BUTTON1 1
#define buff MAX_PATH
#define TYPE_LEVEL 0x1
#define TYPE_VETRICAL 0x2
DWORD buffs[1024];
DWORD size;
int d=0;
struct jiegou
{
int x;
int y;
}JG;
DWORD writeprocessmemory(HANDLE hp,DWORD zhi);
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi);
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints);
BOOL processheap(DWORD pid);
BOOL EnablePrivilege(LPSTR lp);
void modulefirst(LPVOID lp);
void getEnumprocessid();
void Firstprocessid(LPVOID lp);
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type);
LRESULT CALLBACK WinProc(HWND ,UINT ,WPARAM ,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HDC hdc;
MSG msg;
HWND hwnd;
WNDCLASSEX wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbSize=sizeof(wc);
wc.lpfnWndProc=WinProc;
wc.hInstance=hInstance;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hIcon=NULL;
wc.hIconSm=NULL;
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(2);
wc.lpszClassName="window";
wc.lpszMenuName=NULL;
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,"注册窗口失败","ERROR",MB_OK);
}
hdc=CreateDC("DISPLAY",NULL,NULL,NULL);
JG.x=GetDeviceCaps(hdc,8);
JG.y=GetDeviceCaps(hdc,10);
hwnd=CreateWindow("window","window",WS_OVERLAPPEDWINDOW,JG.x/2-200,JG.y/2-200,400,400,NULL,NULL,hInstance,NULL) ;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message ,WPARAM wparam,LPARAM lparam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
int x,y;
HWND hbutton1;
switch(message)
{
case WM_CREATE:
GetClientRect(hwnd,&rect);
x=rect.right;
y=rect.bottom;
hbutton1=CreateWindow("button","按钮1",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,x/2-20,y-20,40,20,hwnd,(HMENU)ID_BUTTON1,((LPCREATESTRUCT)lparam)->hInstance,NULL);break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
/* code位置 */
/* ↓ */
//processheap(3048);
//getEnumprocessid();
//Firstprocessid("360tray.exe");
//modulefirst("Psapi.dll");
/* ↑ */
/* code数位置 */
EndPaint(hwnd,&ps);
break;
case WM_COMMAND:
switch(LOWORD(wparam))
{
case ID_BUTTON1:
/* code位置 */
/* ↓ */
Readprocessmemory("模板.exe",(DWORD)'M',(DWORD)'S');
/* ↑ */
/* code数位置 */
InvalidateRect(hwnd,NULL,TRUE);
break;
};
break;
case 0x2:
PostQuitMessage(0); break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
//PS API是获取进程状态信息的一系列API的合称,这些API在Psapi.h头文件中定义 Psapi.dll
//Tool help api提供呢用于获取执行中的应用程序信息,一般情况下可以与PS API配合使用,Tool help API 由Tlhelp.h头文件定义,Kerenl32,DLL
//获得所有进程的所有进程名和进程的所有模块路径
void getEnumprocessid()
{
int x,y=0, m,k;
HWND hwnd;
HDC hdc;
DWORD pid[MAX_PATH],ints,me;
HANDLE hProcess;
HMODULE module[MAX_PATH];
//参数1为保持进程ID的数组
//2为数组大小
//写入的数据大小
hwnd=FindWindow("window","window");//查找指定的窗口,得到窗口句柄,此处是查找自己的
hdc=GetDC(hwnd);//获得窗口句柄的DC设备
if(EnablePrivilege("SE_DEBUG_NAME"))//提升权限
MessageBox(NULL,"特权令牌失败","error",MB_OK);
EnumProcesses(pid,MAX_PATH,&ints);//获得系统中所有进程PID,注意参数3为写入的数据大小
x=ints/sizeof(DWORD);//得到写入呢多少进程ID
loop: for(;y<x;y++)
{
char basename[MAX_PATH];
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid[y]);//通过ID得到进程句柄
EnumProcessModules(hProcess,module,sizeof(module),&me);//获取进程的所有模块
GetModuleBaseName(hProcess,NULL,basename,MAX_PATH);//获得进程Name
if(basename[1]==-52)//如果得到权限那么basename的参数一不可能为空,一旦为空,那么执行loop处开始
{
y++;
goto loop;
}
TextOut(hdc,0,d,basename,lstrlen(basename));//打印出来
d+=15;//分行
m=me/sizeof(HMODULE);//得到写入呢多少进程模块
for(k=0;k<m;k++)
{
char Name[MAX_PATH];
GetModuleFileNameEx(hProcess,module[k],Name,MAX_PATH);//得到所有模块的完整路径
TextOut(hdc,0,d,Name,lstrlen(Name));//打印出来
d+=15;
}
}
}
//查找指定程序名查找跟指定程序进程有关的信息
void Firstprocessid(LPVOID lp)
{
//一下函数可能要包含Tlhelp.h头文件
HWND hwnd;
HDC hdc;
char ch[32],str[MAX_PATH];
HANDLE Snap;
PROCESSENTRY32 info;
info.dwSize=sizeof(PROCESSENTRY32);
Snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得系统中进程快照
Process32First(Snap,&info);//获得快照中的第一个进程info
sprintf(ch,"找到%s",(LPSTR)lp);
if(lstrcmpi((LPSTR)lp,info.szExeFile)==0)//判断是否找到想要的进程
MessageBox(NULL,ch,"TRUE",MB_OK);
do
{
if(lstrcmpi((LPSTR)lp,info.szExeFile)==0)
{
hwnd=FindWindow("window","window");
hdc=GetDC(hwnd);
MessageBox(NULL,ch,"TRUE",MB_OK);
//对进程信息,打印
sprintf(str,"进程ID:%d 进程默认堆ID: %d 进程模块ID: %d 进程拥有线程记数:%d 父进程PID:%d 线程优先权:%d 进程名称:%s",info.th32ProcessID,info.th32DefaultHeapID,info.th32ModuleID,info.cntThreads,info.th32ParentProcessID,info.pcPriClassBase,info.szExeFile);
PrintfString(hwnd,hdc,str,2,0x2|0x1);
}
}
while(Process32Next(Snap,&info));//查找快照中剩下的所有进程
}
//查找模块被什么进程调用
void modulefirst(LPVOID lp)
{
HWND hwnd;
HDC hdc;
HANDLE hsnapmodule,hsnap;//模块快照句柄,进程快照句柄
char str[MAX_PATH];
MODULEENTRY32 minfo;
PROCESSENTRY32 pinfo;
minfo.dwSize=sizeof(MODULEENTRY32);//设置大小
pinfo.dwSize=sizeof(PROCESSENTRY32);
sprintf(str,"找到调用%s模块文件的程序",(LPSTR)lp);
hwnd=FindWindow("window","window");
hdc=GetDC(hwnd);
hsnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照
Process32First(hsnap,&pinfo);//获得快照中的第一个进程
do
{
hsnapmodule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo.th32ProcessID);//创建模块 快照
Module32First(hsnapmodule,&minfo);//得到模块快照的第一个模块
/////////////////////////////////////////////////////////////////////////////////////
if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0)//对比是否和要查找的相同
MessageBox(NULL,str,"TRUE",MB_OK);//提示
do
{
if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0)
{
sprintf(str,"进程名称:%s 进程ID: %d 全局模块的使用计数:%d 进程范围内模块的使用计数: %d 基址模块: %d 模块大小:%d 模块句柄:%x 包含模块名:%s 模块路径:%s",pinfo.szExeFile,minfo.th32ProcessID,minfo.GlblcntUsage,minfo.ProccntUsage,minfo.modBaseAddr,minfo.modBaseSize,minfo.hModule,minfo.szModule,minfo.szExePath);
PrintfString(hwnd,hdc,str,1,1|2);
}
}
while(Module32Next(hsnapmodule,&minfo));
////////////////////////////////////////////////////////////////////////////////////
}
while(Process32Next(hsnap,&pinfo));
}
//获取指定进程内存使用情况
void zdprocessmemory(DWORD pid)
{
HWND hwnd;
HDC hdc;
LPVOID Virtualmemory;
HANDLE remoteproc;
PROCESS_MEMORY_COUNTERS pmeminfo;//保存线程的内存结构
remoteproc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid);//打开远程线程
if(remoteproc)
MessageBox(NULL,"远程进程失败","error",MB_OK);
if(GetProcessMemoryInfo(remoteproc,&pmeminfo,sizeof(pmeminfo)))//获得指定进程的内存使用情况
{
Virtualmemory=VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE);
sprintf((LPSTR)Virtualmemory,"缺页中断次数%d 使用内存高峰%d 当前使用的内存%d 使用页面缓存池高峰%d 使用页面缓存池%d 使用非页面缓存池高峰%d 使用非分页缓存池%d 使用分页文件%d 使用分页文件高峰%d",pmeminfo.PageFaultCount,pmeminfo.PeakWorkingSetSize,pmeminfo.WorkingSetSize,pmeminfo.QuotaPeakPagedPoolUsage,pmeminfo.QuotaPagedPoolUsage,pmeminfo.QuotaPeakNonPagedPoolUsage,pmeminfo.QuotaNonPagedPoolUsage,pmeminfo.PagefileUsage,pmeminfo.PeakPagefileUsage);
hwnd=FindWindow("window","window");
hdc=GetDC(hwnd);
PrintfString(hwnd,hdc,(LPSTR)Virtualmemory,2,1|2);
VirtualFree(Virtualmemory,0,MEM_RELEASE);
}
}
//列举进程中的堆
BOOL processheap(DWORD pid)
{
int error;
char Name[32];
char str[MAX_PATH];
HWND hwnd;
HDC hdc;
HANDLE heap,process;
HEAPLIST32 heapinfo={0};
HEAPENTRY32 heapinf={0};//记得把堆情零
PROCESSENTRY32 pinfo={0};
hwnd=FindWindow("window","window");
hdc=GetDC(hwnd);
heap=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,pid);
process=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process32First(process,&pinfo);
do
{
if(pinfo.th32ProcessID==pid)
{
CopyMemory(Name,&(pinfo.szExeFile),lstrlen(pinfo.szExeFile)+1);
}
}
while(Process32Next(process,&pinfo));
heapinfo.dwSize=sizeof(HEAPLIST32);
Heap32ListFirst(heap,&heapinfo);
do
{
heapinf.dwSize=sizeof(HEAPENTRY32);
if(!Heap32First(&heapinf,heapinfo.th32ProcessID,heapinfo.th32HeapID))
{
MessageBox(NULL,"Heap32First()","error",MB_OK);
return FALSE;
}
else
{
do{
error=GetLastError();
if(heapinf.th32ProcessID==pid)
{
sprintf(str,"进程ID:%d 堆ID:%d 堆句柄:%x 程序名称:%s",heapinf.th32ProcessID,heapinf.th32HeapID,heapinf.hHandle,Name);
PrintfString(hwnd,hdc,str,2,3);
return TRUE;
}
heapinf.dwSize=sizeof(HEAPENTRY32);
}
while(Heap32Next(&heapinf));
}
heapinfo.dwSize=sizeof(HEAPLIST32);
}while(Heap32ListNext(heap,&heapinfo));
return FALSE;
}
//修改指定进程内存值
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi)
{ char err[5];
char strerr[64];
int error;
HANDLE hprocess,hremoteprocess;
DWORD pid;
PROCESSENTRY32 pinfo={0};
THREADENTRY32 tinfo={0};
////////////////////
DWORD GB=1024*1024*1024;
DWORD page;
DWORD base;
SYSTEM_INFO sinfo;
MEMORY_BASIC_INFORMATION mInfo;
SIZE_T T;
hprocess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pinfo.dwSize=sizeof(PROCESSENTRY32);
if(!Process32First(hprocess,&pinfo))
{
itoa(GetLastError(),err,10);
MessageBox(NULL,err,"错误",MB_OK);
return FALSE;
}
do{
if(lstrcmpi(lp,pinfo.szExeFile)==0)
{
pid=pinfo.th32ProcessID;
}
}while(Process32Next(hprocess,&pinfo));
// hthread=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
/* tinfo.dwSize=sizeof(THREADENTRY32);
if(!Thread32First(hthread,&tinfo))
{
itoa(GetLastError(),err,10);
MessageBox(NULL,err,"错误",MB_OK);
return FALSE;
}
do{
if(tinfo.th32OwnerProcessID==pid)
{
tid=tinfo.th32ThreadID;
}
}while(Thread32Next(hthread,&tinfo));
*/
if(EnablePrivilege("CE_DEBUG_NAME"))//提升权限
{
MessageBox(NULL,"权限提升失败","错误",MB_OK);
}
if(!(hremoteprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid)))
{
itoa(GetLastError(),err,10);
MessageBox(NULL,err,"错误",MB_OK);
return FALSE;
}
/*
//tid=GetThreadId(hremoteprocess);此函数无法得到进程句柄
if(!(hremotethread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid)))
{
itoa(GetLastError(),err,10);
MessageBox(NULL,err,"错误",MB_OK);
return FALSE;
}
CloseHandle(hremotethread);
*/
GetSystemInfo(&sinfo);//获得系统的信息
base=sinfo.dwAllocationGranularity;//得到分配粒度进程内存分配的开始
page=sinfo.dwPageSize;//分页大小
memset(&mInfo, 0, sizeof(MEMORY_BASIC_INFORMATION));
// ReadProcessMemory(hremoteprocess, (LPCVOID)0x98138,buffs,1,&T);
for(;base<GB*2;base+=page)//32位系统程序和系统各用2GB
{
VirtualQueryEx(hremoteprocess, (LPCVOID)base, &mInfo, sizeof(MEMORY_BASIC_INFORMATION));
if(mInfo.Protect==PAGE_READWRITE)
{
Compareapage(hremoteprocess,base,ints);//对每个分页内存进行比较
}
}
if(error=writeprocessmemory(hremoteprocess,zhi))
{
itoa(error,err,10);
sprintf(strerr,"写入失败,错误代码:%s",err);
MessageBox(NULL,strerr,"错误",MB_OK);
// TerminateProcess(hremoteprocess,0x0);//关闭远程进程
return FALSE;
}
return TRUE;
}
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints)
{
BYTE bByte[4096];
int i;
DWORD *dw;
if(!ReadProcessMemory(hremoteprocess,(LPVOID)base,bByte,4096,NULL))
{
// MessageBox(NULL,"不可读","错误",MB_OK);
return FALSE;
}
for(i=0;i<4096-3;i++)
{
dw=(DWORD*)&bByte[i];
if(*dw == ints)
{
if(size>=1024)
{
return FALSE;
}
buffs[size++]=base+i;//将找到对应想要的值的分页地址偏移量放入数组
}
}
return TRUE;
}
//修改内存值
DWORD writeprocessmemory(HANDLE hp,DWORD zhi)
{
SIZE_T h=0;
DWORD s;
for(s=0;s<=size;s++)
{
if(!WriteProcessMemory(hp,(LPVOID)buffs[s],(LPVOID)&zhi,sizeof(DWORD),&h))
{
return GetLastError();
}
}
return FALSE;
}
//文字打印函数
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type)
{
int x=0,y=0,size,m,p,height,width,row,ints;
RECT rect;
HFONT font;
TEXTMETRIC text;
SetTextColor(hdc,RGB(150,0,0));
SetBkMode(hdc,1);
font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY, DEFAULT_PITCH, "新宋体");
SelectObject(hdc, font);
GetTextMetrics(hdc,&text);
GetClientRect(hwnd,&rect);//获得有效矩形
height=text.tmHeight;//获得字体高度
width=text.tmAveCharWidth;//字体宽度
size=lstrlen(lp);//字个数
ints=rect.right/width;//计算每行可以显示的字
row=size/ints;//显示的行数]
if(size%ints>1)//判断最后是否应为不够一行而不被显示的字
row++;//是,添加一行
switch(h)
{
case 1:TextOut(hdc,0,d,lp,lstrlen(lp));d+=20;break;
case 2:
switch(type)
{
case TYPE_VETRICAL:
if(row==1)//判断是否只有一行
{ //对自有一行的对X值进行设置
y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2
TextOut(hdc,0,y,lp,lstrlen(lp));
}
else
{
for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
{
//对一行整的进行y值调整
y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度
TextOut(hdc,0,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数
}
}
if(row-m==1&&row>1)
{
//判断是否已经是最后一行
//将最后一行进行垂直居中对齐输出
y=(rect.bottom/2-(row*height/2))-(p*height);
TextOut(hdc,0,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
}
break;
case TYPE_LEVEL:
if(row==1)//判断是否只有一行
{
x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值
TextOut(hdc,x,0,lp,lstrlen(lp));
}
else
{
for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
{
//对一行整的进行y值调整
// y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度
TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数
y+=height;
}
if(row-m==1&&row>1)
{
//判断是否已经是最后一行
//将最后一行进行垂直居中对齐输出
x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2));
TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
}
}
break;
case TYPE_LEVEL|TYPE_VETRICAL:
if(row==1)//判断是否只有一行
{ //对自有一行的对X值进行设置
x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值
y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2
TextOut(hdc,x,y,lp,lstrlen(lp));
}
p=row;
for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
{
//对一行整的进行y值调整
y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度
TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数
}
if(row-m==1&&row>1)
{
//判断是否已经是最后一行
//将最后一行进行垂直,水平居中对齐输出
x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2));
y=(rect.bottom/2-(row*height/2))-(p*height);
TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
}
DeleteObject(font);
break;
}
break;
}
}
//进程权限提升函数
BOOL EnablePrivilege(LPSTR lp)//提升进程权限
{
HANDLE hken;
TOKEN_PRIVILEGES ken;//令牌
LookupPrivilegeValue(NULL,lp,&ken.Privileges[0].Luid);//获得系统令牌信息
ken.PrivilegeCount=1;//特权的数组个数
ken.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//启用特权令牌
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hken);//得到当前进程的令牌
AdjustTokenPrivileges(hken,FALSE,&ken,sizeof(ken),0,0);//设置令牌
//CloseHandle(hken);
return (GetLastError()==ERROR_SUCCESS) ;//返回错误信息
}
|
|