1,486
社区成员
发帖
与我相关
我的任务
分享
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type
Public Type THREADENTRY32
dwSize As Long
cntUsage As Long
th32ThreadID As Long
th32OwnerProcessID As Long
tpBasePri As Long
tpDeltaPri As Long
dwFlags As Long
End Type
Public Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
// kashkack.cpp : Defines the entry point for the console application.
//6F3AE20C ESI+4
//LEA EDI,DWORD PTR SS:[ESP+20]
//8D7C24 20
#include "stdlib.h"
#include "iostream.h"
#include "windows.h"
#include "tlhelp32.h"
#include "conio.h"
#define XXXX_BREAK_ADDRESS 0x6F3AE20C
#define XXXX_BREAK_ADDREST 0x6F3AE210
#define BREAK_OPEN 0x401
int main(int argc, char* argv[])
{
system("color 6");
cout<<"Test"<<endl;
//提升本程序权限使其能获取PID
HANDLE hcurrent=GetCurrentProcess();
HANDLE hToken;
BOOL bret=OpenProcessToken(hcurrent,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
LUID luid;
bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);
TOKEN_PRIVILEGES NewState,PreviousState;
DWORD ReturnLength;
NewState.PrivilegeCount =1;
NewState.Privileges[0].Luid =luid;
NewState.Privileges[0].Attributes=2;
bret=AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);
CloseHandle(hToken);
//寻找窗口
HWND hwar3=::FindWindow(NULL,"xxxx");
if (!hwar3)
{
MessageBox(0, "Run xxxx First!", "", MB_OK);
return false;
}
else
cout<<"寻找xxxx窗口成功!"<<endl;
//获取PID
DWORD PID, TID;
TID = ::GetWindowThreadProcessId (hwar3, &PID);
//打开进程以供编辑
HANDLE hopen=OpenProcess( PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,PID);
if (!hopen)
{
MessageBox(0, "Can't Openxxxx!", "", MB_OK);
return false;
}
else
cout<<"打开xxxx进程成功!"<<endl;
if (!DebugActiveProcess(PID))
{
MessageBox(0, "Can't debug!", "", MB_OK);
return false;
}
DEBUG_EVENT DebugEv;
DWORD dwContinueStatus;
bool key=true;
bool breakdone=false;
int number=0;
unsigned char p6F3AE20C[2]={0xCC,0xCC};
unsigned char pold[2]={0x8D,0x7C};
while(key)
{
if(WaitForDebugEvent(&DebugEv, 10))
{
dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
switch(DebugEv.dwDebugEventCode)
{
//case 1 open prosess==================================================================
case CREATE_PROCESS_DEBUG_EVENT:
{
HANDLE hSnapshot = NULL;
THREADENTRY32 ThreadInfo = { sizeof(THREADENTRY32) };
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL);
if(hSnapshot>0)
{
if(Thread32First(hSnapshot, &ThreadInfo))
{
do
{
if(ThreadInfo.th32OwnerProcessID==PID)
{
//printf("%08x %08x\n", ThreadInfo.th32ThreadID, ThreadInfo.th32OwnerProcessID);
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, ThreadInfo.th32ThreadID);
SuspendThread(hThread);
CONTEXT Regs = {0};
Regs.ContextFlags = CONTEXT_DEBUG_REGISTERS; //CONTEXT_DEBUG
::GetThreadContext(hThread, ®s);
Regs.Dr0 = WAR3_BREAK_ADDRESS;
Regs.Dr7 = BREAK_OPEN;
::SetThreadContext(hThread, ®s);
ResumeThread(hThread);
CloseHandle(hThread);
}
}while(Thread32Next(hSnapshot, &ThreadInfo));
}
CloseHandle(hSnapshot);
}
cout<<"附加进程成功!\n";
break;
}
//case 2 exception
case EXCEPTION_DEBUG_EVENT:
{
if((DWORD)DebugEv.u.Exception.ExceptionRecord.ExceptionAddress==XXXX_BREAK_ADDRESS)
{
number++;
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, DebugEv.dwThreadId);
//cout<<DebugEv.dwThreadId<<endl;
SuspendThread(hThread);
CONTEXT Regs = {0};
Regs.ContextFlags = CONTEXT_DEBUG_REGISTERS|CONTEXT_INTEGER;
::GetThreadContext(hThread, ®s);
Regs.Esi=Regs.Esi+9;
Regs.Dr0=WAR3_BREAK_ADDREST;
Regs.Dr7=BREAK_OPEN;
::SetThreadContext(hThread, ®s);
ResumeThread(hThread);
CloseHandle(hThread);
}
if((DWORD)DebugEv.u.Exception.ExceptionRecord.ExceptionAddress==xxxx_BREAK_ADDREST)
{
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, DebugEv.dwThreadId);
SuspendThread(hThread);
CONTEXT Regs = {0};
Regs.ContextFlags = CONTEXT_DEBUG_REGISTERS|CONTEXT_INTEGER;
::GetThreadContext(hThread, ®s);
Regs.Dr0=XXXX_BREAK_ADDRESS;
Regs.Dr7=BREAK_OPEN;
::SetThreadContext(hThread, ®s);
ResumeThread(hThread);
CloseHandle(hThread);
}
dwContinueStatus = DBG_CONTINUE;
break;
}
//case 3 exit
case EXIT_PROCESS_DEBUG_EVENT:
{
cout<<"Case 3"<<endl;
return 0;
break;
}
//case end
}
}
ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus);
}
return 0;
}