飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3840|回复: 6

[完美解决]请教HOOK API时遇到的一个汇编问题,高手进来看看

[复制链接]

该用户从未签到

发表于 2006-6-18 19:14:01 | 显示全部楼层 |阅读模式
比如我想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
CLL  77D59E2D  ;调用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:[ebp+8]

;我修改后的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:[ebp+8]

;新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 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-6-19 12:15:53 | 显示全部楼层
搜到的,不知对你有用否?
Windows Hook 易核心编程(3) API Hook 续 拦截API
http://www.dywt.com.cn/vbs/dispbbs.asp?boardid=124&id=77803
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-19 19:04:41 | 显示全部楼层
昏!

你看看你搜的这篇文章的属名

这篇文章是我在易论坛里发表的

无语......

不过,不管怎样,谢谢你了!

[ 本帖最后由 hacker0058 于 2006-6-19 19:14 编辑 ]
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-19 19:05:39 | 显示全部楼层
我要用汇编解决

不想用DLL
PYG19周年生日快乐!

该用户从未签到

发表于 2006-6-20 11:44:50 | 显示全部楼层
原帖由 hacker0058 于 2006-6-19 19:04 发表
昏!

你看看你搜的这篇文章的属名

这篇文章是我在易论坛里发表的

无语......

不过,不管怎样,谢谢你了!

:L;):P
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-23 18:53:08 | 显示全部楼层
忽然发现,用汇编写DLL还是很爽的

特别是用来做全局勾子,效率又高,体积又贼小

程序带个DLL有有何妨呢?

一个字,爽啊,刚好祢补了易语言的DLL不能独立编译的问题
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-6-25 17:52:51 | 显示全部楼层
不甘心,重新查阅了相关资料,终于得到了完美解决方案,如下;

按 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 [ebp + 8]
sub eax,dword ptr [ebp + c]

add esp,8

pop ebp
ret 8
=====================

也可以这样:


MyPorc proc
enter 8,0

mov eax,dword ptr [ebp + 8]
sub eax,dword ptr [ebp + c]

leave
ret 8
MyProc endp


其中,[ebp + 8]处就是参数1,[ebp + c]就是参数2

这样才能保证程序的正常执行!

[ 本帖最后由 hacker0058 于 2006-6-25 17:57 编辑 ]
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表