吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2334|回复: 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] 纯文本查看 复制代码
1
MOV EDI,EDI ;嗯?多此一举?


第234句
[Asm] 纯文本查看 复制代码
1
2
3
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] 纯文本查看 复制代码
1
2
3
4
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++] 纯文本查看 复制代码
1
#define OD_OPENPROCESS_ADDRESS (LPVOID)0x773c59d7

第二个就是刚才复制下来的HEX数据
[C++] 纯文本查看 复制代码
1
2
3
4
5
6
7
// 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++] 纯文本查看 复制代码
1
2
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++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#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, 2025-5-25 08:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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