#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#define OD_OPENPROCESS_ADDRESS (LPVOID)0x773c59d7
using
namespace
std;
BYTE
anti_od_attach[] = {
0x3D,0,0,0,0,
0x75,0x08,
0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,
0xFF,0x25,0x60,0x19,0x38,0x77
};
BYTE
on_od_attach[] = {
0xFF,0x25,0x60,0x19,0x38,0x77,
0x90,0x90,0x90,0x90,
0x90,0x90,
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
0x90
};
DWORD
FindPid(
LPCTSTR
name);
int
main()
{
system
(
"title ==== Anti OD Attach ===="
);
DWORD
myPid = GetCurrentProcessId();
*(
DWORD
*)(anti_od_attach + 1) = myPid;
printf
(
"My PID:%08X\n"
, myPid);
int
num;
BYTE
* pCode;
DWORD
pCodeLen =
sizeof
(anti_od_attach);
while
(
true
) {
cout <<
"0 = OD不能AttachMe"
<< endl;
cout <<
"1 = OD可以AttachMe"
<< endl;
cout <<
"其他退出"
<< endl;
cout <<
"请输入:"
;
cin >> num;
if
(num == 0) {
pCode = anti_od_attach;
}
else
if
(num == 1) {
pCode = on_od_attach;
}
else
{
break
;
}
DWORD
pid = FindPid(L
"OLLYDBG.EXE"
);
printf
(
"1、OD PID:%08X\n"
, pid);
HANDLE
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
DWORD
oldProtect;
VirtualProtect(OD_OPENPROCESS_ADDRESS, pCodeLen, PAGE_READWRITE, &oldProtect);
SIZE_T
realWriteNum;
WriteProcessMemory(hProcess, OD_OPENPROCESS_ADDRESS, pCode, pCodeLen, &realWriteNum);
DWORD
oldProtect2;
VirtualProtect(OD_OPENPROCESS_ADDRESS, pCodeLen, oldProtect, &oldProtect2);
printf
(
"功能生效\n"
);
}
}
DWORD
FindPid(
LPCTSTR
name) {
DWORD
aProcesses[1024], cbNeeded, ModNeeded;
if
(!EnumProcesses(aProcesses,
sizeof
(aProcesses), &cbNeeded))
return
-1;
HANDLE
hProcess;
HMODULE
hMod;
TCHAR
szProcessName[MAX_PATH] = _T(
"unknown"
);
int
nProcesses = cbNeeded /
sizeof
(
DWORD
);
for
(
int
i = 0; i < nProcesses; i++) {
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i]);
if
(NULL != hProcess) {
if
(EnumProcessModules(hProcess, &hMod,
sizeof
(hMod), &ModNeeded)) {
GetModuleBaseName(hProcess, hMod, szProcessName,
sizeof
(szProcessName));
if
(lstrcmpi(szProcessName, name) == 0) {
return
aProcesses[i];
}
}
else
continue
;
}
}
return
-1;
}