能力值:
( LV2,RANK:10 )
|
-
-
2 楼
达到这种效果的加密方式太多了。XOR的话再做一次XOR就解密了。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
demo.rar中的BIN文件是加密后的文字,TXT是原文。
有什么方法或工具可以帮助推导出XOR用到的BLOCK?
|
能力值:
( LV2,RANK:140 )
|
-
-
4 楼
如果真是XOR,自己写一个程序把BIN文件和TXT文件相互XOR一下,不就得到KEY FILE了么
给你个程序参考下
#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
size_t MyGetFileSize(char const *szFileName)
{
FILE *file = NULL;
fpos_t pos;
file = fopen(szFileName,"rb");
if(file != NULL)
if(fseek(file,0,SEEK_END) == 0)
if(fgetpos(file,&pos) == 0)
{
fclose(file);
return (size_t)pos;
}
fclose(file);
return -1;
}
int main()
{
char const *szFile1 = "source.txt";
char const *szFile2 = "encoded.bin";
char const *szFile3 = "output.bin";
FILE *sourcefile = NULL;
FILE *destfile = NULL;
FILE *outputfile = NULL;
void *pMem1 = NULL;
void *pMem2 = NULL;
void *temp = NULL;
size_t stsize = 0;
size_t stsize1 = 0;
stsize = MyGetFileSize(szFile1);
if(stsize <= 0 || stsize >= 65535)
return -1;
pMem1 = calloc(1,stsize);
if(pMem1 == NULL)
{
printf("failed to allocate memory!");
system("pause");
return -1;
}
temp = pMem1;
stsize1 = MyGetFileSize(szFile2);
if(stsize1 < 0 || stsize1 >= 65535)
return -1;
pMem2 = calloc(1,stsize1);
if(pMem2 == NULL)
{
printf("failed to allocate memory!");
system("pause");
return -1;
}
sourcefile = fopen(szFile1,"rb");
if(sourcefile == NULL)
{
printf("failed to open file!");
system("pause");
return -1;
}
destfile = fopen(szFile2,"rb");
if(destfile == NULL)
{
printf("failed to open file!");
system("pause");
return -1;
}
outputfile = fopen(szFile3,"wb");
if(outputfile == NULL)
{
printf("failed to open file!");
system("pause");
return -1;
}
if(fread(pMem1,1,stsize,sourcefile) != stsize)
{
printf("fread failed!");
system("pause");
return -1;
}
if(fread(pMem2,1,stsize1,destfile) != stsize1)
{
printf("fread failed!");
system("pause");
return -1;
}
while(stsize--)
*((unsigned char*)pMem1)++ ^= *((unsigned char*)pMem2)++;
fwrite(temp,1,stsize1,outputfile);
fclose(sourcefile);
fclose(destfile);
fclose(outputfile);
printf("I am done^_^\n");
system("pause");
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不好意思,问一个笨问题。
我不会C,直接把你的代码粘贴到VC6里面编译,编译器报了一个错,不会改:
c:\program files\microsoft visual studio\myprojects\xor1\xor1.cpp(89) : error C2105: '++' needs l-value
c:\program files\microsoft visual studio\myprojects\xor1\xor1.cpp(89) : error C2105: '++' needs l-value
也就是指*((unsigned char*)pMem1)++ ^= *((unsigned char*)pMem2)++;这一句。
如果您有时间,帮我看看怎么搞。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
*((unsigned char*)pMem1)^= *((unsigned char*)pMem2);
pMem1++;
pMem2++;
|
能力值:
( LV2,RANK:140 )
|
-
-
7 楼
VC++6.0编译正常,报错的原因是因为你把C语言程序保存为.CPP
请保存为.C,谢谢,我是用标准C语言写的,跟CPP没有任何关系
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
不行,还是报错,似乎必须要*((unsigned char*)pMem1)的形式。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
万分感谢。
project Settings里面设置为不使用预补偿页眉后一次编译成功。谢谢啦。
|
能力值:
(RANK: )
|
-
-
10 楼
不是简单的XOR, 即如是, 也不是简单的重复Key, Key的长度至少在0x80字节以上.
更有可能是ROT13或是DES/3DES之类的对称算法.
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
看来只能穷举了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢大家都分析。的确不是简单的XOR.
分析对象是一个VFP的系统,使用了金天地或叫彩虹天地NETDOGSHELL加的密。
获得加密算法的途径当然是获得源程序最好了。只是这个NETDOG SHELL对VFP程序进行了变码,无法直接逆向获得可读的VFP程序。不过,逆向反编译工具FOXTOOL作者DM提到了以下内容,有谁了解更具体的细节吗?
--------------======================--------------
3、 彩虹软件狗所有加密方式加密的程序可反编译
彩虹软件狗所有加密方式其实相当于vfp加密方式的变形,其设计上有一个重大的bug,不管它加密的程序无狗能不能运行,都可在很短的时间内还原出app文件。
--------------======================--------------
哪里能找到这个“金天地密钥穷举工具”?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
看有一下,学习一下
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
看了,粘贴的那个程序,有点眉目,谢谢!
|
|
|