首页
论坛
课程
招聘
HOOK实现读取、存储远程进程的控件文本
2006-8-14 20:57 8368

HOOK实现读取、存储远程进程的控件文本

2006-8-14 20:57
8368
似乎怎样对远程的控件文本操作,成了一个不大不小的问题。
尝试过VirtualAlloc+WriteProcessMemory+SendMessage似乎很不奏效。(对于list控件似乎很好用,但是edit、static之类的控件怎么弄都不成功)

于是为了某些程序能够实现操作远程控件文本的功能,特意写了一个动态链接库。似乎比较好用。

改dll其实没什么特别值得参考的地方。

大家拿来实用也好,拿代码来参考复制也罢,甚至权且当作是hook的例程反正回回帖子,捧捧人气就好!(广告云:“神州行,我看行”即为此理)

下附内容说明
=============================================================
修改远程窗口文本的动态连接库(未编译)

WRT.BAT文件为源代码+编译参数,放入已安装masm32的分区的任意目录中,双击编译。

输出:

LPTSTR __stdcall WGetRemoteTextA(HWND hWnd,LPTSTR sztext);
LPTSTR __stdcall WSetRemoteTextA(HWND hWnd,LPTSTR sztext);

第一个函数读取远程窗口文本
第二个函数写入远程窗口文本
两者都是stdcall的函数,它的返回值就是LPTSTR sztext。
---------------------------------------------------
注:
1、WRT是WRemoteText的缩写
2、代码中提供了UNICODE的部分,但是我没有用过UNICODE写过程序。不知道这样子会不会有错。所以comment了。
3、若要修改文件名,不要忘记把WRT.BAT中的环境变量也做相应的设置!
==================================================================
源代码:
;echo off
;cls
;goto make
;我从来没有用过UNICODE,担心出BUG。所以把原本定义UNICODE操作comment了。
MAXTEXTSIZE = 1000
.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

.data
	bset			dd 0
;	bunicode		dd 0
	readflag		dd 0
	busying		dd 0	;	if there is another program called this function,it will share the whole .data section. 
							;	incase of these process call the DLL at the same time,we should make a var to record it.
	finished		dd 0	;	if the title changed
	processid	dd 0	;	the Target process id
	threadid		dd 0
	hhook			dd 0
	htarget		dd 0	;	Target window :)
	targettext	db MAXTEXTSIZE+2 dup(?)
.CODE
	hInstance dd 0
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
	.if reason == DLL_PROCESS_ATTACH
		mov eax,hInstDLL
		mov hInstance,eax
	;.elseif reason == DLL_PROCESS_DETACH
	;.elseif reason == DLL_THREAD_ATTACH
	;.elseif reason == DLL_THREAD_DETACH
	.endif
	mov eax,TRUE
	ret 12
LibMain Endp
WHookCall	proc ncode:DWORD,wParam:DWORD,lParam:DWORD
		mov eax,finished
		test eax,eax
		jnz hookignore
		invoke GetCurrentProcessId
		cmp eax,processid
		jne hookignore
		.if bset == 0
			invoke SendMessage,htarget,WM_GETTEXT,MAXTEXTSIZE,offset targettext
		.else
			invoke SendMessage,htarget,WM_SETTEXT,0,offset targettext
		.endif
		mov finished,1
hookignore:;
	invoke CallNextHookEx,hhook,ncode,wParam,lParam
	ret 12
WHookCall	endp
WTextOperation	proc	hWnd:DWORD,sztext:DWORD
wait0:
	mov eax,busying
	test eax,eax
	jne wait0
	invoke IsWindow,hWnd
	je invalidhwnd
	mov busying,1
	invoke GetWindowThreadProcessId,hWnd,offset processid
	mov threadid,eax
	invoke GetLastError
	test eax,eax
	jne Expection
;偷懒点,不去考虑当前进程的窗口了
;	invoke GetCurrentProcessId
;	.if processid == eax
;		.if bset == 0
;			invoke SendMessage,htarget,WM_GETTEXT,MAXTEXTSIZE,sztext
;		.else
;			invoke SendMessage,htarget,WM_SETTEXT,0,sztext
;		.endif
;		jmp Expection
;	.endif
	.if bset == 1
;		.if bunicode == 0
			invoke lstrcpynA,offset targettext,sztext,MAXTEXTSIZE
;		.else
;			invoke lstrcpynW,offset targettext,sztext,MAXTEXTSIZE/2
;		.endif
	.endif
	mov finished,0
	push hWnd
	pop htarget
	invoke SetWindowsHookEx,WH_CALLWNDPROC,offset WHookCall,hInstance,threadid
	mov hhook,eax
	invoke GetLastError
	test eax,eax
	jne Expection
	invoke SendMessage,hWnd,WM_GETTEXTLENGTH,0,0
	invoke GetLastError
	test eax,eax
	jne Expection
notfinished:;
	mov eax,finished
	test eax,eax
	je notfinished
	invoke UnhookWindowsHookEx,hhook
	mov hhook,0
	.if bset==0
;		.if bunicode == 0
			invoke lstrcpynA,sztext,offset targettext,MAXTEXTSIZE
;		.else
;			invoke lstrcpynW,sztext,offset targettext,MAXTEXTSIZE/2
;		.endif
	.endif
invalidhwnd:;
Expection:;
	mov busying,0
	mov eax,sztext
	ret 8
WTextOperation	endp
;		I do not know whether Win98 supports the 
;	Unicode.
;=================Unicode: ====================
;WGetRemoteTextW	proc	hWnd:DWORD,sztext:DWORD
;	mov bset,0
;	mov bunicode,1
;	invoke WTextOperation,hWnd,sztext
;	ret 8
;WGetRemoteTextW	endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WSetRemoteTextW	proc	hWnd:DWORD,sztext:DWORD
;	mov bset,1
;	mov bunicode,1
;	invoke WTextOperation,hWnd,sztext
;	ret 8
;WSetRemoteTextW	endp
;================Ansi: ========================
WGetRemoteTextA	proc	hWnd:DWORD,sztext:DWORD
	mov bset,0
	;mov bunicode,0
	invoke WTextOperation,hWnd,sztext
	ret 8
WGetRemoteTextA	endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WSetRemoteTextA	proc	hWnd:DWORD,sztext:DWORD
	mov bset,1
	;mov bunicode,0
	invoke WTextOperation,hWnd,sztext
	ret 8
WSetRemoteTextA	endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

End LibMain

:make
set this=WRT
set include=%include%;\masm32\include
set lib=%lib%;\masm32\lib
\masm32\bin\ml /c /coff /nologo %this%.bat
rem link option
if exist %this%.bat \masm32\bin\link /SUBSYSTEM:WINDOWS /DLL /NOLOGO /merge:.rdata=.text /section:.text,RWE /section:.data,rws /EXPORT:WSetRemoteTextA /EXPORT:WGetRemoteTextA %this%.obj
del %this%.obj
pause


[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 活跃值 6 2006-8-15 18:55
2
0
顶一顶

那么,有谁给个VirtualAlloc+WriteProcessMemory+SendMessage改变 EDIT 或者STATIC文本的例子行吗?(list是成功了,edit和static怎么弄都不行)

谢谢
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
masmprogra 活跃值 2006-8-16 09:41
3
0
支持开源,共同学习
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 活跃值 6 2006-8-16 18:56
4
0
感谢大家支持
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xpfbi 活跃值 2006-8-17 05:53
5
0
支持原创

用处很多啊这东西
雪    币: 2644
活跃值: 活跃值 (578)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kagayaki 活跃值 2006-8-20 13:39
6
0
顶一下......
雪    币: 2644
活跃值: 活跃值 (578)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kagayaki 活跃值 2006-8-20 13:45
7
0
有没取 ListView 控件的代码(在 2003 的系统上实现)

http://bbs.pediy.com/showthread.php?s=&threadid=30291
雪    币: 153
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
verybigbug 活跃值 2006-8-23 13:45
8
0
edit、static直接用GetWindowText和SetWindowText就可以了。当然,static必须有HWND
雪    币: 111
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无奈无赖 活跃值 2006-8-31 10:54
9
0
支持!下下来学习下。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 活跃值 6 2006-8-31 18:22
10
0
最初由 verybigbug 发布
edit、static直接用GetWindowText和SetWindowText就可以了。当然,static必须有HWND


你试试看
这种方法在windows 3.2下是肯定通过的,windows9x、NT下是肯定不能通过的。

不会还有人在用win3.2吧
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 活跃值 6 2006-8-31 18:26
11
0
最初由 kagayaki 发布
有没取 ListView 控件的代码(在 2003 的系统上实现)

http://bbs.pediy.com/showthread.php?s=&threadid=30291


我看过的,
问题是同样的方法处理list却是能够成功,作用在edit/static上为什么就不行……找不出原因,十分郁闷。
所以才只好写成hook,挂到那个进程上。

或许是当时用上述远程heap方法的时候哪里粗心,反正现在有了此DLL以后也就不去讨论这个问题了。得过且过
游客
登录 | 注册 方可回帖
返回