如何用C语言编写暴力破解压缩文件解压密码的程序
winrar有个命令行解压
rar.exe -y x -p密码 "c:est.rar" "d:\"
只需要在C语言里把要爆破用的密码生成或者从别的字典导入
然后拼接成命令循环执行就好了
1.WINZIP压缩文件的破解 针对WINZIP压缩文件,黑客最常使用的工具就是Elcomsoft公司的“Advanced ZIP Password Recovery”(简称AZPR),AZPR提供了一个图形化的用户界面,黑客经过几个简单的步骤就可以破解ZIP压缩文件包的密码。 第一步:配置破...
由于有一个重要的Rar文件,极需解开,首先试用了ARPC,但是解压的速度极慢,每秒只有30个左右,所以断了穷举破解的念头,却仍不死心,因为我从不崇尚穷举破解的方法,除非每秒可以跑几千万次的,我或许可以一试,所以决定研究一下Winrar 3.x密码算法,以期是否可以破解该密码。查看了网络上的资料,包括看雪FAQ里的回答,都声称只能用穷举法破解,起先并不理解,但通过研究,我理解了看雪前辈们在FAQ里所说的原因,不禁让我佩服Winrar加密思路的成熟。虽然研究的结果没有什么新意,但我还是决定把我的研究结果与大家一起分享,为那些仍然以为winrar密码可以象破解注册码一样的,通过修改winrar弹出框之类的更改文件流程指向可以达到跳过密码检验的朋友,做一个简要的说明。
一、Rar文件生成的流程。
Winrar加密文件时,总的分两个步骤:
1:先把源文件压缩,压成一段数据段。
2:再将压缩完的数据段加密。
对于同一个源文件来说,不进行加密,压缩完,其rar文件中的数据段是一模一样的。但是如果对同一个源文件来说,即使使用同一个密码,加密完rar文件中的数据段是不一样的,这是由于加密的密钥是依赖于一个Salt(8个字节的密钥,用来加密时使用,存放在rar文件头中里)
所以要解密rar加密文件关键在于数据解密这一步,那我们接下来研究一下如何加密的。
二、加密“压缩完的数据段”的流程
1、获取密钥:
将明文的密码与Salt一起,通过HASH算法,生成两个16字节的密钥。(一个是KEY(AES算法的参数),一个是initVector)
2、以Key和initVector来加密压缩数据:
这里,是一个循环加密的结构,每16字节作为一个块,进行加密(这可能正是为什么加密完的文件长度总为16倍数的原因)。加密采用AES算法(RAR采用的是AES的rijndael的标准应用)。这里注意:AES加密前,有一个异或运算,是先将每16字节块与上一个16字节块加密结果进行异或,然后再进行AES算法的。我用一个简单的示意代码看说明:
;===============================================
packblock[0]=packblock[i]^initVector
encryptBlock[0]=AES(packblock[0]) ;(KEY为AES的密钥)
for i=1 to 块数量-1
packblock[i]=packblock[i]^encryptBlock[i-1]
encryptBlock[i]=AES(packblock[i]) ;(KEY为AES的密钥)
next
;packblock[i]表示压缩完的每16字节数据
;encryptBlock[i]表示加密完的每16字节数据
;===============================================
三、解密的过程
由于AES算法是对称的,所以解密的过程,是加密过程的逆运算。但解密时AES算法过程与加密所用的不一样(是因为解密过程中由KEY生成的子密钥表不一样)。仍然需要我们将密码输入,与salt一起生成两个16字节密钥,KEY和initVector。
;===============================================
packblock[0]=AES1(encryptBlock[0]) ;(KEY为AES的密钥)
packblock[0]=packblock[i]^initVector
for i=1 to 块数量-1
packblock[i]=AES1(encryptBlock[i]) ;(KEY为AES的密钥)
packblock[i]=packblock[i]^encryptBlock[i-1]
next
;===============================================
那判断密码是否正确的在什么地方呢?
解密的过程是解密后的数据块进行解压缩,然后解成源文件,对该文件进行CRC校验,存在RAR文件中的源文件CRC校验码比较,相同则密码正确,不相同则密码错误。
四、无法秒破的原因
从上面,我们了解了RAR文件的整体思路。地球人都知道,解密时,肯定有个步骤是来判断密码的正确与否。而且,依据以往的经验,我们也许可以将某些判断的点移动,那样可以缩减破解的流程思路。那RAR的这一步在哪里?它把校验放在了最后的一步。如果要秒破,我们该怎么做泥?至少我认为目前是不可能的。
我们从解密过程逆反过来看看:
1、CRC检验这一块修改跳转?根本毫无意义,因为它已经是最后一步了。你可以修改RAR文件头的CRC值,你可以将它改得和你用任意密码解压出来的文件CRC值一样,但你的文件根本就不是原来的文件了。可能已经完全面目全非了。所以,对这一过程不可行。CRC校验本身是不可逆的
2、那么把判断提前到压缩完的数据?
解压的时候,有没有什么来判断压缩数据是否正确?压缩完的数据,有没有固定的特征,是否可以做为解压的判断,在这一步里,我们也无法找到有效的可用的固定特征。因为这一步涉及到RAR的压缩算法。即使一个源文件,即使你的文件前一部分是完全相同的,只对后面的部分进行改过,那么压缩完,数据也是完全一样的。因为压缩完的数据首先是一个压缩表,后面是编码。文件不一样,扫描完的压缩表也不一样,编码又是依赖于压缩表,所以,这里头找不到压缩完的数据有任何的固定特征可以用来判断的。
不管压缩数据是什么样的,Winrar都一如既往地进行解压,没有进行压缩数据是否有效的判断。
3、那假如我们破解了AES了泥?
由于AES只依赖于KEY,如果AES算法被破解了,我们知道了KEY,我们可以解出压缩完的数据,但是这里有一个问题,还有一个initVector密钥,用来第一个16字节块的异或,你没有initVector参数,你第一个16字节块的数据便无法解得出来。
4、那就只能从第一步Hash的算法入手
即使你能破解hash,但hash后的结果泥?没有结果,你怎么返推密码。
所以综上,我发现rar的加密是由hash和AES两种算法互相牵制,而两种算法当前都无法破解,至少目前还没有办法秒破,也理解了看雪高手讲的道理。
五、对穷举提高算法效率的一些设想。
我用汇编写完了RAR穷举解密的算法模块,但是如何提高效率,优化穷举的速度泥?我有如下的想法:
1、从压缩数据里找寻特征,省掉解压缩、CRC检验代码和生成initVector生成代码。目前,通过多次实验,我找到的一个特征(不知道这个是否正确),即解密完的最后一个16字节块的最后一个字节必须为0。因为经过多次的试验,我发现有加密的数据段长度都会比未加密前的数据长,那么,最后一个
16个字节的数据块解密完,多出的部分就都为0,但多出几个字节泥?多次实验,长度不一,我试想着从加密数据段最后一个16个字节块着手,只解这一块,看是否一个字节为0,这样,只解密16个字节的数据,来大大提高效率?如果能进行到这一步了,再通过解全部数据,进行CRC校验的判断。
2、如果第一个特征不成立的话,针对特定格式的压缩文件,比如doc、jpg等,部分数据固定,压缩完的数据是否存在相互牵制的数据?从而把判断提前,这一步,我不知道如何找到压缩完的数据是否存在相互牵制的数据。
Windows环境下用C语言终止杀毒软件进程
杀毒软件都是有自己的进程保护的。你用任务管理器结束看看吧。只能暴力解决。好像要用到rookit技术吧。我记得我在书上看过。讲的是下载者暴力结束杀毒软件进程的。好像叫什么VC++黑客编程,梁洋洋编写的。你可以去看看。下载pdf电子书找找,应该有这段源代码。
c语言能干什么用
c语言是一种面向过程、抽象化的通用程序设计语言,它可以用来编写应用软件、编写系统软件和图形处理、开发嵌入式设备和开发游戏软件。下面是详细介绍:1、编写应用软件,Linux操作系统中的应用软件都是使用C语言编写的,这样的应用软件安全性非常高。2、编写系统软件和图形处理,C语言具有很强的绘图能力和可...
C语言主要是用来编什么东西的?
void yinc(int x,int y) \/\/隐藏光标的函数 { CONSOLE_CURSOR_INFO gb={x,y}; \/\/x为1-100, y为0或1 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &gb);} void csh( ) \/\/初始化函数 { int i;Color(7);gtxy(zlx,zly); printf("╔"); gtxy(zlx+W-2,zly)...
求助:用c语言来求谁是案犯的问题
include "stdio.h"main(){ int a,b,c,d;\/*四个人,0表示未犯罪,1表示犯罪*\/ for(a=0;a<2;a++)for(b=0;b<2;b++)for(c=0;c<2;c++)for(d=0;d<2;d++){ if((a+b>0)&&(b+c>0)&&(c+d>0)&&(c+a<2)){ if(a)printf("A作案,");else printf("A未作案,");...
C语言是什么? 要怎么编 ? 用什么编?
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。C语言具有绘图能力强,可移植性,并具备很强的...
...学了大学C语言课程后还是看不懂一些用C语言编写病毒代码
就像你学了数学,但是你没学过物理。虽然物理题的解法可能也只是用了数学的加减乘除,但是你并不能明白他到底有什么意义 看看,前几个人回答,都纠结在程序语言本身了。你就是把C语言本身吃的在透,不知道病毒的相关知识是没用的。就像我让你用C语言求一个三角形面积,如果你连一点几何知识都没有,...
怎样用C语言编写病毒 \/ 蓝讯
要编制一个病毒,首先要知道病毒的运行机理。不论是何种病毒,它一般在结构上分为三个功能模块:感染机制,触发机制和有效载荷。在病毒结构中,首要的而且唯一必需的部分是感染机制。病毒首先必须是能够繁殖自身的代码,这是病毒之所以成为病毒的根本 原因。我们可以用一段类C伪码来表示这个过程。Infect...
仅用c语言能编出哪些小游戏?
可以编写狼追兔子游戏,掷骰子游戏,24点游戏,井字棋游戏,农夫过河游戏,扫雷小游戏,人机猜数游戏,三色球游戏, 推箱子游戏,坦克大战游戏,贪吃蛇游戏等。
用C语言怎么做?
很多大学生都或多或少的懂一点编辑语言,尤其是计算机系的,众说周知,c++语言是众多语言中比较简单易学的,那么要如何使用它来编写程序呢?下面将告知如何编写一个属于自己的小程序。工具\/原料 more 电脑一台(能联网) Visual C++ 6.0(完整绿色版)软件 方法\/步骤 1\/6分步阅读 想要编写软件首先得...
c语言使用switch编写
switch主要是选择功能,判断switch后面的条件,如果符合case里面哪一个,就进行相应操作,例如如下代码。case 1:printf("1");case 2:printf("2");break;case 3:printf("3");break;如果这样写 1 的时候 输出 12 2 的时候 输出 2 3 的时候 输出 3 case会一直向下执行,直到碰到break语句,或者...
铎亨明真: 如果你自己设计算法,就另当别论,如果想利用第3方的算法,我推荐用zlib,生成的压缩包是流行的zip格式.源代码很好找(www.zlib.net)
细河区18914032387: (20分)用C语言编译的文件压缩解压缩程序 - ?
铎亨明真: 是用霍夫曼树做的#include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> struct head { unsigned char b; /*the charactor*/ long count; /*the frequency*/ long parent,lch,rch; /*make a tree*/ char bits[256]; /*the haffuman code*/ } ...
细河区18914032387: (20分)用C语言编译的文件压缩解压缩程序?
铎亨明真: j=strlen(header[i].bits); memmove(header[i].bits 1,header[i].bits,j 1); header[i].bits[0]='0'; } else { j=strlen(header[i].bits); memmove(header[i].bits 1,header[i].bits,j 1); header[i].bits[0]='1'; } } } fseek(ifp,0,SEEK_SET); fwrite(
细河区18914032387: C++怎么实现解压RAR或者ZIP文件 - ?
铎亨明真: 可以用system 去调用批处理的#include#include#include int main() { char rarPath[256]; puts(_T("填入你系统的WINRAR.exe所在目录:")); gets(rarPath); SetCurrentDirectory(rarPath);//解压c:\1.rar到Myjpg目录里 char* lcm="rar x \"c:\\1.rar\" \"c:\\Myjpg\\\""; printf("shell command line :%s\n",lcm); system(lcm); puts(_T("解压完毕.")); return 0; }
细河区18914032387: 如何用c语言压缩解压文件夹 - ?
铎亨明真: 压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中. 一种压缩文本文件的方法如下: 1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中; 2. 原始文件中的词(全部由字母组成),如果是第一次...
细河区18914032387: c语言程序设计文件加密解密 - ?
铎亨明真: #include<stdio.h>#include<string.h>#include<stdlib.h> main() { void sc(char *fp,char *key,int Flen,int Klen); FILE *fp; char *pBuf,filename[20],key[20],ch; printf("请输入选择:A、加密 B、解密 C退出\n"); ch=getchar(); while(ch!='c'&&ch!='C') { ...
细河区18914032387: 牛人们,谁知道怎么用C语言对压缩文件用枚举法进行破解吗??
铎亨明真: 你先学点逆向工程吧!跟踪看密码发到了哪里.不过要是压缩软件在密码验证部份加了延时代码,那就麻烦多了.
细河区18914032387: 如何用c程序破解加密的winrar?
铎亨明真: WinRAR的加密功能十分强大,目前为止还没有出现公认的有效的破解它密码的软件. 虽然我也是学C的,但对于破解RAR,连我老师(教授)都说,难于上青天...呃~~如果楼主想破解RAR文件密码的话,可以试下以下两款软件,或许它们...
细河区18914032387: 用C语言设计 简单的数据压缩与解压缩程序 - ?
铎亨明真: 把所有的数据先读出来,存到数组中,然后遍历: 假设已搜到前i个不同的,且第i+1个与第i个不同,已将前i个存入临时数组,i>=1.如果第i+1和第i+2个不同,则第i+1个一并按序存入临时数组.如果第i+1个和第i+2个相同,则前i个做一次压缩处理,清空临时数组. 找连续相同的有多少个容易得多,就不具体说明了
细河区18914032387: C语言 文件加密解密 - ?
铎亨明真: 加密:#include#include#include#include void dofile(char *in_fname,char *pwd,char *out_fname);/*对文件进行加密的具体函数*/ void main(int argc,char *argv[])/*定义main()函数的命令行参数*/ { char in_fname[30];/*用户输入的要加密的文件...