通用ShellCode学习笔记——win7中获得LoadLibraryA地址

本文介绍了一种在Windows 7环境下编写ShellCode的方法,包括如何遍历查询获取kernel32.dll地址,并进一步获取GetProcAddress及LoadLibraryA的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ShellCode的编写

  1. Kernel32地址的获取

由于win7的_PEB_LDR_DATA表和以前的系统有了改变,直接查询0x08方式在win7下失效,为了保证shellcode的通用性(主要是增加对win7的支持),采用遍历查询的方式定位kernel32的位置

esi=fs:0->TEB

esi=TEB:30h->PEB

esi=PEB:0ch->_PEB_LDR_DATA

esi=_PEB_LDR_DATA:1ch->内存中的dll的地址

[esi]-> 内存中的下一个dll的地址(00h指向下一个Ldr_Module)

[esi+08h]->esi指向的地方的下一个dll的地址

edi->esi指向的地址的尾部

示意图:


 

 

 

 

我们需要找的kernel32.dll长度为12,用od跟踪发现kernel32.dll的函数名在内存中为“k e r n e l 3 2 . d l l”,即是说,我们查找到某个函数第24(12×2)的位置为空(字符串结尾),即是我们要找的kernel32.dll

 

代码:

push ebp

                    xor ecx,ecx

                    mov esi,fs:0x30

                    mov esi, [esi + 0x0C];

                    mov esi, [esi + 0x1C];

next_module:

                    mov ebp, [esi + 0x08];

                    mov edi, [esi + 0x20];

                    mov esi, [esi];

                    cmp [edi + 12*2],cl  

                    jne next_module

                    movedi,ebp;BaseAddr of Kernel32.dll

  1. GetProcAddress地址的获取

有了kernel32的地址以后,我们就可以方便的通过遍历的方式查询到GetProcAddress的地址

sub esp,100

                    movebp,esp;

                    moveax,[edi+3ch];pe header

                    movedx,[edi+eax+78h]

                    add edx,edi

                    movecx,[edx+18h];number of functions

                    movebx,[edx+20h]

                    addebx,edi;AddressOfName

search:

           dec ecx

           mov esi,[ebx+ecx*4]

           add esi,edi;

           moveax,0x50746547;PteG("GetP")

           cmp [esi],eax

           jne search

           moveax,0x41636f72;Acor("rocA")

           cmp [esi+4],eax

           jne search

           mov ebx,[edx+24h]

           add ebx,edi;indexaddress

           mov cx,[ebx+ecx*2]

           mov ebx,[edx+1ch]

           add ebx,edi

           mov eax,[ebx+ecx*4]

           add eax,edi

           mov [ebp+76],eax;将GetProcAddress地址存在ebp+76中

  1. LoadLibraryA地址的获取

通过调用API函数GetProcAddress获取LoadLibraryA的地址

    push 0;

           push DWORD PTR0x41797261;Ayra("aryA")

           push DWORD PTR0x7262694c;rbiL("Libr")

           push DWORD PTR0x64616f4c;daoL("Load")

           push esp

           push edi

           call [ebp+76]

           mov[ebp+80],eax;将LoadLibraryA地址存在ebp+80中

转载于:https://www.cnblogs.com/zodiac/archive/2010/09/19/1830968.html

### 编写通用Shellcode教程 编写通用Shellcode是一项复杂而敏感的任务,通常用于安全研究和渗透测试。为了确保Shellcode能够在不同环境中稳定运行,需考虑多种因素。 #### 1. Shellcode设计原则 - **平台独立性**:理想的Shellcode应能在多个操作系统版本上执行相同功能。 - **位置无关代码(PIC)**:由于加载地址不确定,Shellcode不应依赖固定内存位置。 - **避免坏字符**:某些字节可能会被过滤器拦截或破坏指令流,因此要避开这些特殊字符[^1]。 ```assembly ; Example of PIC assembly code avoiding null bytes and other bad characters section .text global _start _start: xor eax, eax ; Clear EAX register to avoid any initial values push eax ; Push a zero onto the stack as terminator for strings ; This also helps in creating position-independent code ``` #### 2. 获取API函数指针的方法 当调用Windows API时,直接硬编码导入表中的偏移量是不可取的做法,因为这会降低兼容性和可移植性。相反,可以通过遍历PE结构来动态解析所需函数的位置: - 使用`LoadLibraryA()`加载目标DLL; - 调用`GetProcAddress()`获取具体函数入口点; 这种方法虽然增加了实现难度,但却提高了灵活性和适应范围。 #### 3. 处理异常情况 如果检测到程序已被篡改,则可能需要采取额外措施以恢复正常操作流程或终止进程以防进一步损害。例如,在发现二进制文件损坏的情况下,可以尝试重新启动应用程序或将控制权转移给另一个实例[^2]。 #### 4. 利用已知模块基址构建可靠跳转序列 对于特定应用环境下的Shellcode开发而言,利用已加载的合法模块作为参照物是一种有效策略。通过Windbg等调试工具查询活动进程中各模块的实际映射区间,并据此规划后续逻辑走向能够显著提升成功率。比如针对BlazeDVD软件家族成员所占用的空间段落进行分析后得知其内部存在一段适合用来间接访问其他资源的关键路径[^3]。 ```nasm mov ecx, dword ptr ds:[esp+4] ; Assume ECX now holds base address like 0x64xxxxxx add ecx, offset_to_function_of_interest ; Calculate target function's VA based on module base jmp ecx ; Jump there directly without hardcoding absolute addresses ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值