远线程汇编代码注入机器码注入概要Word文档格式.docx
- 文档编号:16283384
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:12
- 大小:17.09KB
远线程汇编代码注入机器码注入概要Word文档格式.docx
《远线程汇编代码注入机器码注入概要Word文档格式.docx》由会员分享,可在线阅读,更多相关《远线程汇编代码注入机器码注入概要Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
AsmInject@@YAXXZPROCNEAR;
AsmInject,COMDAT;
8:
{
0000055pushebp
000018becmovebp,esp
0000383ec44subesp,68;
00000044H
0000653pushebx
0000756pushesi
0000857pushedi
000098d7dbcleaedi,DWORDPTR[ebp-68]
0000cb911000000movecx,17;
00000011H
00011b8ccccccccmoveax,-858993460;
ccccccccH
00016f3abrepstosd
9:
DWORDdwAddr=0x0060E8F0;
00018c745fcf0e8
6000movDWORDPTR_dwAddr$[ebp],6351088;
0060e8f0H
10:
__asm
11:
12:
pushad
0001f60pushad
13:
movecx,0x80000003
00020b903000080movecx,-2147483645;
80000003H;
14:
movedx,[0x0AF8450]
00025ba5084af00movedx,11502672;
00af8450H;
15:
pushecx
0002a51pushecx
16:
movecx,[edx+0x20]
0002b8b4a20movecx,DWORDPTR[edx+32]
17:
addecx,0x0d4
0002e81c1d40000
00addecx,212;
000000d4H
18:
calldwAddr
00034ff55fccallDWORDPTR_dwAddr$[ebp]
19:
popad
0003761popad
20:
}
21:
000385fpopedi
000395epopesi
0003a5bpopebx
0003b83c444addesp,68;
0003e3beccmpebp,esp
00040e800000000call__chkesp
000458be5movesp,ebp
000475dpopebp
00048c3ret0
AsmInject@@YAXXZENDP;
AsmInject_TEXTENDS
END
#include"
StdAfx.h"
publicfunction.h"
//汇编代码注入
voidAsmInject(
{
DWORDdwAddr=0x0060E8F0;
__asm
pushad
movecx,0x80000003
movedx,[0x0AF8450]
pushecx
movecx,[edx+0x20]
addecx,0x0d4
calldwAddr
popad
}
第一段代码是VC6.0生成的汇编代码和机器代码
第二段代码是我编写的C代码,内嵌汇编
场景介绍:
我尝试这将这个函数AsmInject(通过远线程注入到TARGET.EXE(被攻击进程发现问题:
为什么远线程注入到TARGET.EXE进程会导致TARGET.EXE出现错误?
解决办法:
在以上这个函数中红色标记的代码通过观察汇编代码之后和我们想象的并不一样,;
00af8450H
事实上它这里并不是把0x0AF8450里面的内容存放到edx,而是直接将0x0AF8450存放到edx中,和我们事先想象的好像不一样。
下面我做了一些改进
AsmInject_New@@YAXXZ;
AsmInject_New
AsmInject_New@@YAXXZ
AsmInject_New@@YAXXZPROCNEAR;
AsmInject_New,COMDAT;
26:
27:
28:
29:
30:
31:
32:
movedx,0x0AF8450
33:
movedx,[edx]
0002a8b12movedx,DWORDPTR[edx]
34:
0002c51pushecx
35:
0002d8b4a20movecx,DWORDPTR[edx+32]
36:
0003081c1d40000
37:
00036ff55fccallDWORDPTR_dwAddr$[ebp]
38:
0003961popad
39:
40:
0003a5fpopedi
0003b5epopesi
0003c5bpopebx
0003d83c444addesp,68;
000403beccmpebp,esp
00042e800000000call__chkesp
000478be5movesp,ebp
000495dpopebp
0004ac3ret0
AsmInject_New@@YAXXZENDP;
_TEXTENDS
//汇编代码注入改进版
voidAsmInject_New(
movedx,0x0AF8450
movedx,[edx]
远线程注入改进版的汇编代码注入之后,可以看到TARGET.EXE进程确实存在效果,但是TARGET.EXE任然会报错,这又是为什么呢?
据说是DEBUG版本的堆栈检测机制,只有在DEBUG版本里面才会有,那么我们使用RELEASE版本编译试试看。
0000351pushecx
0000453pushebx
0000556pushesi
0000657pushedi
00007c745fcf0e8
0000e60pushad
0000fb903000080movecx,-2147483645;
80000003H
00014ba5084af00movedx,11502672;
000198b12movedx,DWORDPTR[edx]
0001b51pushecx
0001c8b4a20movecx,DWORDPTR[edx+32]
0001f81c1d40000
00025ff55fccallDWORDPTR_dwAddr$[ebp]
0002861popad
000295fpopedi
0002a5epopesi
0002b5bpopebx
0002c8be5movesp,ebp
0002e5dpopebp
0002fc3ret0
我们远线程注入这段代码
voidCASMCodeInjectDlg:
:
OnButtonAsmInject(
//TODO:
Addyourcontrolnotificationhandlercodehere
DWORDprocid;
HWNDhwnd;
hwnd=:
FindWindow(NULL,"
ElementClient"
;
if(hwnd==NULL
MessageBox("
请先运行游戏"
return;
GetWindowThreadProcessId(hwnd,&
procid;
//获得进程ID
HANDLEprochandle=:
OpenProcess(PROCESS_ALL_ACCESS,false,procid;
//打开进程LPVOID
baseaddr=VirtualAllocEx(prochandle,NULL,1024*4,MEM_COMMIT,PAGE_EXECUTE_READWRITE;
//分配空间
if(baseaddr==NULL
分配空间出错"
return;
if(!
WriteProcessMemory(prochandle,baseaddr,&
AsmInject_New,1024*4,NULL
将函数写内存出错"
HANDLEtid;
tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINEbaseaddr,0
0,NULL;
//远程调用函数
WaitForSingleObject(tid,INFINITE;
//等待线程结束
VirtualFreeEx(prochandle,baseaddr,1024*4,MEM_RELEASE;
CloseHandle(prochandle;
确实没有堆栈检测机制,然后我们再次注入这段代码,很好,TARGET.EXE并没有出现错误,一切都是如此的正常,如此的和谐。
如果我们直接向TARGET.EXE写入机器指令该怎么做呢?
//机器码函数注入
OnButtonMachinecodeInject(
//待注入的机器指令
charcMachineCode[]={
0x55,
0x8b,0xec,
0x51,
0x53,
0x56,
0x57,
0xc7,0x45,0xfc,0xf0,0xe8,0x60,0x00,
0x60,
0xb9,0x03,0x00,0x00,0x80,
0xba,0x50,0x84,0xaf,0x00,
0x8b,0x12,
0x8b,0x4a,0x20,
0x81,0xc1,0xd4,0x00,0x00,0x00,
0xff,0x55,0xfc,
0x61,
0x5f,
0x5e,
0x5b,
0x8b,0xe5,
0x5d,
0xc3
};
WriteProcessMemory(prochandle,baseaddr,cMachineCode,1024*4,NULL
tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINEbaseaddr,0,0,NULL;
事实上,上面的机器码是直接copyAsmInject_New这个函数的机器码,没有做任何修改,把这些机器码存放到cMachineCode缓冲区中。
进行远线程注入依然可以行的,如此的和谐,TARGET.EXE也不会给我一个READMEMORYERROR!
以上说了下远线程注入的细节问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线程 汇编 代码 注入 机器码 概要