首页
社区
课程
招聘
[原创]打造 API 函数 -- API 绝密档案系列之四 (修正版)
发表于: 2006-3-11 06:48 37356

[原创]打造 API 函数 -- API 绝密档案系列之四 (修正版)

2006-3-11 06:48
37356
77E600C8           dw 10Bh              ; OptionalHeader.Magic
77E600C8           db 5                 ; OptionalHeader.MajorLinkerVersion
77E600C8           db 0Ch               ; OptionalHeader.MinorLinkerVersion
77E600C8           dd 59000h            ; OptionalHeader.SizeOfCode
77E600C8           dd 73E00h            ; OptionalHeader.SizeOfInitializedData
77E600C8           dd 0                 ; OptionalHeader.SizeOfUninitializedData
77E600C8           dd 7A40h             ; OptionalHeader.AddressOfEntryPoint
77E600C8           dd 1000h             ; OptionalHeader.BaseOfCode
77E600C8           dd 5A000h            ; OptionalHeader.BaseOfData
77E600C8           dd 77E60000h         ; OptionalHeader.ImageBase
77E600C8           dd 1000h             ; OptionalHeader.SectionAlignment
77E600C8           dd 200h              ; OptionalHeader.FileAlignment
......
......
77E600C8           dd 1000h                        ; OptionalHeader.SectionAlignment
GetProcbaseAddress proc uses ebx esi FunAddr:DWORD
    .if !FunAddr
        ;如果 FunAddr = 0 随便 Call 一下,pop eax 就是当前的地址
        call $ + 5
        pop eax
    .else
        ;如果是某个函数的调用地址,函数调用地址一般有下面的格式:
        ; __stdcall MessageBoxA(x,x,x,x)
        ; MessageBoxA proc near
        ;FF 25 08 04 40 00     jmp     ds:__imp__MessageBoxA
        ; MessageBoxA endp
        ;其中 FF 25 是 jmp 的操作码,后面的 00400408 是函数调用地址
        ;这样就容易理解下面的代码了。
        mov eax, FunAddr
        mov eax, [eax+2]
        mov eax, [eax]
    .endif
    and eax, 0FFFF0000h
    .repeat
        .if word ptr [eax] != 'ZM'
            xor esi, esi
            sub eax, 1000h

        .else
            mov esi, [eax+IMAGE_DOS_HEADER.e_lfanew]
        .endif
        add esi, eax
    .until dword ptr [esi] == 'EP'

    ret
GetProcbaseAddress  endp
77EB4230 ExportTable     
77EB4230           dd 0                                ; Characteristics 
77EB4230           dd 41B04DB0h                        ; TimeDateStamp
77EB4230           dw 0                                ; MajorVersion
77EB4230           dw 0                                ; MinorVersion
77EB4230           dd offset NameStrBase               ; Name
77EB4230           dd 1                                ; Base
77EB4230           dd 33Dh                             ; NumberOfFunctions
77EB4230           dd 33Dh                             ; NumberOfNames
77EB4230           dd offset AddressOfFunctionsBase    ; AddressOfFunctions
77EB4230           dd offset AddressOfNamesBase        ; AddressOfNames
77EB4230           dd offset AddressOfNameOrdinalsBase ; AddressOfNameOrdinals
......
......
77EB8DC4 aRequestdevicew    db 'RequestDeviceWakeup',0
77EB8DD8 aRequestwakeupl    db 'RequestWakeupLatency',0
77EB8DED aResetevent        db 'ResetEvent',0
77EB8DF8 aResetwritewatc    db 'ResetWriteWatch',0
77EB8E08 aResumethread      db 'ResumeThread',0
77EB8E15 aRtlfillmemory     db 'RtlFillMemory',0
77EB8E23 RtlFillMemory      db 'NTDLL.RtlFillMemory',0
77EB8E37 aRtlmovememory     db 'RtlMoveMemory',0
77EB8E45 RtlMoveMemory      db 'NTDLL.RtlMoveMemory',0
77EB8E59 aRtlunwind         db 'RtlUnwind',0
77EB8E63 RtlUnwind          db 'NTDLL.RtlUnwind',0
77EB8E73 aRtlzeromemory     db 'RtlZeroMemory',0
77EB8E81 RtlZeroMemory      db 'NTDLL.RtlZeroMemory',0
77EB8E95 aScrollconsoles    db 'ScrollConsoleScreenBufferA',0
77EB8EB0 aScrollconsol_0    db 'ScrollConsoleScreenBufferW',0
77EB8ECB aSearchpatha       db 'SearchPathA',0
......
......
GetDllBase proc uses ecx edx esi lpProcName:DWORD

    ;mov eax, large fs:18h
    xor eax, eax
    ; masm32 在编译普通exe文件时,不支持 mov eax, fs:[18] 指令
    ; 因此写成如下格式,编译后等同 mov eax, fs:[18]
    db 64h
    mov eax, ds:18h                               ; TEB.Self
                                                  
    mov eax, [eax].TEB.Peb                        ; 取 PEB 表的地址
    mov eax, [eax].PEB.Ldr                        ; 取 PEB_LDR_DATA 结构的地址
    ; PEB_LDR_DATA.InLoadOrderModuleList.Flink 指向 LDR_DATA_TABLE_ENTRY
    add eax, PEB_LDR_DATA.InLoadOrderModuleList.Flink
    ; 这个结构形成一个链表
    mov ecx, [eax].LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink

Loop_SeachModule:
    cmp ecx, eax
    jz  Exit
    mov edx, ecx
    ; 获取下一个 LDR_DATA_TABLE_ENTRY 结构的地址
    mov ecx, [ecx].LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink
    ; 比较该内存地址是否为空,如果是,则出错
    cmp [edx].LDR_DATA_TABLE_ENTRY.InMemoryOrderModuleList.Flink, 0
    jz  Loop_SeachModule
    ; 获取模块名的地址
    lea esi, [edx].LDR_DATA_TABLE_ENTRY.BaseDllName.UNICODE_STRING.woLength
    push eax
    ; 验证是否是我们需要的模块
    invoke ComparAnsiStrUnicodeStr, lpProcName, esi
    cmp eax, 1
    pop eax
    jnz Loop_SeachModule
    ; 如果是,取该模块的基地址
    mov eax, [edx].LDR_DATA_TABLE_ENTRY.DllBase
    jmp Exit1

Exit:
    xor eax, eax

Exit1:
    ret
GetDllBase endp

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (37)
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
谢谢gzgzlxg给大家带来这么好的文章!
我想gzgzlxg另一个用意是告诉初学者,研究加解密目的并不是为了破解几个软件,而是通过这门技术,可以让自己朝各个方向发展。在这几篇文章里,以API函数为例,讲解如何研究系统底层的一些方法,并打造自己的函数。
2006-3-11 08:30
0
雪    币: 615
活跃值: (1217)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
从1到4,每一篇写的都很精彩!
2006-3-11 08:50
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
谢谢所有关心此帖的朋友,谢谢看雪老大。
2006-3-11 09:03
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
5
写的很详细.

可是 GetFunctionAddress 却有 bug,

没有处理特殊情况, 论坛上很多人都提到过, 自己搜一下.
2006-3-11 10:19
0
雪    币: 440
活跃值: (737)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
6
最初由 gzgzlxg 发布
通往高手的路不是一条平坦的路,一定会遇到许多你根本就想不到的困难,一定要做好充分的思想准备,不要怕挫折,有些问题实在想不通可以放放,也许你在研究别的东西时豁然开朗,触类旁通,那些问题无意中就解决了。
朝思暮想,一招交手,乃门外汉也。不管多好的文章,光看是没有用的,要变成自己的东西,就要实践,不断的写。
在北美你去找一个地产经纪,问买房子的要点是什么,这个经纪会告诉你:
1、Location
........


受教。
“艺多不压身”好像也是你说的。
教训的好。
2006-3-11 10:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 winndy 发布
受教。
“艺多不压身”好像也是你说的。
教训的好。


“艺多不压身”好像也是你说的。
教训的好。 [/QUOTE]
2006-3-11 10:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
写的很详细。
2006-3-11 10:47
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
最初由 simonzh2000 发布
可是 GetFunctionAddress 却有 bug,

没有处理特殊情况, 论坛上很多人都提到过, 自己搜一下.

你是指没有检验基地址的合法性?还是别的?谢谢指点。
2006-3-11 11:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好文章,很高兴看到
2006-3-11 11:33
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
不知下面2个能否正确取出:
kernel32.dll 的 RtlZeroMemory
msvcrt.dll 的 _acmdln
2006-3-11 12:30
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
支持
2006-3-11 12:56
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
13
最初由 gzgzlxg 发布
你是指没有检验基地址的合法性?还是别的?谢谢指点。


hexer 已经给出了具体的例子,  用你的代码调试一下就知道了.
2006-3-11 13:49
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
14
gzgzlxg 辛苦,支持!
2006-3-11 14:31
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
15
问题已经解决,现在可以获得 herXer 所指的这类函数。详细内容请看上面的修正版。
2006-3-11 14:57
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
努力学习,谢谢!
2006-3-11 17:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
usa
17
最初由 gzgzlxg 发布
同样,如何才能成为真正的高手:
1、实践
2、实践
3、实践
金大侠在笑傲江湖有这样一段话(不是原话,是意思),那是发生在华山绝顶,风清杨祖师指点令狐冲武功时,随便从地上拣起一根不知是那个魔教长老的大腿骨,象令狐冲一比划,问这个怎么破,令狐冲说这个不是招啊,这就引出一个绝世真理,无招胜有招。无招胜有招并不是说你什么都不学乱来一气,就能胜过任何人了,这样理解就完全错了,这里的无招是建立在无数招数的艰苦锻炼上而达到的,到你真正理解了这些招数之后,返朴归真而达到从有招到无招的一种境界。写程序也一样,当你真正能从有招过度到无招,那时就是无招胜有招了。那就是当年独孤求败大侠的境界了。这非常符合辩证唯物主义的否定之否定规律,当历史螺旋发展到高级阶段时,可以见到初级阶段的雏影。也就是从什么都不会(无招)学到来去无踪(重返无招)。

........

多么富有哲理性的一段话!楼主应该去当政治老师!
2006-3-11 20:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
写得很详细,先收下来,慢慢学习。
2006-3-12 10:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
特别支持!
2006-3-12 12:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学学,楼主的敬业精神。等我会了,我也这样发给大家.
2006-3-12 13:03
0
雪    币: 375
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我是初学者,现在还看不太懂 !!!!!!!!!1
2006-3-12 18:23
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
22
最初由 usa 发布
多么富有哲理性的一段话!楼主应该去当政治老师!

谢谢,在真实的生活中,我有两个外号,一个叫“大师”,一个叫“大侠”,从外号可以看出,我当个政治老师应该没有问题,读过很多书,包括老马的那三块砖头,哈哈。
2006-3-12 18:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
强烈支持,感谢楼主
2006-3-13 07:38
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
24
强人,语言也很精彩!

拜读-收藏
2006-3-13 09:29
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
25
大侠就是大侠,不但文章好,教人的法子也绝好!受教了
2006-3-13 09:30
0
游客
登录 | 注册 方可回帖
返回
//