[完美解决]请教HOOK API时遇到的一个汇编问题,高手进来看看
比如我想HOOK关机的API函数ExitWindowsEx函数原型如下:
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
在易语言中这样;
.DLL命令 ExitWindowsEx, 整数型, "user32", "ExitWindowsEx", , 退出windows.
.参数 标志, , , 注指定下述一个或多个标志
.参数 保留值, , , 保留,设为零;。
我现在已经在这个原API函数的入口地址写入了这2句:
mov eax,00402060 ;新API函数的地址
jmp eax
一般的方法是把这个新API函数写到一个DLL,然后用勾子把这个DLL注入到其他进程
但是,我不想程序带个DLL(实际上是易语言写的DLL不能单独使用),我想直接用汇编写个子程序,然后写
到系统所有进程的空间
举个例子:
==========================================================
.子程序 new_ExitWindowsEx, 整数型, , 新的API函数,要与原来的API函数的参数一样
.参数 标志, 整数型
.参数 保留值, 整数型
返回 (1)
=====================================================================
这个子程序用汇编怎么写?
;假设程序执行到这里(我不会汇编,不知道是不是这样表达的?)
PUSH 00404044;参数2
PUSH 00404040;参数1
CLL77D59E2D;调用AP( ExitWindowsEx)
;原ExitWindowsEx的入口
77D59E2D >8BFF mov edi,edi
77D59E2F 55 push ebp
77D59E30 8BEC mov ebp,esp
77D59E32 83EC 18 sub esp,18
77D59E35 53 push ebx
77D59E36 8B5D 08 mov ebx,dword ptr ss:
;我修改后的ExitWindowsEx的入口
77D59E2D >B8 60204000 mov eax,402060;如果直接在这里写入RETN,有些程序调用时会崩溃
77D59E32 FFE0 jmp eax ;跳到新API的地址
77D59E34 90 nop
77D59E35 53 push ebx
77D59E36 8B5D 08 mov ebx,dword ptr ss:
;新API的地址
00402060 >
★注意:关键是这里该怎么写?还请高手帮忙补充!
要求:这个新函数可以什么都不做就返回1,但一定要保证调用这个API的应用程序不蹦溃!
=====================================================================
附:
WIN32 中函数的函数如果有返回值,那它是通过 eax 寄存器来传递的。其他的值可以通过传递进来
的参数地址进行返回。一个 WIN32 函数被调用时总会保存好段寄存器和 ebx,edi,esi和ebp 寄存器
,而 ecx和edx 中的值总是不定的,不能在返回是应用。特别注意:从 Windows API 函数中返回后,
eax,ecx,edx 中的值和调用前不一定相同。当函数返回时,返回值放在eax中。如果您应用程序中的
函数提供给 Windows 调用时,也必须尊守这一点,即在函数入口处保存段寄存器和 ebx,esp,esi
,edi 的值并在函数返回时恢复。如果不这样一来的话,您的应用程序很快会崩溃。
[ 本帖最后由 hacker0058 于 2006-6-25 17:54 编辑 ] 搜到的,不知对你有用否?
Windows Hook 易核心编程(3) API Hook 续 拦截API
http://www.dywt.com.cn/vbs/dispbbs.asp?boardid=124&id=77803 昏!
你看看你搜的这篇文章的属名
这篇文章是我在易论坛里发表的
无语......
不过,不管怎样,谢谢你了!
[ 本帖最后由 hacker0058 于 2006-6-19 19:14 编辑 ] 我要用汇编解决
不想用DLL 原帖由 hacker0058 于 2006-6-19 19:04 发表
昏!
你看看你搜的这篇文章的属名
这篇文章是我在易论坛里发表的
无语......
不过,不管怎样,谢谢你了!
:L;):P 忽然发现,用汇编写DLL还是很爽的
特别是用来做全局勾子,效率又高,体积又贼小
程序带个DLL有有何妨呢?
一个字,爽啊,刚好祢补了易语言的DLL不能独立编译的问题 不甘心,重新查阅了相关资料,终于得到了完美解决方案,如下;
按 StdCall约定,程序调用API该是这样的:
push Var3
push Var2
push Var1
call SubRouting
最右边的参数先入堆栈,然后子程序在返回的时候负责校正堆栈
举例说明:
如果我们要调用 ExitWindowsEx 这个 API,因为它的定义是
MyExitWindowsEx proto Var1,Var2 ;有两个参数
local lVar1,lVar2 ;如果有两个局部变量
ExitWindowsEx(uFlags,dwReserved) 所以在程序中要这样使用:
push dwReserved
push uFlags
call ExitWindowsEx
...
而在ExitWindowsEx函数中的框架应该这样;
MyProc proc
======================
push ebp
mov ebp,esp
sub esp,8
mov eax,dword ptr
sub eax,dword ptr
add esp,8
pop ebp
ret 8
=====================
也可以这样:
MyPorc proc
enter 8,0
mov eax,dword ptr
sub eax,dword ptr
leave
ret 8
MyProc endp
其中,处就是参数1,就是参数2
这样才能保证程序的正常执行!
[ 本帖最后由 hacker0058 于 2006-6-25 17:57 编辑 ]
页:
[1]