无为清净楼资源网 Design By www.qnjia.com
上周老师布置了个作业,编写程序HOOK OD的OpenProcess函数实现OD的反AttacheMe功能
比较简单,花了半小时就搞定了,入门级难度。
1、首先打开两份OD,其中一个OD A 附加另一个OD B
2、附加后在A上点击插件,API断点设置工具,常用断点设置,找到进程函数,对OpenProcess函数打钩,点击确定
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175057k16o0id6m6p6wk6n.png)
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175210ovjvpgw9jje8v9vl.png)
下完断点后,这时候OD是暂停的,按Ctrl+F9一直让他到运行状态。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175503kfvofowb6wpffqs4.png)
接着点击B的文件附加,这时候A进入断点。
断点停在了773C59D7这个位置。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175737ka7rfaa8fzf4jzwa.png)
分析代码:
第1句
[Asm] 纯文本查看 复制代码
第234句
[Asm] 纯文本查看 复制代码
黑人问号?全是多此一举的操作,大为不解。
接着 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] 纯文本查看 复制代码
代码写好后贴在773C59D7这里
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/182723r2pnhjtjj79bjaj1.png)
拿个计算器做下实验,打开计算器,拿到Pid,这个计算器的PID是0xB88
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/182305ygguswx09s0dqg5x.png)
修改刚才的CMP,改为 CMP EAX,0xB88
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/183102lp6mmflpksqkbzuk.png)
然后F2取消断点,F9跑起来
可以看到OD的附加列表中没有计算器
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/182945yspo7ssegj8iexps.png)
大功告成,接下来,把HEX数据复制下来,我们要在代码中实现这个功能。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/183440v3f251tjld3d001w.png)
关键的两个数据
第一个是openprocess的函数地址
[C++] 纯文本查看 复制代码
第二个就是刚才复制下来的HEX数据
[C++] 纯文本查看 复制代码
首先获取自己pid,然后把pid写回code
[C++] 纯文本查看 复制代码
然后就是固定模版啦,打开进程、设置虚拟内存保护属性,在需要的地方也就是(773C59D7)写入code,然后设置回原来的内存保护属性
开启保护前效果:
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/184055wzmelzsy382szeee.png)
开启保护后效果:
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/184213tcijugfdggsifd12.png)
现在在AttacheMe列表里,你看不到我进程了
,所谓的对抗也就是这样,你分析我,我分析你,你HOOK我,我再HOOK你
挺简单的对吧
[C++] 纯文本查看 复制代码
比较简单,花了半小时就搞定了,入门级难度。
1、首先打开两份OD,其中一个OD A 附加另一个OD B
2、附加后在A上点击插件,API断点设置工具,常用断点设置,找到进程函数,对OpenProcess函数打钩,点击确定
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175057k16o0id6m6p6wk6n.png)
image.png
插件
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175210ovjvpgw9jje8v9vl.png)
image.png
API工具
下完断点后,这时候OD是暂停的,按Ctrl+F9一直让他到运行状态。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175503kfvofowb6wpffqs4.png)
image.png
接着点击B的文件附加,这时候A进入断点。
断点停在了773C59D7这个位置。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/175737ka7rfaa8fzf4jzwa.png)
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](/UploadFiles/2021-04-26/182723r2pnhjtjj79bjaj1.png)
image.png
拿个计算器做下实验,打开计算器,拿到Pid,这个计算器的PID是0xB88
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/182305ygguswx09s0dqg5x.png)
image.png
修改刚才的CMP,改为 CMP EAX,0xB88
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/183102lp6mmflpksqkbzuk.png)
image.png
然后F2取消断点,F9跑起来
可以看到OD的附加列表中没有计算器
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/182945yspo7ssegj8iexps.png)
image.png
大功告成,接下来,把HEX数据复制下来,我们要在代码中实现这个功能。
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/183440v3f251tjld3d001w.png)
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](/UploadFiles/2021-04-26/184055wzmelzsy382szeee.png)
image.png
开启保护后效果:
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/184213tcijugfdggsifd12.png)
image.png
现在在AttacheMe列表里,你看不到我进程了
![一个简单的OD反AttacheMe](/UploadFiles/2021-04-26/47.gif)
挺简单的对吧
[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;}
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年06月29日
2024年06月29日
- 瑞鸣音乐《中国音乐地图之听见河南豫剧经典唱段》2020[WAV分轨]
- 【伊比萨沙发】VA-2024-IbizaSpring2024(LoungeCocktailsfromtheHeart)[FLAC]
- 群星《世界顶级汽车音响试音王》4K金碟16CD[WAV+CUE]
- 群星-音效环绕天碟《极致环绕人声天碟天品》7CD[WAV]
- 泰拉克SACD古典试音碟7SACD-ISO
- 群星《红歌宝典》20CD[WAV/分轨]
- 《101系列:好歌101首 细听年代精选》[WAV+CUE][3.6GB]
- 《101系列 6CD 国语经典101首歌曲 张学友 王菲代表作》[APE+CUE][2.8GB]
- 《101系列:国语经典101 VOL2 6CD 精选最经典101首》[WAV+CUE][2.3GB]
- 群星《十年网络红歌》15CD[WAV分轨]
- 宝丽金-环球10周年至50周年经典金曲15CD[低速原抓WAV+CUE]
- FIM唱片《十大男伶》[低速原抓WAV+CUE]
- 《101系列:情歌101 6CD》[WAV+CUE][3.1GB]
- 庄心妍《降调版合集》[320K/MP3][52.96MB]
- 庄心妍《降调版合集》[FLAC/分轨][118.78MB]