动态获取API地址
cncpp?
動態(tài)獲取API地址是病毒界和密界中常用的程序設計技術
Author: 屬于中國破解組織 - xIkUg[BCG][DFCG][OCN][DCM][CZG]
Date: 2004-07-28
Email: xikug@163.com
xIkUg's程序園: http://www.xp-program.com
XP-極限編程: http://bbs.xp-program.com
一點理論,Win32系統(tǒng)通過CreateProcess創(chuàng)建進程并運行一個程序。。。
在進入程序時跟一般的應用程序調用Call類似,會在堆棧中壓入一個返回地址。。。這時壓入的是kernel32.dll中一某一個返回地址,我們可以得到這個地址,然后找到kernel32.dll在內存中的基地址,然后找到Export Table,找到我們
需要GetModuleHandleA/LoadLibrary/GetProcAddress這幾個Api函數(shù)的地址,就可以得到想要的Api地址,并在程序中使用了,這需要你對PE文件格式非常清楚
因為沒有導入Api函數(shù),在我們的程序中沒有導入表,因此在OD中要調試這個程序就不能再用Api下斷了,但是也有其他辦法
下面我們來看看如何做,程序中已經(jīng)添加了注釋
001??.386
002??
003??.model flat, stdcall
004??
005??include d:/masm32/include/windows.inc
006??
007??
008??.code
009??
010??GetApiAddress PROC k32Base: DWORD, ApiName: DWORD
011? ?? ?LOCAL? ? NumberOfNames: DWORD
012? ?? ?
013? ?? ?push? ? ebx
014? ?? ?push? ? ecx
015? ?? ?push? ? edx
016? ?? ?push? ? ebp
017? ?? ?push? ? esi
018? ?? ?push? ? edi
019? ?? ?
020? ?? ?mov? ?? ???edi, k32Base
021? ?? ?mov? ?? ???eax, edi
022? ?? ?add? ?? ???eax, [eax + 3Ch]? ?? ?? ?? ?? ? ;Kernel32.dll 的 PeHeader
023? ?? ?
024? ?? ?assume? ? eax: ptr IMAGE_NT_HEADERS
025? ?? ?mov? ?? ???ebx, edi
026? ?? ?add? ?? ???ebx, [eax].OptionalHeader.DataDirectory.VirtualAddress? ? ;IMAGE_EXPORT_DIRECTORY引出表入口
027? ?? ?assume? ? eax: nothing
028??
029? ?? ?mov? ?? ???eax, ApiName
030? ?? ?
031? ?? ?mov? ?? ???ecx, ebx
032? ?? ?mov? ?? ???ebx, [ecx + 1Ch]? ?? ?? ?? ?? ? ;AddressOfFunctions的地址
033? ?? ?
034? ?? ?mov? ?? ???edx, ecx
035? ?? ?mov? ?? ???edx, [edx + 18h]? ?? ?? ?? ?? ? ;NumberOfNames地址
036? ?? ?mov? ?? ???NumberOfNames, edx
037? ?? ?mov? ?? ???edx, ApiName
038? ?? ?? ?? ???
039? ?? ?mov? ?? ???ebp, ecx? ?? ?? ?? ?;IMAGE_EXPORT_DIRECTORY引出表入口
040? ?? ?mov? ?? ???ebp, [ebp + 20h]? ?? ?? ?? ?? ? ;AddressOfNames 地址
041? ?? ?
042? ?? ?mov? ?? ???esi, ecx
043? ?? ?mov? ?? ???esi, [esi + 24h]? ?? ?? ?? ?? ? ;AddressOfNameOrdinals
044? ?? ?
045??
046? ?? ?push? ? ebx
047? ?? ?push? ? ecx
048? ?? ?push? ? esi
049? ?? ?xor? ?? ???ebx, ebx
050? ?? ?xor? ?? ???ecx, ecx
051? ?? ?xor? ?? ???eax, eax
052? ?? ?add? ?? ???ebp, edi
053? ?? ?
054??getApiGetModuleHandleA:
055? ?? ?mov? ?? ???esi, edi
056? ?? ?add? ?? ???esi, [ebp + ecx * 4]
057??
058??cmpAPI:
059? ?? ?mov? ?? ???al, [edx + ebx]
060? ?? ?cmp? ?? ???al, [esi + ebx]
061? ?? ?jne? ?? ???getNext
062? ?? ?inc? ?? ???ebx
063? ?? ?mov? ?? ???al, 0
064? ?? ?cmp? ?? ???al, [esi + ebx]
065? ?? ?jne? ?? ???cmpAPI
066? ?? ?je? ?? ???getOK
067??getNext:
068? ?? ?xor? ?? ???ebx, ebx
069? ?? ?inc? ?? ???ecx
070? ?? ?cmp? ?? ???ecx, NumberOfNames
071? ?? ?jne? ?? ???getApiGetModuleHandleA
072? ?? ?? ?
073??getOK:
074? ?? ?pop? ?? ???esi
075? ?? ?
076? ?? ?add? ?? ???esi, edi
077? ?? ?;ecx 為AddressOfNameOrdinals的index? ?
078? ?? ?xor? ?? ???eax, eax
079? ?? ?mov? ?? ???ax, word ptr [esi + ecx * 4]
080? ?? ?
081? ?? ?pop? ?? ???ebx
082? ?? ?pop? ?? ???ebx
083? ?? ?add? ?? ???ebx, edi
084? ?? ?mov? ?? ???esi, [ebx + ecx * 4]
085? ?? ?add? ?? ???esi, edi? ?? ?? ?? ?? ?? ?? ?? ?;esi為GetModuleHandleA的API地址
086? ?? ?push? ? esi
087? ?? ?pop? ?? ???eax
088??
089? ?? ?pop? ?? ???edi
090? ?? ?pop? ?? ???esi
091? ?? ?pop? ?? ???ebp
092? ?? ?pop? ?? ???edx? ?
093? ?? ?pop? ?? ???ecx? ?
094? ?? ?pop? ?? ???ebx
095? ?? ?? ?
096? ?? ?ret
097??
098??GetApiAddress endp
099??
100??start:
101? ?? ?;搜索kernel32.dll的基地址
102? ?? ?mov? ?? ???eax, [esp]
103? ?? ?and? ?? ???eax, 0ffff0000h
104? ?? ?
105? ?? ?xor? ?? ???edx, edx
106? ?? ?
107??getK32Base:
108? ?? ?dec? ???eax? ?? ?? ?? ?? ?? ?? ?? ?? ???;逐字節(jié)比較驗證
109? ?? ?mov? ???dx,word??ptr [eax+IMAGE_DOS_HEADER.e_lfanew]? ?;就是ecx+3ch
110? ?? ?test? ? dx,0f000h? ?? ?? ?? ?? ?? ?? ???;Dos Header+stub不可能太大,超過4096byte
111? ?? ?jnz? ???getK32Base? ?? ?? ?? ?? ?? ?? ? ;加速檢驗
112? ?? ?cmp? ???eax,dword ptr [eax+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
113? ?? ?jnz? ???getK32Base? ?? ?? ?? ?? ?? ?? ? ;看Image_Base值是否等于ecx即模塊起始值,
114? ?? ?mov? ?? ???edi, eax
115? ?? ?
116? ?? ?mov? ?? ???eax, offset sGetModuleHandleA
117? ?? ?push? ? eax
118? ?? ?push? ? edi
119? ?? ?call? ? GetApiAddress
120? ?? ?mov? ?? ???esi, eax? ?? ?? ?? ?? ?? ?? ?? ?;esi為GetModuleHandleA的API地址
121? ?? ?
122? ?? ?
123? ?? ?mov? ?? ???eax, offset sLoadLibraryA
124? ?? ?push? ? eax
125? ?? ?push? ? edi
126? ?? ?call? ? GetApiAddress? ?? ?? ?? ?? ?? ???;ebp為LoadLibraryA的API地址
127? ?? ?mov? ?? ???ebp, eax
128? ?? ?
129? ?? ?mov? ?? ???eax, offset sGetProcAddress
130? ?? ?push? ? eax
131? ?? ?push? ? edi
132? ?? ?call? ? GetApiAddress
133? ?? ?mov? ?? ???edi, eax? ?? ?? ?? ?? ?? ?? ?? ?;edi為GetProcAddress的API地址
134? ?? ?
135? ?? ?mov? ?? ???eax, offset sUser32
136? ?? ?push? ? eax
137? ?? ?call? ? ebp
138? ?? ?
139? ?? ?mov? ?? ???ebx, offset sApiMessageBoxA
140? ?? ?push? ? ebx
141? ?? ?push? ? eax
142? ?? ?call? ? edi
143? ?? ?
144? ?? ?mov? ?? ???esi, eax? ?? ?? ?? ?? ?? ?? ?? ?;eax為MessageBoxA
145? ?? ?
146? ?? ?? ?
147? ?? ?push? ? 0
148? ?? ?mov? ?? ???eax, offset sTitle
149? ?? ?push? ? eax
150? ?? ?mov? ?? ???eax, offset sCaption
151? ?? ?push? ? eax
152? ?? ?push? ? 0
153? ?? ?call? ? esi
154? ?? ?
155? ?? ?ret? ?? ???
156??
157? ?? ?sGetModuleHandleA? ?? ???db? ?? ???'GetModuleHandleA', 0
158? ?? ?sGetProcAddress? ?? ?? ?? ?db? ?? ???'GetProcAddress', 0
159? ?? ?sLoadLibraryA? ?? ?? ?? ?db? ?? ???'LoadLibraryA',0
160? ?? ?sFreeLibrary? ?? ?? ?? ?db? ?? ???'FreeLibrary',0
161? ?? ?sUser32? ?? ?? ?? ?? ?? ???db? ?? ???'user32',0
162? ?? ?
163? ?? ?sApiMessageBoxA? ?? ?? ?? ?db? ?? ???'MessageBoxA',0
164? ?? ?
165? ?? ?sCaption? ?? ?? ?? ?? ? db? ?? ???'Hello xIkUg!',0
166? ?? ?sTitle? ?? ?? ?? ?? ?? ???db? ?? ???'test',0
167? ?? ?
168??end start
169??
源代碼可到我的論壇下載:http://bbs.xp-program.com
總結
- 上一篇: 3DSlicer5:开发者必晓ABC
- 下一篇: 3DSlicer6:编译、调试、规范化的