我是靠谱客的博主 彪壮抽屉,最近开发中收集的这篇文章主要介绍Shellcode与动态加载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

.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与动态加载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部