汇编hook api的修改问题 100分

一笑拔剑 2009-05-26 09:34:25

问个修改汇编的问题
我从网上下了个汇编hookapi的代码
编译后可以用
但是我想修改他所hook的api
我想问下怎么修改
我想hook住getlasterror这个api函数

如果有人能够修改成可用版本
而且把修改的地方注释出来,并且说明为什么这样修改就可以了

我现在出100
如果答案好我可以再出100
我一共有1800多可用分所以分不是问题
hook api的源代码
这个apihook的是 exitwindowex这个api
asm文件源代码

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
; Programmed by hacker0058, hacker0058@sina.com.cn ;
; Website: http://hacker0058.ys168.com ;
; 汇编(MASM):最简单的HOOK API ;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;


.486
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib




HOOKAPI struct
a byte ?
PMyapi DWORD ?
d BYTE ?
e BYTE ?
HOOKAPI ends


;子程序声明
WriteApi proto :DWORD ,:DWORD,:DWORD,:DWORD
MyAPI proto :DWORD ,:DWORD
GetApi proto :DWORD,:DWORD


;已初始化数据
.data
hInstance dd 0
WProcess dd 0
hacker HOOKAPI <>
CommandLine LPSTR ?

Papi1 DWORD ?
Myapi1 DWORD ?
ApiBak1 db 10 dup(?)
DllName1 db "user32.dll",0
ApiName1 db "ExitWindowsEx",0
mdb db "下面的程序想关闭计算机,要保持阻止吗?",0


;未初始化数据

.data?
hHook dd ?
hWnd dd ?

;程序代码段

.code


;****************************************************************

;DLL入口点

DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD


.if reason==DLL_PROCESS_ATTACH ;当DLL加载时产生此事件
push hInst
pop hInstance

invoke GetCommandLine
mov CommandLine,eax ;取程序命令行

;初始化

mov hacker.a,0B8h ;mov eax,
;mov hacker.d PMyapi ;0x000000
mov hacker.d,0FFh ;jmp
mov hacker.e, 0E0h ;eax

invoke GetCurrentProcess ;取进程伪句柄

mov WProcess ,eax

invoke GetApi,addr DllName1,addr ApiName1 ;取API地址

mov Papi1,eax ;保存API地址

invoke ReadProcessMemory,WProcess,Papi1,addr ApiBak1,8,NULL ;备份原API的前8字节

mov hacker.PMyapi,offset MyAPI ;0x000010 ;要替代API的函数地址

invoke WriteApi,WProcess,Papi1, addr hacker ,size HOOKAPI ;HOOK API

.endif

.if reason==DLL_PROCESS_DETACH

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;还原API

.endif

mov eax,TRUE
ret
DllEntry Endp

;****************************************************************


GetMsgProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,hHook,nCode,wParam,lParam
mov eax,TRUE

ret
GetMsgProc endp

;****************************************************************


InstallHook proc




invoke SetWindowsHookEx,WH_GETMESSAGE,addr GetMsgProc,hInstance,NULL
mov hHook,eax
ret
InstallHook endp

UninstallHook proc


invoke UnhookWindowsHookEx,hHook
invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8
ret
UninstallHook endp


;*****************************************************************

GetApi proc DllNameAddress:DWORD,ApiNameAddress:DWORD

invoke GetModuleHandle,DllNameAddress ;取DLL模块句柄

.if eax==NULL

invoke LoadLibrary ,DllNameAddress ;加载DLL

.endif

invoke GetProcAddress,eax,ApiNameAddress ;取API地址


mov eax,eax

ret

GetApi endp



;*********************************下面是核心部分*****************

WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD,Psize:DWORD

LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD


;返回页面虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改为可读写模式

invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect

;开始写内存

invoke WriteProcessMemory,Process, Papi, Ptype,Psize ,NULL

PUSH eax

;改回只读模式

invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect

pop eax




ret

WriteApi endp

;*******************************************************************


;替代的API,参数要和原来一样

MyAPI proc bs:DWORD ,dwReserved:DWORD

invoke MessageBox, NULL, CommandLine, addr mdb, 4 ;弹出信息框选择是否阻止

.if eax==7 ;如果选择否

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;先还原API

invoke ExitWindowsEx,bs,dwReserved ;再调用API

invoke WriteApi,WProcess,Papi1, addr hacker ,sizeof HOOKAPI ;调用完后再改回来

.endif

mov eax,TRUE
ret

MyAPI endp

;*******************************************************************

End DllEntry

...全文
201 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
一笑拔剑 2009-05-27
  • 打赏
  • 举报
回复
算了

由于做这个api hook花费了太长的时间

心情有些不好所以态度不好

希望大家不要见怪

有能力的人请继续帮忙

不过希望您能最少自己调试下

如果只是改两个值不用你教了我也会改的

问题是没有那么简单,所以我才来问的
一笑拔剑 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
LZ这种态度我没法再说什么,我一天可以得上千分,100在我眼里不算什么。
[/Quote]
我很奇怪了

上千分很难么?

要有工夫上千分不跟玩一样?

我来发贴是希望有答案的,随便回答完全是浪费彼此的时间

你调试过了么?

根本没有试过就随便回贴

这样的态度你要我拿什么态度来对付你
Michael_g 2009-05-27
  • 打赏
  • 举报
回复
以上我说的是在本地进行hook Api ,如果想要hook 其它进程的api 还要进行dll注入以及执行远程线。如果楼主需要我可以留言给我。上面提级的API ,是比较常用的API网上都能找到参考请自行查阅。
Michael_g 2009-05-27
  • 打赏
  • 举报
回复
HOOK api 也可以说是 rootkit 技术,其实没什么复杂的,楼主只要明白其原理完全可以自已写一个出来,下面我来说一下怎样hook api.

原理:
很简单,就是修改掉原Api函数,起始位置的几条指令,将它改成jmp xxxx ,其中xxx指指向你的代码,当你的代码执行完后在继续执行原APIjmp xxxx 后面的指令.当然你也可以从API中间拦截,但这样做比较麻烦,需要保存当前CPU环境等。

实现方法:
1. 用 GetCurrentProcess 取当前进程句柄
2. 用 GetModuleHandle 获取模块名柄 (如 user32.dll ntdll.dll )
3. 用 GetProcAddress 获得原API地址
4. 反汇编工具查看原Api入口入的指令,查看至少前5字节是否能提取出完整的指令,如不能则还要多提取几个字节,因为前5个字节要被修改掉,所以要保存。
5. 用 ReadProcessMemory 取出原API入口出的几个字节,并保存起来。(多少要看开头的指令而定)
6. 用 WriteProcessMemory 在原API入口处写入 jmp xxxxx 指令,使其指向你的代码。
至此已完成了拦截,下面是怎样执行你的代码后在重新执行原API,这里有两种情况,第一是先执行你的代码,然后执行原API,第二种是先执行原API在执行你的代码。
我们先说第一种,先执行你的代码:
在进入你的代码并执行完你的代码后,我们要保证当前的ESP里的值与刚进入你的代码时一至否则当跳转回原API时会获得不了正确的参数与返回地址,导致程序蹦溃。在使用jmp跳转到原 API地址+ X(X是你修改了的字节数)之前要执行原API入口处被你修改的哪几条指令然后在跳。

第二种,先执行原API 在执行你的代码。
当进入你的代码后做以下的事情
1. 将API所需的参数压栈
2. 压入返回地址(当这个函数执行完的,你要执行的代码处)
3. 执行原API被修改的那几条指令
4. 用jmp 跳转到原API被修改处后面继续执行。

*注无论哪种方法执行都要注意ESP的值。

当你不需要Hook时,记得修改回原API处的指令即可。
cxdzxc 2009-05-27
  • 打赏
  • 举报
回复
高手再此过招,我只能观摩了,希望看到结果。顺便问下aspower_,你有没有试过2楼王老师说的方法呢,我很佩服王老师,因为我从未看到他乱讲过的,另我还没玩过WIN32---API的东西,否则我也去试下了。。。
cnzdgs 2009-05-26
  • 打赏
  • 举报
回复
LZ这种态度我没法再说什么,我一天可以得上千分,100在我眼里不算什么。
一笑拔剑 2009-05-26
  • 打赏
  • 举报
回复
你试过了么?

就改一个user32一个函数名

你们真的以为那么简单啊

如果那么简单我还拿100分上来问么?

我不会自己试啊!
susandy 2009-05-26
  • 打赏
  • 举报
回复
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
; Programmed by hacker0058, hacker0058@sina.com.cn ;
; Website: http://hacker0058.ys168.com ;
; 汇编(MASM):最简单的HOOK API ;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;


.486
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib


HOOKAPI struct
a byte ?
PMyapi DWORD ?
d BYTE ?
e BYTE ?
HOOKAPI ends


;子程序声明
WriteApi proto :DWORD ,:DWORD,:DWORD,:DWORD
MyAPI proto :DWORD ,:DWORD
GetApi proto :DWORD,:DWORD


;已初始化数据
.data
hInstance dd 0
WProcess dd 0
hacker HOOKAPI <>
CommandLine LPSTR ?

Papi1 DWORD ?
Myapi1 DWORD ?
ApiBak1 db 10 dup(?)
DllName1 db "kernel32.dll",0
ApiName1 db "GetLastError",0
mdb db "下面的程序想关闭计算机,要保持阻止吗?",0


;未初始化数据

.data?
hHook dd ?
hWnd dd ?

;程序代码段

.code


;****************************************************************

;DLL入口点

DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD


.if reason==DLL_PROCESS_ATTACH ;当DLL加载时产生此事件
push hInst
pop hInstance

invoke GetCommandLine
mov CommandLine,eax ;取程序命令行

;初始化

mov hacker.a,0B8h ;mov eax,
;mov hacker.d PMyapi ;0x000000
mov hacker.d,0FFh ;jmp
mov hacker.e, 0E0h ;eax

invoke GetCurrentProcess ;取进程伪句柄

mov WProcess ,eax

invoke GetApi,addr DllName1,addr ApiName1 ;取API地址

mov Papi1,eax ;保存API地址

invoke ReadProcessMemory,WProcess,Papi1,addr ApiBak1,8,NULL ;备份原API的前8字节

mov hacker.PMyapi,offset MyAPI ;0x000010 ;要替代API的函数地址

invoke WriteApi,WProcess,Papi1, addr hacker ,size HOOKAPI ;HOOK API

.endif

.if reason==DLL_PROCESS_DETACH

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;还原API

.endif

mov eax,TRUE
ret
DllEntry Endp

;****************************************************************


GetMsgProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
invoke CallNextHookEx,hHook,nCode,wParam,lParam
mov eax,TRUE

ret
GetMsgProc endp

;****************************************************************


InstallHook proc



invoke SetWindowsHookEx,WH_GETMESSAGE,addr GetMsgProc,hInstance,NULL
mov hHook,eax
ret
InstallHook endp

UninstallHook proc


invoke UnhookWindowsHookEx,hHook
invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8
ret
UninstallHook endp


;*****************************************************************

GetApi proc DllNameAddress:DWORD,ApiNameAddress:DWORD

invoke GetModuleHandle,DllNameAddress ;取DLL模块句柄

.if eax==NULL

invoke LoadLibrary ,DllNameAddress ;加载DLL

.endif

invoke GetProcAddress,eax,ApiNameAddress ;取API地址


mov eax,eax

ret

GetApi endp


;*********************************下面是核心部分*****************

WriteApi proc Process:DWORD ,Papi:DWORD,Ptype:DWORD,Psize:DWORD

LOCAL mbi:MEMORY_BASIC_INFORMATION
LOCAL msize:DWORD


;返回页面虚拟信息
invoke VirtualQueryEx,Process, Papi,addr mbi,SIZEOF MEMORY_BASIC_INFORMATION

;修改为可读写模式

invoke VirtualProtectEx,Process, mbi.BaseAddress,8h,PAGE_EXECUTE_READWRITE,addr mbi.Protect

;开始写内存

invoke WriteProcessMemory,Process, Papi, Ptype,Psize ,NULL

PUSH eax

;改回只读模式

invoke VirtualProtectEx,Process,mbi.BaseAddress,8h,PAGE_EXECUTE_READ,addr mbi.Protect

pop eax




ret

WriteApi endp

;*******************************************************************


;替代的API,参数要和原来一样

MyAPI proc bs:DWORD ,dwReserved:DWORD

invoke MessageBox, NULL, CommandLine, addr mdb, 4 ;弹出信息框选择是否阻止

.if eax==7 ;如果选择否

invoke WriteApi,WProcess,Papi1, addr ApiBak1 ,8 ;先还原API

invoke ExitWindowsEx,bs,dwReserved ;再调用API

invoke WriteApi,WProcess,Papi1, addr hacker ,sizeof HOOKAPI ;调用完后再改回来

.endif

mov eax,TRUE
ret

MyAPI endp

;*******************************************************************

End DllEntry
一笑拔剑 2009-05-26
  • 打赏
  • 举报
回复
这样简单的话我就不用来问了

汇编我不太熟悉

但是改这样两个字节我是知道的

我试过以后不行

所以我才来询问的

希望能自己编译一下看看

成功以后我保证给分
cnzdgs 2009-05-26
  • 打赏
  • 举报
回复
MyAPI里面写自己的GetLastError代码。
cnzdgs 2009-05-26
  • 打赏
  • 举报
回复
DllName1 db "user32.dll",0
ApiName1 db "ExitWindowsEx",0
改成
DllName1 db "kernel32.dll",0
ApiName1 db "GetLastError",0

MyAPI里面写字节的GetLastError代码。
一笑拔剑 2009-05-26
  • 打赏
  • 举报
回复
def文件内容如下

LIBRARY hookdll
EXPORTS InstallHook
EXPORTS UninstallHook

希望高手能帮忙我完成这个问题

谢谢大家了

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧