破解资源 
首页 > 破解资源 > 浏览文章

一个简单的OD反AttacheMe

(编辑:jimmy 日期: 2024/12/24 浏览:3 次 )
上周老师布置了个作业,编写程序HOOK OD的OpenProcess函数实现OD的反AttacheMe功能
比较简单,花了半小时就搞定了,入门级难度。
1、首先打开两份OD,其中一个OD A 附加另一个OD B
2、附加后在A上点击插件,API断点设置工具,常用断点设置,找到进程函数,对OpenProcess函数打钩,点击确定
一个简单的OD反AttacheMe

image.png

插件


一个简单的OD反AttacheMe

image.png

API工具


下完断点后,这时候OD是暂停的,按Ctrl+F9一直让他到运行状态。
一个简单的OD反AttacheMe

image.png


接着点击B的文件附加,这时候A进入断点。
断点停在了773C59D7这个位置。
一个简单的OD反AttacheMe

image.png


分析代码:
第1句
[Asm] 纯文本查看 复制代码
MOV EDI,EDI  ;嗯?多此一举?

第234句
[Asm] 纯文本查看 复制代码
PUSH EBPMOV EBP,ESPPOP EBP

黑人问号?全是多此一举的操作,大为不解。
接着 773C59DD 这一句是无条件跳转到下面的JMP
那么 也就是 函数开始的地方 773C59D7 到 773C59E3 全可以看做为 NOP
分析栈及其寄存器:
EAX是当前遍历的PID,可以利用一下
esp       地址为12CEA4,这个地址的值是谁在调用这个函数,对我们不重要
esp+4   地址为12CEA8,值为410,是VM_READ|QUERY_INFORMATION ,打开进程的权限,可以在这上面动手脚,写个0让它打开不了
esp+8   地址为12CEAC,值为0,是进程继承,对我们不重要
esp+12 地址为12CEB0,值为0,是进程ID,可以对这个做手脚,写个0,让它跳过我们的进程
分析完毕,这里有这么大一块空间就直接在这里写东西了,那么代码思路是判断eax是否为我们的进程PID,如果是,那么把esp+12写为0,不是就跳过。
[Asm] 纯文本查看 复制代码
cmp eax,0aaaaaaaajne 773c59e4MOV DWORD PTR SS:[ESP+0xC],0x0JMP DWORD PTR DS:[0x77381960]

代码写好后贴在773C59D7这里
一个简单的OD反AttacheMe

image.png


拿个计算器做下实验,打开计算器,拿到Pid,这个计算器的PID是0xB88
一个简单的OD反AttacheMe

image.png


修改刚才的CMP,改为 CMP EAX,0xB88
一个简单的OD反AttacheMe

image.png


然后F2取消断点,F9跑起来
可以看到OD的附加列表中没有计算器
一个简单的OD反AttacheMe

image.png


大功告成,接下来,把HEX数据复制下来,我们要在代码中实现这个功能。
一个简单的OD反AttacheMe

image.png


关键的两个数据
第一个是openprocess的函数地址
[C++] 纯文本查看 复制代码
#define OD_OPENPROCESS_ADDRESS (LPVOID)0x773c59d7

第二个就是刚才复制下来的HEX数据
[C++] 纯文本查看 复制代码
// od 反附加BYTE anti_od_attach[] = {    0x3D,0,0,0,0, // cmp eax,00000000    0x75,0x08, // jne 773c59e6    0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00, // MOV DWORD PTR SS : [ESP + 0xC] , 0x0    0xFF,0x25,0x60,0x19,0x38,0x77 // JMP DWORD PTR DS : [0x77381960]};

首先获取自己pid,然后把pid写回code
[C++] 纯文本查看 复制代码
    DWORD myPid = GetCurrentProcessId();    *(DWORD*)(anti_od_attach + 1) = myPid; // cmp eax,00000000  ->   cmp eax,myPid

然后就是固定模版啦,打开进程、设置虚拟内存保护属性,在需要的地方也就是(773C59D7)写入code,然后设置回原来的内存保护属性
开启保护前效果:
一个简单的OD反AttacheMe

image.png


开启保护后效果:
一个简单的OD反AttacheMe

image.png


现在在AttacheMe列表里,你看不到我进程了一个简单的OD反AttacheMe,所谓的对抗也就是这样,你分析我,我分析你,你HOOK我,我再HOOK你
挺简单的对吧
[C++] 纯文本查看 复制代码
#include <iostream>#include <windows.h>#include <tchar.h>#include <psapi.h>#pragma comment(lib, "psapi.lib")// od的openprocess函数开始地址#define OD_OPENPROCESS_ADDRESS (LPVOID)0x773c59d7using namespace std;// od 反附加BYTE anti_od_attach[] = {    0x3D,0,0,0,0, // cmp eax,00000000    0x75,0x08, // jne 773c59e6    0xC7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00, // MOV DWORD PTR SS : [ESP + 0xC] , 0x0    0xFF,0x25,0x60,0x19,0x38,0x77 // JMP DWORD PTR DS : [0x77381960]};// od 关闭反附加BYTE on_od_attach[] = {    0xFF,0x25,0x60,0x19,0x38,0x77, // JMP DWORD PTR DS : [0x77381960]    0x90,0x90,0x90,0x90, // nop    0x90,0x90,     0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,     0x90};// 根据进程找pidDWORD FindPid(LPCTSTR name);int main(){    system("title ==== Anti OD Attach ====");    // 把自己pid记下来生成opcode,让od attach时跳过我的程序    DWORD myPid = GetCurrentProcessId();    *(DWORD*)(anti_od_attach + 1) = myPid; // cmp eax,00000000  ->   cmp eax,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;        }        // 找到进程PID        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);        // 内联Hook        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;}

上一篇:发现个支持安卓4 的tvbox 可以推送接口配置 还可以共存 更猛的多仓来了
下一篇:微信读书墨水屏版- 1.8.8.10144203_900
一句话新闻
一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?