vvvVvxy 2023-12-26 20:57 采纳率: 75%
浏览 5
已结题

API函数自搜索技术编写shellcode


#include <stdlib.h>
#include <stdio.h>

int main()
{
    __asm
    {
            CLD
            push 0x1E380A6A //压入MessageBoxA-->user32.dll
            push 0x4FD18963 //压入ExitProcess-->kernel32.dll
            push 0x0C917432 //压入LoadLibraryA-->kernel32. 
            mov esi, esp //指向栈中LoadLibraryA的hash值
            lea edi, [esi - 0xc] //预留3个函数地址的空间,后面会利用edi的值来调用不同的函数

            //开辟内存空间,这里是栈空间
            xor ebx, ebx //ebx=0
            mov bh, 0x04 //ebx为0x400
            sub esp, ebx //开辟0x400大小的空间

            //将字符串"user32"入栈
            mov bx, 0x3233 //字符串"32"
            push ebx //压入字符串"32"
            push 0x72657375 //压入字符串"user"
            push esp //esp指向字符串"user32"
            xor edx, edx //edx=0

            //查找kernel32.dll的基地址
            mov ebx, fs: [edx + 0x30] //[TEB+0x30]-->PEB(直接写[0x30] 会出现00指令码)
            mov ecx, [ebx + 0xC] //[PEB+0xC]-->PEB_LDR_DATA
            mov ecx, [ecx + 0x1C] //进入链表第一个就是ntdll.dll
            mov ecx, [ecx] //进入链表第二个就是kernel32.dll
            mov ebp, [ecx + 0x8] //ebp=kernel32.dll的基地址

            //hash的查找相关
find_lib_functions :
            lodsd //即mov eax,[esi],add esi,4。取当前需要查找的 hash
            cmp eax, 0x1E380A6A //与MessageBoxA的Hash进行比较
            jne find_functions //如果不相等则继续查找,否则切换 到user32.dll查找
            xchg eax, ebp //eax<==>ebp交换
            call[edi - 0x8] //如果相等,则LoadLibraryA("user32")
            xchg eax, ebp //eax<==>ebp交换

            //在PE文件中查找相应的API函数
find_functions :
            pushad //保护寄存器
            mov eax, [ebp + 0x3C] //PE头的地址(相对地址)
            mov ecx, [ebp + eax + 0x78] //导出表的地址(相对地址)
            add ecx, ebp //导出表的地址(绝对地址)
            mov ebx, [ecx + 0x20] //函数名称表地址(相对地址)
            add ebx, ebp //函数名称表地址(绝对地址)
            xor edi, edi //清空edi中的内容
            dec edi //edi=-1,用作索引
        
            //循环读取导出表函数
next_function_loop:
            inc edi //edi作为名称序号,自动递增
            mov esi, [ebx + edi * 4] //从函数名称表中读取
            add esi, ebp //esi保存的是函数名称所在的绝对地址
            cdq //把eax的最高位复制到edx的每一位,这里相当于edx=0

            //hash值的运算过程
hash_loop :
            movzx eax, byte ptr[esi] //每次读取一个字节放入eax
            cmp al, ah //eax和0做比较,即结束符
            jz compare_hash //hash计算完毕跳转
            ror edx, 7 //循环右移7位
            add edx, eax //累加
            inc esi //下一个字节
            jmp hash_loop //重复
             //hash值的比较函数
compare_hash :
            cmp edx, [esp + 0x1C] //lodsd和pushad后,esp+1C为待比较的hash值
                jnz next_function_loop //比较不成功则查找下一个函数
                mov ebx, [ecx + 0x24] //函数序号表地址(相对地址)
                add ebx, ebp //函数序号表地址(绝对地址)
                mov di, [ebx + 2 * edi] //名称序号转为地址序号
                mov ebx, [ecx + 0x1C] //函数地址表地址(相对地址)
                add ebx, ebp //函数地址表地址(绝对地址)
                add ebp, [ebx + 4 * edi] //函数地址(绝对地址)
                xchg eax, ebp //eax<==>ebp交换
                pop edi //edi是pushad中最后一个入栈
                stosd //即mov [edi],eax,add edi,4。
                push edi //edi入栈
                popad //恢复寄存器
                cmp eax, 0x1E380A6A //与MessageBox的hash值比较
                jne find_lib_functions

                //下方的代码,就是我们的弹窗
                xor ebx, ebx //清空ebx寄存器
                push ebx //字符串结束符00
                push 0x74736577 //push "west"
                push 0x6C696166 //push "fail"
                mov eax, esp //eax指向"failwest"
                push ebx //push 0
                push eax //push "failwest"
                push eax //push "failwest"
                push ebx //push 0
                call[edi - 0x04] //call MessageBoxA
                push ebx //push 0
                call[edi - 0x08] //call ExitProcess
    }
    system("pause");
    return 0;
}

这段代码在vs2022中运行不了应该怎么改?

  • 写回答

1条回答 默认 最新

  • 柯本 2023-12-27 21:29
    关注

    微软的64位C++编译器不再支持__asm指令,所以你的代码只能用32位编译

    img


    你程序的结果

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 12月26日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了