概述
.386
.model flat,stdcall
option casemap:none
include windows.inc
.code;代码段
start:;好了我们开始我们的Shellcode代码
push ebp
sub esp,100
mov ebp,esp;预留函数地址空间下面我们把动态库基址和函数地址都存在ebp里面
;*********************************************************************************
assume fs:nothing
xor ecx,ecx
mov eax,fs:[30h]
mov eax,[eax + 0ch]
mov esi,[eax + 1ch]
next_module:
mov eax,[esi+08h]
mov edi,[esi+20h]
mov esi,[esi]
cmp [edi+12*2],cx
jnz next_module;这里是实现搜索KERNEL32基址的
MOV [ebp+40],eax;把得到的KERNEL32基址保存倒[ebp+40] ,xp win7 64位通杀
mov edx,eax
;*********************************************************************************
mov eax,(IMAGE_DOS_HEADER ptr [edx]).e_lfanew ;得到IMAGE_NT_HEADERS地址
mov eax,(IMAGE_NT_HEADERS ptr [edx + eax]).OptionalHeader.DataDirectory.VirtualAddress ;得到导出表RVA
add eax,edx ;导出表在内存的实际地址
assume eax:ptr IMAGE_EXPORT_DIRECTORY
mov esi,[eax].AddressOfNames
add esi,edx
push 00007373h ;在堆栈中构造GetProcAddress
push 65726464h
push 41636F72h
push 50746547h
push esp
xor ecx,ecx
.repeat
mov edi,[esi]
add edi,edx
push esi
mov esi,[esp + 4]
push ecx
mov ecx,0fh ;GetProcAddress的长度,包括0
repz cmpsb
.break .if ZERO? ;找到跳出循环
pop ecx
pop esi
add esi,4
inc ecx
.until ecx >= [eax].NumberOfNames
pop ecx
mov esi,[eax].AddressOfNameOrdinals
add esi,edx
movzx ecx,word ptr [esi + ecx*2] ;取出序数
mov esi,[eax].AddressOfFunctions
assume eax:nothing
add esi,edx
mov esi,[esi + ecx*4]
add esi,edx
mov edi,edx;搜索得到GetProcAddress地址
MOV [ebp+45],esi;把得到的GetProcAddress函数地址保存倒[ebp+45]
;*********************************************************************************
push 00000000h
push 41797261h
push 7262694Ch
push 64616F4Ch;在栈中构造LoadLibraryA
push esp
push edx
call dword ptr [ebp+45];;调用GetProcAddress获取LoadLibraryc地址
MOV [ebp+60],eax;把得到的LoadLibrary函数地址保存倒[ebp+60]
;*********************************************************************************
;好了 现在我们得到了LoadLibrary函数的地址和GetProcAddress函数的地址
;下面我们实现个简单的MessageBox
;MessageBox函数是在user32.dll动态库里面
;现在我们可以用LoadLibrary函数载入指定的动态链接库
call _user32
db 'user32',0;user32.dll动态库字符串
_user32:
pop ebx;这个是把上面我们的user32.dll动态库的字符串保存倒ebx里面
push ebx
call dword ptr [ebp+60];调用LoadLibrary函数得到user32.dll动态库基址
mov [ebp+65],eax;把user32.dll动态库基址保存倒[ebp+65]里面
call _msg
db 'MessageBoxA',0;MessageBox函数字符串要记得加个大写的A
_msg:
pop ebx;这个是把上面我们的MessageBox函数的字符串保存倒ebx里面
push ebx
push eax
call dword ptr [ebp+45];调用GetProcAddress函数得到MessageBox函数地址
mov [ebp+70],eax;把MessageBox函数地址保存倒 [ebp+70]里面
call _hello
db 'hello',0;我们还是用这个方法保存字符串
_hello:
pop ebx;把上面的字符串保存倒ebx
call _11
db '测试',0
_11:
pop edx;把上面的字符串保存倒ebx
push 0
push edx;这里是我们保存的hello
push ebx;这里是我们上面保存的【测试】
push 0
call dword ptr [ebp+70];好了我们调用MessageBox函数
;*********************************************************************************
;我就编写倒这里了 用这个方法可以编写你想要的程序了
;这里我们还是用同样的方法得到ExitProcess函数
call _exit
db 'ExitProcess',0
_exit:
pop ebx
push ebx
push [ebp+40]
call dword ptr [ebp+45]
push 0
call eax
;这段我就不注释了 给你们自己研究!
;*********************************************************************************
end start
最后
以上就是彪壮抽屉为你收集整理的Shellcode与动态加载的全部内容,希望文章能够帮你解决Shellcode与动态加载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复