非调用手法获取API
来源:互联网 发布:美国纽约枪击案 知乎 编辑:程序博客网 时间:2024/05/07 00:28
使用非调用手法获取API,其实是PE病毒的基本手段之一。
搜索输出表,导出GetModuleHandle,LoadLibraryA,GetProcAddress函数的地址,然后用LoadLibraryA调用USER32.DLL,然后再使用GetProcAddress得到MessageBoxA()的函数,得到输出框。
GetModuleHandle暂时没用到。。。汗一个。
.386
.model flat
;kernel_ equ 0BFF70000h
.data
szTitle db "Test for GetApi",0
szMessage db "perfect,we got the api!",0
u32 db "User32.dll",0
kernel dd ?
Counter dd 00000000h
heap_start label byte
dd 00000000h
AddressTableVA dd 00000000h
OrdinalTableVA dd 00000000h
NameTableVA dd 00000000h
@@Offset label byte
_MessageBoxA dd 00000000h
@@Namez label byte
@MessaeBoxA db "MessageBoxA",0
_Namez label byte
@GetModuleHandle db "GetModuleHandleA",0
@GetProcAddress db "GetProcAddress",0
@LoadLibraryA db "LoadLibraryA",0
@ExitProcess db "ExitProcess",0
db 0BBh
_Offsetz label byte
_GetModuleHandle dd 00000000h
_GetProcAddress dd 00000000h
_LoadLibraryA dd 00000000h
_ExitProcess dd 00000000h
;_MessageBoxA dd 00000000h
heap_end label byte
.code
s_start label byte
test1:
call delta
delta:
pop ebp ;重定位
sub ebp,offset delta ;ebp得到修正值
mov esi,[esp] ;Kernal32的地址
and esi,0ffe00000h ;数据对齐
call GetK32 ;返回EAX=得到的 KENNEL地址
; mov dword ptr [ebp+kernel],eax
; mov dword ptr [ebp+kernel],eax
lea edi,[ebp+kernel]
stosd
lea edi,[ebp+_Offsetz]
lea esi,[ebp+_Namez]
call GetAPIs
push offset u32
call dword ptr [ebp+_LoadLibraryA]
lea edx,[ebp+@MessaeBoxA]
push edx
push eax
mov eax,dword ptr [ebp+_GetProcAddress]
call eax
xor ebx,ebx
push ebx
push offset szTitle
push offset szMessage
push ebx
call eax
push 00h
call [ebp+_ExitProcess]
GetK32:
_1:
cmp word ptr [esi],"ZM" ;对照是否MZ
jz CheckPE
_2:
sub esi,10000h ;不是就减去一页再次对比
jmp _1
CheckPE:
mov edi,[esi+3ch] ;找到对应PE
add edi,esi ;相对地址转绝对地址
cmp dword ptr [edi],"EP" ;对照是否“PE”
jz WeGotK32 ;是,我们得到K32地址。
jmp _2 ;不是。。。汗一个。重来。。
;WeFailed: 暂时没用它。。
; mov esi,0BFF70000h
WeGotK32:
xchg eax,esi ;eax= address of k32
ret
GetAPI proc
mov edx,esi ; Save ptr to name
@_1: cmp byte ptr [esi],0 ; Null-terminated char?
jz @_2 ; Yeah, we got it.
inc esi ; Nopes, continue searching
jmp @_1 ; bloooopz...
@_2: inc esi ; heh, don't forget this ;)
sub esi,edx ; ESI = API Name size
mov ecx,esi ; ECX = ESI :)
xor eax,eax ; EAX = 0
mov word ptr [ebp+Counter],ax ; Counter set to 0
mov esi,[ebp+kernel] ; Get kernel's PE head. offset
add esi,3Ch
lodsw ; in AX
add eax,[ebp+kernel] ; Normalize it
mov esi,[eax+78h] ; Get Export Table RVA
add esi,[ebp+kernel] ; Ptr to Address Table RVA
add esi,1Ch
lodsd ; EAX = Address Table RVA
add eax,[ebp+kernel] ; Normalize
mov dword ptr [ebp+AddressTableVA],eax ; Store it in VA form
lodsd ; EAX = Name Ptrz Table RVA
add eax,[ebp+kernel] ; Normalize
push eax ; mov [ebp+NameTableVA],eax
lodsd ; EAX = Ordinal Table RVA
add eax,[ebp+kernel] ; Normalize
mov dword ptr [ebp+OrdinalTableVA],eax ; Store in VA form
pop esi ; ESI = Name Ptrz Table VA
@_3: push esi ; Save ESI for l8r restore
lodsd ; Get value ptr ESI in EAX
add eax,[ebp+kernel] ; Normalize
mov esi,eax ; ESI = VA of API name
mov edi,edx ; EDI = ptr to wanted API
push ecx ; ECX = API size
cld ; Clear direction flag
rep cmpsb ; Compare both API names
pop ecx ; Restore ECX
jz @_4 ; Jump if APIs are 100% equal
pop esi ; Restore ESI
add esi,4 ; And get next value of array
inc word ptr [ebp+Counter] ; Increase counter
jmp @_3 ; Loop again
@_4: pop esi ; Avoid shit in stack
movzx eax,word ptr [ebp+Counter] ; Get in AX the counter
shl eax,1 ; EAX = AX * 2
add eax,dword ptr [ebp+OrdinalTableVA] ; Normalize
xor esi,esi ; Clear ESI
xchg eax,esi ; EAX = 0, ESI = ptr to Ord
lodsw ; Get Ordinal in AX
shl eax,2 ; EAX = AX * 4
add eax,dword ptr [ebp+AddressTableVA] ; Normalize
mov esi,eax ; ESI = ptr to Address RVA
lodsd ; EAX = Address RVA
add eax,[ebp+kernel] ; Normalize and all is done.
ret
GetAPI endp
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
GetAPIs proc
@@1: push esi
push edi
call GetAPI
pop edi
pop esi
stosd
@@2: cmp byte ptr [esi],0
jz @@3
inc esi
jmp @@2
@@3: cmp byte ptr [esi+1],0BBh
jz @@4
inc esi
jmp @@1
@@4: ret
GetAPIs endp
;kernel dd kernel_
;kernel_ equ 077e60000h
;@@Namez label byte
;@MessaeBoxA db "MessageBoxA",0
align dword
s_end label byte
end test1
最后我们看到了感动的弹出框,perfect,we got the api。
是不是应该激动一下。应该是。因为我们并没有调用任何的函数,挺不容易的,一个小程序耗费了很长时间,
其实还是基础太差。。加强ING。。。
- 非调用手法获取API
- 调用API获取话筒声音
- 调用Win32 Api函数,非托管DLL
- 调用Win32 Api函数,非托管DLL
- 调用API函数,非客户区绘图
- 调用百度API获取歌曲列表
- 调用百度API获取歌曲列表
- 通过调用文摘列表API获取文摘
- c++调用api实现获取修改屏幕分辨率
- 调用百度地图API获取经纬度
- 调用远程API接口,获取服务器数据
- 如何调用FindWindow API获取主窗体
- Java通过调用API获取zabbix监控
- OpenStack API 初探(调用API获取OpenStack信息)
- C# winform使用系统API播放音乐(非调用控件)
- C 调用API函数删除非空目录
- Windows非公开API函数的调用办法
- 调用windows api删除非空文件夹无法删除问题
- 用flash动作脚本动态创建和控制文本框
- GRETA 正则表达式库
- Flash制作文本框滚动缓冲效果
- 魔兽局域网协议UDP部分详细解释
- RTF文件格式
- 非调用手法获取API
- 为flash构建asp.net Webservice
- 打造CSDN里最有个性的Blog版面(HTML+CSS)
- 使用SOS - 在Visual Studio中启用非托管代码调试来支持本机代码调试
- 从阿瑞纳斯身上得到的启发
- zz:Tomcat的中文乱码的经典解决方案
- Liferay源码-配置文件
- Neoshine linux 3.0中JAVA中文显示环境的配置
- Net 下安装、调试的常见问题与错误!!!