首页
社区
课程
招聘
[原创]API-HOOK and ANTI-API-HOOK For Ring3
发表于: 2007-1-7 20:56 28094

[原创]API-HOOK and ANTI-API-HOOK For Ring3

2007-1-7 20:56
28094

<<API-HOOK and ANTI-API-HOOK For Ring3>>
转载请保留版权.谢谢
Anskya@Gmail.com

今天突然看到"堕落天才"仁兄的两篇文章
感谢他的的文章和共享精神.谢谢...突然手痒..有感而发
API-HOOK和ANTI-API-HOOK已经不算什么新鲜的技术了
一般大概用的技术都差不多

[1]简要介绍API-HOOK
1.IAT补丁
介绍:
一般调用函数都是call [MessageBoxA]这样的格式
很明显[MessageBoxA]下的地址就是函数的真正的地址

Delphi:
push 0
push 0
push 0
push 0
call -$000467cd(这里是MessageBox在导入表的偏移)
77D504EA >  8BFF            MOV EDI,EDI
77D504EC    55              PUSH EBP
77D504ED    8BEC            MOV EBP,ESP
77D504EF    833D BC04D777 0>CMP DWORD PTR DS:[77D704BC],0
77D504F6    74 24           JE SHORT USER32.77D5051C
77D504F8    64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
77D504FE    6A 00           PUSH 0
77D50500    FF70 24         PUSH DWORD PTR DS:[EAX+24]
77D50503    68 240BD777     PUSH USER32.77D70B24
77D50508    FF15 C812D177   CALL DWORD PTR DS:[<&KERNEL32.Interlocke>; 

kernel32.InterlockedCompareExchange
77D5050E    85C0            TEST EAX,EAX
77D50510    75 0A           JNZ SHORT USER32.77D5051C
77D50512    C705 200BD777 0>MOV DWORD PTR DS:[77D70B20],1
77D5051C    6A 00           PUSH 0
77D5051E    FF75 14         PUSH DWORD PTR SS:[EBP+14]
77D50521    FF75 10         PUSH DWORD PTR SS:[EBP+10]
77D50524    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
77D50527    FF75 08         PUSH DWORD PTR SS:[EBP+8]
77D5052A    E8 2D000000     CALL USER32.MessageBoxExA
77D5052F    5D              POP EBP
77D50530    C2 1000         RETN 10
typedef int(*TMessageBoxA)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, 

UINT uType);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TMessageBoxA MsgBox;
  MsgBox = (TMessageBoxA)GetProcAddress(LoadLibrary("user32.dll"), 

"MessageBoxA");
  MsgBox(0, 0, 0, 0);
}
77D504EA >- FF25 1E00055F   JMP DWORD PTR DS:[5F05001E]--被补丁了.
77D504F0    3D BC04D777     CMP EAX,user32.77D704BC
77D504F5    007424 64       ADD BYTE PTR SS:[ESP+64],DH
77D504F9    A1 18000000     MOV EAX,DWORD PTR DS:[18]
77D504FE    6A 00           PUSH 0
77D50500    FF70 24         PUSH DWORD PTR DS:[EAX+24]
77D50503    68 240BD777     PUSH user32.77D70B24
77D50508    FF15 C812D177   CALL DWORD PTR DS:[<&KERNEL32.Interlocke>; 

kernel32.InterlockedCompareExchange
77D5050E    85C0            TEST EAX,EAX
77D50510    75 0A           JNZ SHORT user32.77D5051C
77D50512    C705 200BD777 0>MOV DWORD PTR DS:[77D70B20],1
77D5051C    6A 00           PUSH 0
77D5051E    FF75 14         PUSH DWORD PTR SS:[EBP+14]
77D50521    FF75 10         PUSH DWORD PTR SS:[EBP+10]
77D50524    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
77D50527    FF75 08         PUSH DWORD PTR SS:[EBP+8]
77D5052A    E8 2D000000     CALL user32.MessageBoxExA
77D5052F    5D              POP EBP
77D50530    C2 1000         RETN 10

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (33)
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
最近好文不断~
2007-1-7 21:01
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
学习!...............
2007-1-7 21:10
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
4
我觉得应该转移到编程区去...不好意思临时写的
正在孕酿一下写一篇Bypass API-HOOK
介绍一些平时玩烂的一些方法...希望大家多支持
麻烦坛主帮忙移动一下帖子到编程区...这个应该算编程还是调试?
2007-1-7 21:22
0
雪    币: 279
活跃值: (33)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
Anskya发的主题贴一般都是精品!牛人!
2007-1-7 22:53
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
6
强贴,留个名!
2007-1-8 12:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习ing.....
2007-1-8 12:53
0
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
8
学习...
2007-1-8 15:38
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
9
还是不能全看明白,学习
2007-1-8 21:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看看~~~~~~~~~~~~~~~
2007-1-9 02:29
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
11
学习
2007-1-9 17:39
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
12
总结成一句话,其实reload dll就可以了...
2007-1-9 17:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
先把当前API前几bytes保存,再reload dll比对
这样?
2007-1-9 21:28
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
直接读文件,把dll代码覆盖修改
2007-1-9 22:17
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
15
如果dll已经被load起来了, 重新LoadLibraryA, 那么被修改过的代码会重新从文件里面在读一次吗? 好象不会吧?
2007-1-9 22:39
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
16
多写了个A...
2007-1-9 22:40
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
什么时候我也试试
2007-1-10 08:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
最初由 forgot 发布
直接读文件,把dll代码覆盖修改


这是ANTI HOOK,想得到的是检测HOOK,如果把核心DLL都带上,是不是太大了点
2007-1-10 10:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 jjnet 发布
如果dll已经被load起来了, 重新LoadLibraryA, 那么被修改过的代码会重新从文件里面在读一次吗? 好象不会吧?


"LoadLibrary 尝试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的引用数。"

如果是默认地址,如果system32下的DLL估计是不会重新加载,但是在另外目录下的dll副本情况怎么样我没有测试过
2007-1-10 10:47
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
Originally posted by forgot
总结成一句话,其实reload dll就可以了...

这个猛
2007-1-10 14:10
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
21
为什么loadlibrary不会memcpy么
2007-1-10 17:45
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
22
最初由 forgot 发布
为什么loadlibrary不会memcpy么

不愧是写壳的牛X代码这么"抽"

其实是可以这么"玩"但是再次打开DLL感觉很无聊
为了能把简单的事情高的复杂化所以用了一点花招
也算是另类Bypass吧

而且这个只是其中一个方法还有其它方法来ByPass
主要用于技术交流嘛...鱼有百种网有万样
各显所能嘛主要是为了看有什么新的思路和方法^_^
2007-1-11 15:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了~~强啊
2007-1-11 18:06
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
强文,学习
2007-1-11 20:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
收藏了学习了,谢谢
2007-1-11 21:04
0
游客
登录 | 注册 方可回帖
返回
//