首页
社区
课程
招聘
[求助]关于WriteProcMemory的一点问题
发表于: 2008-7-27 19:13 8263

[求助]关于WriteProcMemory的一点问题

2008-7-27 19:13
8263
我先用CreateProcess创建了新进程,暂停线程,然后用WriteProcMemory对远程kernel32.dll里的一个API进行了HOOK,但总是说INVAILD ADDRESS,很郁闷.
我看OLLYDBG是可以改(WRITEPROCMEMORY)的,自己就是不行.不懂为什么........

呵呵,寻求各位帮助

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

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
HOOK前先设置内存权限
2008-7-27 19:14
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
呵呵.什么意思?是VirtualProtectEx吗?这个也试过,还是INVAILD ADDRESS
2008-7-27 19:17
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
附上段程序
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc

includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
.data?
startinfo STARTUPINFO <>
ip PROCESS_INFORMATION <>
.data
buffer db 'c:\windows\notepad.exe',0
dll db 'kernel32.dll',0
procx db 'CopyFileExW',0
INT03 DB 0CCH
.code
start:
invoke GetStartupInfo,addr startinfo
invoke CreateProcess,addr buffer,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,addr startinfo,addr ip
invoke SuspendThread,ip.hThread ;这个是后来的办法,也不行,之前是CREATEPROCESS上设置FLAG
invoke GetModuleHandle,addr dll
invoke GetProcAddress,eax,addr procx
mov edi,eax
invoke WriteProcessMemory,ip.hProcess,edi,addr INT03,1,NULL //这里不行....
invoke ResumeThread,ip.hThread
end start
2008-7-27 19:18
0
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
没有碰到过,望大牛来解决
2008-7-27 19:19
0
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
invoke GetModuleHandle,addr dll

应该是这个原因。
GetModuleHandle只能本进程能使用。
想远程使用,得先注入。
2008-7-27 19:20
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
7
可是在一个系统中难道API的装载地址不一样吗?如果注入,是不是要先在OEP那里修改一下?谢谢:)
2008-7-27 19:23
0
雪    币: 136
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
可是在一个系统中难道API的装载地址不一样吗?

是的,不一样
没个进程有自己独立的4G空间。

注入不需要修改OEP,你找一下注入的方法吧
2008-7-27 19:29
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
9
谢谢
Thanks a lot .....
2008-7-27 19:32
0
雪    币: 184
活跃值: (65)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
同一系统下。。。正常情况下系统API地址是一样的。。。
2008-7-27 20:41
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
那就比较奇怪了…………
2008-7-28 14:53
0
雪    币: 952
活跃值: (1951)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
先将自己提升到debug权限试试
2008-7-28 16:22
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
13
LS指的是标上DEBUG的FLAG吗?试过了,还是挂,很郁闷.接连换了很多个API都不可以...

为啥OLLYDBG就可以捏?
郁闷不解
2008-7-28 20:01
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
的确是一样的,但是windows98之后,ms为了提高系统安全性,做了如下改动:
当你对某一个DLL进行写操作的时候,系统会重新划出一块内存,将原来的DLL拷贝过来,然后挂到进程空间里面替换原来的。
2008-7-28 20:59
0
雪    币: 952
活跃值: (1951)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我试了下`VC下正常
2008-7-28 21:13
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
16
那请教一下这位大牛,为什么我这么写就挂了呢?应该怎么写呢?

还有LS的那位,为什么VC就没问题,相反底层的汇编就有问题呢?
2008-7-28 21:17
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
17
PROCESS_SUSPENDED这个时候  应该还没有把kernel32.dll装载进进程空间吧。我感觉是这样 我记得是这样。 一般我都是在EntryPoint改一个jmp跳到 自己的code中然后再HOOK 操作。

补充一点,这个跟操作系统有关系~ 不排除有些杀毒软件为了防止注入而禁止写内存。
其次就是Vista 开始  好像貌似 kernel32.dll已经装入了。,  凭影响是这样。。错了就错了吧。。
2008-7-28 21:46
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
18
呵呵,谢谢楼上
2008-7-29 08:48
0
游客
登录 | 注册 方可回帖
返回
//