计算机病毒——代码自解密

  • 原理
  • 实现
  • 第一个程序代码
  • 获取加密后的内容
  • 修改工程属性
  • (可选)美化源代码

原理

获取内存中代码段中需解密的片段,并解密。

实现

为了方便,使用xor进行加解密,并使用密钥为8。需要MASMPlus和W32Dasm。

第一个程序代码

这里的代码并没有加密,但却在运行时解密,因此会运行时错误。

.386
.model flat, stdcall
option casemap :noneinclude windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.incincludelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.datalpMsg      db "I can decrypt myself!",0.data?buffer  db MAX_PATH dup(?).CODE
START:mov edi,Virus_startmov ecx,Virus_endsub ecx,edimov eax,8
Decrypt:xor [edi],eaxinc ediloop Decrypt
Virus_start:push offset lpMsgcall StdOut;invoke StdOut,offset lpMsg
Virus_end:invoke StdOut,offset lpMsginvoke StdIn,addr buffer,sizeof bufferinvoke ExitProcess,0end START

用W32Dasm反编译,需要被加密代码(反汇编略)为

:0040101F 6800304000
:00401024 E828000000

提取机器码:6800304000E828000000

获取加密后的内容

上一个C++写的程序来加密这段代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned char BYTE;
typedef unsigned int DWORD;
BYTE buff[2];
const BYTE key = 8;
BYTE value;BYTE scan(BYTE buf[2]);
void print(BYTE x,FILE* f);
int main();BYTE scan(BYTE buf[2])
{BYTE tmp=0;if(buf[0]>='0'&&buf[0]<='9') tmp=buf[0]-'0';else tmp=buf[0]-'A'+10;tmp=tmp*16;if(buf[1]>='0'&&buf[1]<='9') tmp+=buf[1]-'0';else tmp+=buf[1]-'A'+10;return tmp;
}
void print(BYTE x,FILE* f)
{fprintf(f,"\tdb ");BYTE tmp[2];tmp[0]=x/16;tmp[1]=x%16;if(tmp[0]>=0&&tmp[0]<=9) fprintf(f,"%c",tmp[0]+'0');else fprintf(f,"%c",tmp[0]+'A'-10);if(tmp[1]>=0&&tmp[1]<=9) fprintf(f,"%c",tmp[1]+'0');else fprintf(f,"%c",tmp[1]+'A'-10);fprintf(f,"h\n");
}
int main()
{FILE* f=fopen("1.code","r");FILE* n=fopen("1.decode","w");while(fread(buff,1,2,f)!=0){value=scan(buff);value=value^key;print(value,n);}
}

把刚才的机器码写入1.code中,运行这个C++程序,在1.decode中得到

 db 60hdb 08hdb 38hdb 48hdb 08hdb E0hdb 20hdb 08hdb 08hdb 08h

这是不符合Masm标准的,修改为

 db 60hdb 08hdb 38hdb 48hdb 08hdb 0E0hdb 20hdb 08hdb 08hdb 08h

接着替换原来的汇编代码

.386
.model flat, stdcall
option casemap :noneinclude windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.incincludelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.datalpMsg      db "I can decrypt myself!",0.data?buffer  db MAX_PATH dup(?).CODE
START:mov edi,Virus_startmov ecx,Virus_endsub ecx,edimov eax,8
Decrypt:xor [edi],eaxinc ediloop Decrypt
Virus_start:db 60hdb 08hdb 38hdb 48hdb 08hdb 0E0hdb 20hdb 08hdb 08hdb 08h;invoke StdOut,offset lpMsg
Virus_end:invoke StdOut,offset lpMsginvoke StdIn,addr buffer,sizeof bufferinvoke ExitProcess,0end START

修改工程属性

然而,Windows下代码段默认不可写,需要修改段属性。在链接参数后补上 /section:.text,rw 即可。

(可选)美化源代码

源代码有很多db,不好看,再次使用W32Dasm反编译,得到

:00401016 60                      pushad
:00401017 0838                    or byte ptr [eax], bh
:00401019 48                      dec eax
:0040101A 08E0                    or al, ah
:0040101C 2008                    and byte ptr [eax], cl
:0040101E 0808                    or byte ptr [eax], cl

用反编译代码替换源代码

.386
.model flat, stdcall
option casemap :noneinclude windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.incincludelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.datalpMsg      db "I can decrypt myself!",0.data?buffer  db MAX_PATH dup(?).CODE
START:mov edi,Virus_startmov ecx,Virus_endsub ecx,edimov eax,8
Decrypt:xor [edi],eaxinc ediloop Decrypt
Virus_start:pushador byte ptr [eax], bhdec eaxor al, ahand byte ptr [eax], clor byte ptr [eax], cl;invoke StdOut,offset lpMsg
Virus_end:invoke StdOut,offset lpMsginvoke StdIn,addr buffer,sizeof bufferinvoke ExitProcess,0end START

然而,or al,ah 却编译成了0AC4,因此最终代码如下

.386
.model flat, stdcall
option casemap :noneinclude windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.incincludelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.datalpMsg      db "I can decrypt myself!",0.data?buffer  db MAX_PATH dup(?).CODE
START:mov edi,Virus_startmov ecx,Virus_endsub ecx,edimov eax,8
Decrypt:xor [edi],eaxinc ediloop Decrypt
Virus_start:pushador byte ptr [eax], bhdec eaxdb 08hdb 0E0hand byte ptr [eax], clor byte ptr [eax], cl;invoke StdOut,offset lpMsg
Virus_end:invoke StdOut,offset lpMsginvoke StdIn,addr buffer,sizeof bufferinvoke ExitProcess,0end START

运行结果

计算机病毒——代码自解密相关推荐

  1. 《IDA Pro 代码破解解密》笔记一

    博客地址:http://blog.csdn.net/qq1084283172/article/details/53158970 return 0;  C语言返回0语句的汇编形式 Intel-32汇编: ...

  2. 某段\x 16进制和unicode加密与混淆js代码的解密与反加密

    某天,在鼓捣一个ems系统,想用来做成新闻资讯类网站.弄了好多天,各个框架和结构都差不多了,重新调整了结构,一个偶然的机会,发现搜索框点击的时候不能自动清空先前的内容,于是想添加一段js代码去修改,找 ...

  3. Cyberpunk2077—赛博朋克2077 中代码矩阵解密小游戏之最优解寻找

    Cyberpunk2077-赛博朋克2077 代码矩阵解密小游戏之最优解寻找 解密小游戏描述 基本规则 问题描述 问题解决算法 结果展示 代码分享 解密小游戏描述 赛博朋克2077中有个很有意思的小解 ...

  4. js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS

    HTML & Javascript 相互转换 < body > HTML & Javascript 输入 & 输出 < br > < script ...

  5. python代码加密解密_在python中加密 – 在Javascript中解密

    您的Python代码和CryptoJS代码存在许多问题: >您使用随机IV加密Python中的一些明文.如果要检索该明文,则需要在解密期间使用相同的IV.没有IV,明文就无法恢复.通常,IV只是 ...

  6. js的eval代码快速解密

    有一段js代码内容如下: eval(function(E,I,A,D,J,K,L,H){function C(A)后面内容省略... 解密可以采用如下方法: 方法一: 打开谷歌浏览器,按F12,在Co ...

  7. js怎么实现对html代码加密解密,JS实现Base64加密解密

    JavaScript实现Base64加密解密.Base64与其说是加密算法不如说是方便数据传输而生的数据转换手段. 测试代码:html> test .resource_enc, .resourc ...

  8. python凯撒加密代码_解密题(凯撒密码)

    在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一 ...

  9. python代码加密解密_Python加密解密代码

    ''' 作业:中英文加密+解密 做题思路:先练习单独用ascii和汉字加密和解密,见作业后的encode_game和decode_game 爬取中文用的是BeautifulSoup 作业encode_ ...

  10. 超强计算机病毒代码,木马编程 之超强服务... 附代码 原创.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 } BOOL AddSvchostGroup(VOID) { HKEY hkey;//其实是一个句柄. if( RegOpenKey(HKEY_LOCAL ...

最新文章

  1. Java项目:智能制造生产管理平台(java+SSM+mysql+Maven+Easyui+JSP)
  2. 调查显示:手机单芯片处理器作用日显重要
  3. PPIO 商业化架构解析
  4. 傅里叶变换(待总结)
  5. ICCV 2021 | 腾讯、华中科大提出QueryInst,开启基于Query的实例分割新思路
  6. 第一章 进程与线程的基本概念
  7. 微信退款读取resource下的证书(apiclient_cert.p12)获取不到问题
  8. ASP.NET中的图片缓存
  9. 通过文献DOI下载外文文献
  10. RFID第二版答案-第六章
  11. 绕过tp路由器管理密码_普联(TPLink)路由器管理员密码是什么?
  12. java使用谷歌邮箱发送邮件
  13. 沧海拾珠(持续更新。。。)
  14. [css] 【转载】 精简高效的CSS命名准则/方法
  15. 用javascript统计字数,中文计数问题
  16. MxNet系列——how_to——multi_devices
  17. 如何将MAC的文件存储至NAS网络存储?
  18. Python深沪股票查询(Tk可视化)
  19. 拼多多货源代销怎么样,货源怎么找?
  20. 在DreamSpark上从Microsoft获得免费的学生软件

热门文章

  1. Jdbc数据库的连接工具类
  2. python敏感词过滤替换_浅谈Python 敏感词过滤的实现
  3. SEO之关键词选择原则
  4. 全网最好用的关键词的组合软件使用教程可排列组合随机生成
  5. html5之websql深入理解
  6. 中国工业企业数据库 | 特殊样本统计
  7. Hbuilder中如何快速输入注释标签_三菱PLC编程软件如何使用注释、声明、注解?...
  8. java的return用法
  9. 在微信小程序中使用条形码生成器
  10. 20_星仔带你学Java之Java常用类