- UID
- 6086
注册时间2005-12-29
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
比如我想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 编辑 ] |
|