专栏首页逆向技术strstr ShellCode实现

strstr ShellCode实现

ShellCode 如下

目录

strstr ShellCode实现

1.函数原型

 char* Mystrstr(const char* SrcStrPtr, const char* SubStrPtr)
{
    int nCount;
    if (*SubStrPtr)             //判断寻找的SubStr是否为空.
    {
        while (*SrcStrPtr)      //判断寻找的srcStr是否为空,不为空循环
        {
            //内部循环判断.每次 str指针++ 判断跟 substr++ 是否相等.
            for (nCount = 0; *(SrcStrPtr + nCount) == *(SubStrPtr + nCount); nCount++)

            {
                //如果substrptr + 1 没有.则返回找到的字符串.
                if (!*(SubStrPtr + nCount + 1))
                {
                    return(char*)SrcStrPtr;
                }

            }
            SrcStrPtr++;
        }
        return NULL;
    }
    else
        return (char*)SrcStrPtr;
}

2.ShellCode提取.

注意是外平栈. 调用者平展. 有两个参数. 所以在调用的时候.你需要 add esp , 8

UCHAR g_StrstrShellCode[] =
{
	0X55,
	0X8B,0xEC,
	0X53,
	0X57,
	0X8B,0X7D,0X0C,
	0X8A,0X1F,
	0X84,0XDB,
	0X74,0X3E,
	0X56,
	0X8B,0X75,0X08,
	0X8A,0X06,
	0X84,0XC0,
	0X74,0X26,
	0X8B,0XD6,
	0X2B,0XD7,
	0X0F,0X1F,0X40,0X00,

	0X3A,0XC3,
	0X75,0X11,
	0X8B,0XC7,


	0X8A,0X48,0X01,
	0X8D,0X40,0X01,
	0X84,0XC9,
	0X74,0X15,
	0X38,0X0C,0X02,
	0X74,0XF1,

	0X8A,0X46,0X01,
	0X46,
	0X42,
	0X84,0XC0,
	0X75,0XE2,

	0X5E,
	0X5F,
	0X33,0XC0,
	0X5B,
	0X5D,
	0XC3,

	0x8b,0xc6,
	0x5e,
	0x5f,
	0x5b,
	0x5d,
	0xc3,

	0x8b,0x45,0x08,
	0x5f,
	0x5b,
	0x5d,
	0xc3
};

3.汇编代码如下

push    ebp
mov     ebp, esp
push    ebx
push    edi
mov     edi, dword ptr ss:[ebp + 0xC]
mov     bl, byte ptr ds:[edi]
test    bl, bl
je      0x7E004C                              //重定位
push    esi
mov     esi, dword ptr ss:[ebp + 0x8]
mov     al, byte ptr ds:[esi]
test    al, al
je      0x7E003E                              //重定位
mov     edx, esi
sub     edx, edi
nop     dword ptr ds:[eax], eax
cmp     al, bl
jne     0x7E0035                              //重定位
mov     eax, edi
mov     cl, byte ptr ds:[eax + 0x1]
lea     eax, dword ptr ds:[eax + 0x1]
test    cl, cl
je      0x7E0045                             //重定位
cmp     byte ptr ds:[edx + eax], cl
je      0x7E0026                             //重定位
mov     al, byte ptr ds:[esi + 0x1]
inc     esi
inc     edx
test    al, al
jne     0x7E0020                             //重定位
pop     esi
pop     edi
xor     eax, eax
pop     ebx
pop     ebp
ret     
mov     eax, esi
pop     esi
pop     edi
pop     ebx
pop     ebp
ret     
mov     eax, dword ptr ss:[ebp + 0x8]
pop     edi
pop     ebx
pop     ebp
ret     

带有重定位说明.是因为我是直接把汇编考出来的. ShellCode 在内存中查看.可以看到其实自己已经重定位好了. 这是是方便直观贴出来的.

想直接在内存看可以用如下代码

LPVOID lpShellCodeMemory = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(lpShellCodeMemory, g_StrstrShellCode, 0x200);

Od附加. 当memcpy执行完毕之后 去 lpShellCodeMemory 内存查看即可.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 16位汇编第九讲汇编指令以及逆向中的花指令

                                          16位汇编第九讲汇编指令以及逆向中的花指令 一丶LOOP指令(循环指令) 作用:  ...

    IBinary
  • 逆向知识第八讲,if语句在汇编中表达的方式

               逆向知识第八讲,if语句在汇编中表达的方式 一丶if else的最简单情况还原(无分支情况) 高级代码: #include "stdafx...

    IBinary
  • MFC原理第四讲.动态创建机制

        动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷.

    IBinary
  • 8086汇编语言——向显示缓冲区中写入数据

    注意这段代码请不要Debug,直接运行即可。结果如下所示:最后一行的效果是闪烁显示。

    zy010101
  • python3 对拉勾数据进行可视化分析

      上回说到我们如何如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息。(本次博客源码地址:http...

    py3study
  • 将文本文件的内容存储在DataSet中的方法总结

        项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作。在.NET项目中较多的会使用DataSet,DataTable进行...

    彭泽0902
  • 魅蓝Note3降级教程

    刺_猬
  • 不传之密:杀毒软件开发之感染型病毒查杀、启发式杀毒

    在前文《不传之密:杀毒软件开发,原理、设计、编程实战》中,讲述了基于特征码的杀毒软件开发。本文作为继章,将继续介绍杀毒软件开发:感染型病毒的查杀。

    FB客服
  • c++工程编译记录

    墨文
  • 反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

    本文转载自Python编程时光(ID:Python-Time) 交互式“_”操作符

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券