吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2093|回复: 11
收起左侧

[原创] 一个简单的OD反AttacheMe

  [复制链接]
cnkizy 发表于 2022-10-7 18:45
上周老师布置了个作业,编写程序HOOK OD的OpenProcess函数实现OD的反AttacheMe功能
比较简单,花了半小时就搞定了,入门级难度。

1、首先打开两份OD,其中一个OD A 附加另一个OD B
2、附加后在A上点击插件,API断点设置工具,常用断点设置,找到进程函数,对OpenProcess函数打钩,点击确定

插件

插件

API工具

API工具

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

image.png
接着点击B的文件附加,这时候A进入断点。

断点停在了773C59D7这个位置。
image.png
分析代码:
第1句
[Asm] 纯文本查看 复制代码
MOV EDI,EDI  ;嗯?多此一举?


第234句
[Asm] 纯文本查看 复制代码
PUSH EBP
MOV EBP,ESP
POP 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,0aaaaaaaa
jne 773c59e4
MOV DWORD PTR SS:[ESP+0xC],0x0
JMP DWORD PTR DS:[0x77381960]

代码写好后贴在773C59D7这里
image.png

拿个计算器做下实验,打开计算器,拿到Pid,这个计算器的PID是0xB88
image.png

修改刚才的CMP,改为 CMP EAX,0xB88
image.png

然后F2取消断点,F9跑起来
可以看到OD的附加列表中没有计算器
image.png

大功告成,接下来,把HEX数据复制下来,我们要在代码中实现这个功能。
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,然后设置回原来的内存保护属性

开启保护前效果:
image.png
开启保护后效果:
image.png
现在在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)0x773c59d7
using 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
};
// 根据进程找pid
DWORD 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;
}

image.png

免费评分

参与人数 5威望 +1 吾爱币 +23 热心值 +5 收起 理由
bjznhxy + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Tonyha7 + 1 谢谢@Thanks!
bullshit + 1 + 1 谢谢@Thanks!
719882004 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| cnkizy 发表于 2022-10-9 22:08
36108858 发表于 2022-10-9 17:24
如果用的工具不是 OLLYDBG.EXE 那就失效了

这里只是一个抛砖引玉,比如可以对所有进程对应的可执行文件做MD5,比对上MD5,那不管这个进程叫啥名,都可以认为它是我们想要的OD,再比如对系统OpenProcess做HOOK,那样的话会被检测出来,方法很多啦。
 楼主| cnkizy 发表于 2022-10-9 11:26
cyhcuichao 发表于 2022-10-8 19:28
楼主能把你的OD发一份出来吗谢谢

od A:
https://cnkizy.lanzout.com/ia2tM0dhlcxc
其实就是插件多一点,论坛爱盘也有下载的

od B:
https://cnkizy.lanzout.com/iindx0dhld1g
很老的版本 1.10

用论坛的od一样可以,做法是一样的。
cyhcuichao 发表于 2022-10-8 19:28
七月上H 发表于 2022-10-9 08:25
学习借鉴,谢谢分享!
maniacwj 发表于 2022-10-9 09:51
这个不错,收藏备用了,谢谢。
cyhcuichao 发表于 2022-10-9 14:12
cnkizy 发表于 2022-10-9 11:26
od A:
https://cnkizy.lanzout.com/ia2tM0dhlcxc
其实就是插件多一点,论坛爱盘也有下载的

谢了谢了楼主
36108858 发表于 2022-10-9 17:24
如果用的工具不是 OLLYDBG.EXE 那就失效了
kybd2006 发表于 2022-10-27 16:12
谢谢分享
bjznhxy 发表于 2022-10-27 21:59
谢谢楼主分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 10:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表