首页
社区
课程
招聘
注入汇编代码,执行到代码指令时,因为指令有写内存的操作,写内存报错
发表于: 2020-10-28 12:04 2616

注入汇编代码,执行到代码指令时,因为指令有写内存的操作,写内存报错

2020-10-28 12:04
2616

// 功能:通过hook目标进程GetTickCount,把时间记录下来。
MOV ECX, 7FFE0320 // Hook了目标进程GetTickCount开头的几个字节,目标进程调用GetTickCount会跳转到这里
MOV RCX, DS:[RCX]
MOV EAX, DS:[7FFE0004]
IMUL RAX, RCX
SHR RAX, 18 // 以上:直接复制的GetTickCount的代码,得到的time保存在rax中
PUSH RDX // 以下:每次程序调用 kernel32.GetTickCount时,将time即rax的值保存到指定内存。
PUSH R8
MOV RDX, 2CD0FAD0000 // 2CD0FAD0000(远程VirtualAllocEx创建的8字节内存),该地址的值,指向了一块内存区域的首地址记为"ArrayAddress"(远程VirtualAllocEx创建的0x1000大小),每次调用kernel32.GetTickCount,该地址的值+8
MOV R8, 2CD0FAD0000
MOV RDX, DS:[RDX]
MOV DS:[RDX], RAX // 执行这条指令时,目标程序会报错:"ArrayAddress 不能写", 注入到自己写的程序没这个问题,为什么呢?
ADD RDX, 8
MOV DS:[R8], RDX
POP R8
POP RDX
RET

 

如何解决呢?希望能得到一些思路,谢谢了。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 5484
活跃值: (3297)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
看下目标地址是否有写权限 
2020-10-28 13:18
0
雪    币: 5
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
K__
3
是 PAGE_EXECUTE_READWRITE,  难道是MOV DS:[RDX], RAX 这条指令行不通,  我先试试 让汇编代码调用WriteProcessMemory写目标本进程的内存.
2020-10-28 16:11
0
雪    币: 7065
活跃值: (3106)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
4
WriteProcessMemory 
2020-10-28 16:20
0
雪    币: 4154
活跃值: (1535)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
你没给ArrayAddress赋值,或者ArrayAddress在本进程没有写权限。
mov rdx, [rdx]
; 解引用得到ArrayAddress的地址并存放在rdx中
; VirtualAlloc/Ex分配的内存初始值为全0,此时rdx=0
mov [rdx], rax
; 相当于向nullptr写入一个QWORD。
; 如果已经初始化过ArrayAddress,那么要检查ArrayAddress所在内存是否具有可写权限
; 或者其内存不是在本进程中分配的,需要调用WriteProcessMemory来写内存
2020-10-29 07:16
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6

能否把源进程为目标进程VirtualAllocEx分配内存的那段代码发出来?
这种情况下,hProcess的句柄参数不能是源进程的句柄,必须是目标进程的句柄。你检查下。

特别注意:分配0x1000大小的那段

最后于 2020-10-29 11:00 被低调putchar编辑 ,原因:
2020-10-29 10:19
0
游客
登录 | 注册 方可回帖
返回
//