首页
社区
课程
招聘
[原创]乱解 API 函数 -- API 绝密档案系列之二
发表于: 2006-3-7 06:45 46130

[原创]乱解 API 函数 -- API 绝密档案系列之二

2006-3-7 06:45
46130

乱解 API 函数 -- API 绝密档案系列之二   通向高手之路
上一篇介绍了两个结构,今后你会发现,在系统程序中,对这两个结构的引用无所不在,理解这两个结构对正确理解系统程序有莫大的帮助。
这一篇加了副标题【通向高手之路】你可能要问,我是什么“手”,抱歉,我最多只能称“中手”,那么“中手”是什么意思? 是高手之下,低手之上的那只手? 错,“中手”--乃中国之手--乃国手也,哈哈。
那么我们为什么要研究这些底层的东西呢?这个问题提的好。一般来说有两个目的,第一是深刻的理解这些函数是如何工作的,在今后的开发中你也许可以借鉴这些底层的某些用法,来优化你的程序。其二就是弄一些自己的函数来取代这些函数从而达到某些特殊的目的。
对于如何用自己的代码来取代这些函数也有许多方法,最简单的就是将这些代码直接拷贝到你的程序中去,但这可能不是很好的办法,因为这些代码中,有许多函数是内部函数,不能直接调用,因而你不得不将这些所有的过程都搬到你的程序中。另一种方法就是在真正理解这些函数的基础上彻底改写。系统函数一般来讲都比较全面,各种情况都要考虑,所以比较繁琐,而你可能只是在某些特定的环境下使用这些函数,这就有可能简化这些函数,将你认为不需要的地方去掉,这样代码精炼,而且隐蔽性更好,如果更上一层楼,可以使用其他的方法达到相同的目的,这样就是最高境界了。
我在这里以 GetModuleHandle 函数为例,介绍了如何分析理解这些函数,Windows 从公开的到未公开的函数多如牛毛,不可能每一个的介绍,我没时间写,你也没有时间看,所以这里只是以这个函数为例,让你了解一下这些分析的过程,希望你能掌握这一思路和方法,自己去分析底层函数,这样你就有可能成为真正的高手。

首先我们来看看GetModuleHandleW的代码:(这里给出的是 TimeDateStamp=0x42A0669B 版)

77E80C27 ; Exported entry 320. GetModuleHandleW
77E80C27 ; ======== S U B R O U T I N E ====================
77E80C27 ; HMODULE __stdcall GetModuleHandleW(LPCWSTR lpModuleName)
77E80C27       public _GetModuleHandleW@4
77E80C27 _GetModuleHandleW@4 proc near
77E80C27 UnicodeModuleName= dword ptr -10h
77E80C27 ModuleName= byte ptr -8
77E80C27 MemoryPointer= dword ptr -4
77E80C27 lpModuleName= dword ptr  8
77E80C27       push ebp
77E80C28       mov ebp, esp
77E80C2A       sub esp, 10h
77E80C2D       cmp [ebp+lpModuleName], 0
77E80C31       push esi
77E80C32       jnz short IfNotSelfModuleHandle
77E80C34       mov eax, large fs:18h               ; TEB.NT_TIB.Self
77E80C3A       mov eax, [eax+TEB.Peb]
77E80C3D       mov eax, [eax+PEB.ImageBaseAddress]
77E80C40       jmp short GetModHandleExit
77E80C42 IfNotSelfModuleHandle:                    ; SourceString
77E80C42       push [ebp+lpModuleName]
77E80C45       lea eax, [ebp+UnicodeModuleName]
77E80C48       push eax                            ; DestinationString
77E80C49       call ds:__imp__RtlInitUnicodeString@8 ; 将 CWSTR 转成 Unicode
77E80C4F       cmp _gDoDllRedirection, 0           ; Dll 重定向标志
77E80C56       jz short DontDllRedir
          ;_gDoDllRedirection = TRUE
77E80C58       lea eax, [ebp+ModuleName]
77E80C5B       push eax                            ; returnName
77E80C5C       lea eax, [ebp+UnicodeModuleName]
77E80C5F       push eax                            ; lpModuleName
77E80C60       call _ComputeRedirectedDllName@8    ; 所谓重定向就是到用户程序的目录下加载同名的dll,
77E80C60                                           ; _ComputeRedirectedDllName函数将用户输入的ModuleName
77E80C60                                           ; 前面加上用户的目录(用户程序启动的目录)。
77E80C65       test eax, eax
77E80C67       jge short IfGetRedirDllName
77E80C69       push eax                            ; Status
77E80C6A       call _BaseSetLastNTError@4          ; BaseSetLastNTError(x)
77E80C6F       xor eax, eax
77E80C71       jmp short GetModHandleExit
77E80C73 IfGetRedirDllName:
77E80C73       lea eax, [ebp+ModuleName]
77E80C76       push eax                            ; lpModuleName
77E80C77       call _GetModuleHandleForUnicodeString@4 ; GetModuleHandleForUnicodeString(x)
77E80C7C       mov esi, eax
77E80C7E       mov eax, large fs:18h               ; TEB.NT_TIB.Self
77E80C84       push [ebp+MemoryPointer]            ; MemoryPointer
77E80C87       mov eax, [eax+TEB.Peb]
77E80C8A       push 0                              ; Flags
77E80C8C       push [eax+PEB.ProcessHeap]          ; HeapHandle
77E80C8F       call ds:__imp__RtlFreeHeap@12       ; __declspec(dllimport) RtlFreeHeap(x,x,x)
77E80C95       test esi, esi
77E80C97       jz short DontDllRedir
77E80C99       mov eax, esi
77E80C9B       jmp short GetModHandleExit
         ;_gDoDllRedirection = FALSE
77E80C9D DontDllRedir:
77E80C9D       lea eax, [ebp+UnicodeModuleName]
77E80CA0       push eax                            ; lpModuleName
77E80CA1       call _GetModuleHandleForUnicodeString@4 ; GetModuleHandleForUnicodeString(x)
77E80CA6 GetModHandleExit:
77E80CA6       pop esi
77E80CA7       leave
77E80CA8       retn 4
77E80CA8 _GetModuleHandleW@4 endp
77E80C34       mov eax, large fs:18h               ; TEB.NT_TIB.Self
77E80C3A       mov eax, [eax+TEB.Peb]
77E80C3D       mov eax, [eax+PEB.ImageBaseAddress]
77E80C4F       cmp _gDoDllRedirection, 0           ; Dll 重定向标志
77E80C56       jz short DontDllRedir
77E67A40 ; NTSTATUS __stdcall BaseDllInitialize(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
77E67A40 _BaseDllInitialize@12 proc near
77E67A40 pObjectDirectory= dword ptr -210h
77E67A40 PEB   = dword ptr -10h
77E67A40 pConnectionInfo= dword ptr -0Ch
77E67A40 @ConnectionInfoSize= dword ptr -8
77E67A40 @ServerToServerCall= dword ptr -1
77E67A40 hInstance= dword ptr  8
77E67A40 dwReason= dword ptr  0Ch
77E67A40 lpReserved= dword ptr  10h
77E67A40
77E67A40       push ebp
77E67A41       mov ebp, esp
77E67A43       sub esp, 210h
... ...
... ...
77E67C66 loc_77E67C66:
77E67C66       push 104h                           ; nSize
77E67C6B       push offset _BaseDefaultPathBuffer  ; lpFilename
77E67C70       push esi                            ; hModule esi=Null 获取当前用户带路径的程序名
77E67C71       call _GetModuleFileNameW@12         ; GetModuleFileNameW(x,x,x)
77E67C76       movzx eax, ax                       ; 返回文件名的长度
77E67C79       mov esi, offset a_local             ; ".Local"
77E67C7E       lea edi, _BaseDefaultPathBuffer[eax*2] ;将指针移到文件名字符串的尾部
77E67C85       movsd                                ;添加 ".Local"
77E67C86       movsd
77E67C87       movsd
77E67C88       movsw
77E67C8A       mov esi, offset _BaseDefaultPathBuffer
77E67C8F       push esi                             ; FileName
77E67C90       call ds:__imp__RtlDoesFileExists_U@4 ; __declspec(dllimport) RtlDoesFileExists_U(x)
77E67C96       mov edi, src
77E67C9C       mov [b]_gDoDllRedirection[/b], al
... ...
... ...
C:\MyDir\MyProc.exe.Local (Nt格式的文件名,注意,是 WSTR 字符串) 
77F895D0 ; Exported entry 430. RtlDoesFileExists_U
77F895D0 ; ======== S U B R O U T I N E ====================
77F895D0 ; BOOLEAN __stdcall RtlDoesFileExists_U(PWSTR FileName)
77F895D0       public _RtlDoesFileExists_U@4
77F895D0 _RtlDoesFileExists_U@4 proc near
77F895D0 FileName= dword ptr  4
77F895D0       push TRUE                                   ; AllowShare
77F895D2       push [esp+4+FileName]                       ; FileName
77F895D6       call _RtlDoesFileExists_UEx
77F895DB       retn 4
77F895DB _RtlDoesFileExists_U@4 endp

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

收藏
免费 8
支持
分享
最新回复 (48)
雪    币: 146
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好文收藏,楼主辛苦~
2006-3-7 07:45
0
雪    币: 3689
活跃值: (4247)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
3
羡慕7000多英尺的花园。

怎么不把笨重的大计算机拆点东西带回来送俺?
2006-3-7 07:45
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
4
2006-3-7 07:50
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
5
最初由 china 发布
羡慕7000多英尺的花园。

怎么不把笨重的大计算机拆点东西带回来送俺?

花园面积超过10000英尺,一部分已经弄完了,其实剩下的这部分最大的工程也完成了,因为住在山坡上,所以平整土地是最大的工程,为了防止梅花鹿来偷吃东西,所以还建了围墙,这些工作花了一年多的业余时间。这里所有的鬼子都喜欢自己动手建设花园,所以我也就自己弄了。
回中国就象搬家,要带的东西太多,超重后,运费都可以买一台计算机,所以只好送人。
2006-3-7 08:53
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文收藏
2006-3-7 09:03
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
7
喜欢你的“7000多平方英尺的花园”

2006-3-7 09:17
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好文收藏
2006-3-7 09:22
0
雪    币: 175
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好文收藏,第一部分在那里?
2006-3-7 09:41
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
好文!好国手!
2006-3-7 10:02
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
11
最初由 xingbing 发布
好文收藏,第一部分在那里?


2006-3-7 10:16
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
12
最近强人强文层出不穷啊,先是CCDebuger的od教学系列,这里又有gzgzlxg的API绝密档案系列,喜欢!都是让人一看就喜欢的!
2006-3-7 10:30
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
13
gzgzlxg 住的地方不错啊,7000多平方英尺的花园,我住的房子才70多平方
2006-3-7 10:45
0
雪    币: 241
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
支持。。。。。。。。。
2006-3-7 11:04
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
1万平方英尺不是很大,大约 0.25英亩, 约纵横 30米

但gzgzlxg的房子建造和位置是超级的好, 哈哈,他还有台顶级越野好车呢, 赶明个我拿我的房子换你的车,咔咔, 我的房子也大,花园也大
2006-3-7 11:09
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
16
都是有钱淫
2006-3-7 11:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这里果然是高手云集啊.
2006-3-7 11:24
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
18
1ft=0.3048m
1平方英尺=0.0929平方米
7000平方英尺=650平方米=30*22m吧

羡慕啊!唉,我们有个地方睡觉吃饭就不错了;有个破车开就满足,顶级越野好车和游艇只在电影里看过,唉,人比人,气死人啊。
2006-3-7 12:00
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
19
2006-3-7 12:22
0
雪    币: 9793
活跃值: (2191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
gzgzlxg 兄弟,超级强贴,,,,我喜欢!不知离下次发文还要等多久。希望能看到这个系列发出来XX篇才好呢。
2006-3-7 13:08
0
雪    币: 3689
活跃值: (4247)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
21
最初由 Ivanov 发布
1万平方英尺不是很大,大约 0.25英亩, 约纵横 30米

但gzgzlxg的房子建造和位置是超级的好, 哈哈,他还有台顶级越野好车呢, 赶明个我拿我的房子换你的车,咔咔, 我的房子也大,花园也大


有空把我弄到俄罗斯去玩玩,我见识见识洋妞。
2006-3-7 15:07
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
22
最初由 china 发布
有空把我弄到俄罗斯去玩玩,我见识见识洋妞。

洋妞只适合远观,不适合近战。
2006-3-7 16:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
呵呵,都出二了!,感谢gzgzlxg!
2006-3-7 16:37
0
雪    币: 405
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼主真是高手
相比之下我真的是入门级的菜鸟啊
本以为破了几个软件怎么也算关成手了
呜。。。。。。
2006-3-7 16:58
0
雪    币: 211
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
  强  期待第三
2006-3-7 17:12
0
游客
登录 | 注册 方可回帖
返回
//