加载shellcode

ops/2024/11/18 14:07:11/

​​​​​​

#include <stdio.h>#include <windows.h>DWORD GetHash(const char* fun_name){    DWORD digest = 0;    while (*fun_name)    {        digest = ((digest << 25) | (digest >> 7)); //循环右移 7 位        digest += *fun_name; //累加        fun_name++;    }    return digest;}void main(){    DWORD hash;     hash = GetHash("GetProcAddress");    printf("result of hash is 0x%.8x\n", hash);}
提取shellcode

源码

#pragma code_seg("shellcode")
#include <windows.h>
#pragma comment(linker,"/entry:main")void main()
{//the pointer of kernel32.dll base addressDWORD dwKernel32Addr = 0;_asm {push eaxmov eax, dword ptr fs:[0x30]mov eax, [eax + 0x0C]mov eax,[eax + 0x1C]mov eax, [eax]mov eax, [eax + 0x08]mov dwKernel32Addr, eaxpop eax}PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)dwKernel32Addr;PIMAGE_NT_HEADERS32 pNtHeader = (PIMAGE_NT_HEADERS32)(dwKernel32Addr + pDosHeader->e_lfanew);PIMAGE_DATA_DIRECTORY pDataDirectory = pNtHeader->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT;PIMAGE_EXPORT_DIRECTORY pExportFuncTable = (PIMAGE_EXPORT_DIRECTORY)(dwKernel32Addr + pDataDirectory->VirtualAddress);PDWORD pAddrOfFunc = (PDWORD)(pExportFuncTable->AddressOfFunctions + dwKernel32Addr);PDWORD pAddrOfFuncNames = (PDWORD)(pExportFuncTable->AddressOfNames + dwKernel32Addr);PWORD  pAddrOfOrdinals = (PWORD)(pExportFuncTable->AddressOfNameOrdinals + dwKernel32Addr);DWORD dwFuncGetProcAddress = 0;for (size_t i = 0; i < pExportFuncTable->NumberOfNames; i++){PCHAR lpFuncName = (PCHAR)(pAddrOfFuncNames[i] + dwKernel32Addr);DWORD digest = 0;while (*lpFuncName){digest = ((digest << 25) | (digest >> 7));digest += *lpFuncName;lpFuncName++;}if (digest == 0xbbafdf85)//0xbbafdf85是经过自定义hash算法得到GetProcAddress函数的摘要{dwFuncGetProcAddress = pAddrOfFunc[pAddrOfOrdinals[i]] + dwKernel32Addr;break;}}/*如果是弹窗弹窗,这里我们需要 : LoadLibraryExA、MessageBoxA、ExitProcess、user32.dll*//*定义函数指针GetProcAddress*/typedef    FARPROC (WINAPI *funcGetProcAddress)(HMODULE hModule,LPCSTR lpProcName);funcGetProcAddress pfuncGetProcAddress = (funcGetProcAddress)dwFuncGetProcAddress;/*LoadLibraryExA 函数指针获取*/typedef HMODULE (WINAPI *funcLoadLibraryExA)(LPCSTR lpLibFileName,HANDLE hFile,DWORD dwFlags);//如果采用字符串模式,其字符串会被放入数据段,使用的每次加载地址都不一样,char szLoadLibraryExA[] = { 'L','o','a','d','L','i','b','r','a','r','y','E','x','A','\0' };char szUser32[] = { 'u','s','e','r','3','2','.','d','l','l','\0' };char szMessageBoxA[] = { 'M','e','s','s','a','g','e','B','o','x','A','\0' };char szExitProcess[] = { 'E','x','i','t','P','r','o','c','e','s','s','\0' };funcLoadLibraryExA pfuncLoadLibraryExA = (funcLoadLibraryExA)(pfuncGetProcAddress((HMODULE)dwKernel32Addr,szLoadLibraryExA));/*ExitProcess函数指针*/typedef    VOID(WINAPI *funcExitProcess)(_In_ UINT uExitCode);funcExitProcess pfuncExitProcess = (funcExitProcess)(pfuncGetProcAddress((HMODULE)dwKernel32Addr, szExitProcess));/** 加载user32.dll 和messagebox*/typedef int    (WINAPI    *funcMessageBoxA)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType);funcMessageBoxA pfuncMessageBoxA = (funcMessageBoxA)(pfuncGetProcAddress((HMODULE)(pfuncLoadLibraryExA(szUser32, NULL, NULL)), szMessageBoxA));char szContext[] = {'t','h','i','s',' ','i','s',' ','a',' ','t','e','s','t','\0' };char szTitle[] = { 't','e','s','t','\0' };pfuncMessageBoxA(NULL, szContext, szTitle, MB_OK);pfuncExitProcess(0);
}


http://www.ppmy.cn/ops/134716.html

相关文章

【WiFi】ubuntu20.4 WiFi6 无线抓包环境搭建及使用

环境说明 笔记本电脑&#xff0c;无线网卡AX200&#xff0c;安装ubuntu20.04 安装无线网卡工具aircrack-ng sudo apt-get install aircrack-ng 安装wireshark sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt -y install wireshark sudo apt -…

深入剖析String类的底层实现原理

嘿嘿,家人们,今天咱们来模拟实现string,好啦,废话不多讲,开干! 1:string.h 1.1:构造函数与拷贝构造函数 1.1.1:写法一 1.1.2:写法二(给缺省值) 1.2:赋值运算符重载与operatror[]获取元素 1.3:容量与迭代器 1.4:reserve与resize 1.5:清空与判断是否为空 1.6:push_back与…

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起&#xff1a;最近需要通过iperf3打流&#xff0c;因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常&#xff0c;ubuntu20.04服务器上发送的流量过大…

Python 正则表达式进阶用法:字符集与字符范围详解

Python 正则表达式进阶用法&#xff1a;字符集与字符范围详解 正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中&#xff0c;我们已经了解了基本的正则表达式匹配&#xff0c;如匹配单个字符、字符串开始和结束的位置等。今天&#xff0c;我们将进入正则表达式…

安全见闻(完整版)

目录 安全见闻1 编程语言和程序 编程语言 函数式编程语言&#xff1a; 数据科学和机器学习领域&#xff1a; Web 全栈开发&#xff1a; 移动开发&#xff1a; 嵌入式系统开发&#xff1a; 其他&#xff1a; 编程语言的方向&#xff1a; 软件程序 操作系统 硬件设备…

Leetcode 3354. Make Array Elements Equal to Zero

Leetcode 3354. Make Array Elements Equal to Zero 1. 解题思路2. 代码实现 题目链接&#xff1a;3354. Make Array Elements Equal to Zero 1. 解题思路 这一题是一道easy的题目&#xff0c;本来没想写的&#xff0c;因为完全可以暴力搞定&#xff0c;不过这里还是写了一下…

第1章-PostgreSQL(PG)介绍

第1章-PostgreSQL&#xff08;PG&#xff09;介绍 1、简介2、排名3、发展4、应用5、优势6、对比 1、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版…

【微信小程序】用户房屋管理

一、refresh_token 记录用户登录状态的 token 的有效时间被设置成了8个小时&#xff0c;超过8小时后将不再保持登录的状态了&#xff0c;此种情况下除了让用户重新进行登录外还有一种体验更好的方式&#xff0c;即 refresh_token。 在调用登录接口成功后会返回 token 和 refr…