feicuiboy 发表于 2010-8-8 20:01:51

文件加密的代码

本帖最后由 feicuiboy 于 2010-8-8 20:25 编辑

转载论坛的,我加了些注释,但是还有些疑惑,我改写后文件大小大了1倍,我用的是FileOpen("1" & $file, 16 + 2)    写入模式,不知道为什么呢??

代码一,改写的:
$file="adk.exe"
_file_yihuo($file)
Func _file_yihuo($file)
      $jiami = FileOpen($file, 16);16进制打开文件
      If @error Then Return SetError(-1, 0, -1)
      $jiami_chars = FileRead($jiami) ;获取二进制文本
      $jiami_chars = StringTrimLeft ($jiami_chars,2)   ;删除字符串中从左开始指定数量的字符. StringTrimLeft ( "字符串", 数量 )
      $len = StringLen($jiami_chars);返回指定字符串的字符总数,StringLen ( "字符串" )
      FileClose($jiami) ;关闭文件
      $file = FileOpen("1" & $file, 16 + 2);打开文件,二进制写入模式
               FileWrite($file, Binary("ox"&$jiami_chars)); Binary ( 表达式)--返回一个表达式的二进制值.
               FileClose($file)
       EndFunc 上面的代码加密后文件就大了一倍。


代码二:文件加密代码
==========================================Global $Encrypt_Out

;======================示例代码=========================
;~ $begin = TimerInit()
;~ _file_yihuo('测试文档.txt')
;~ $dif = TimerDiff($begin)
;~ MsgBox(0,"耗费时间",$dif)
;======================示例代码=========================


;~ 函数名:_file_yihuo
;~ 作用:异或加密解密文档
;~ 作者:crossdoor
;~ yihuo("文档")
;~ 文档:需要加密或解密的文档
;~ 返回值:成功返回1,新的文档将在原文档名前面加上Encrypt_保存;文档打开失败返回-1并设置@error=-1
;~ 说明:明文文档会被加密,密文文档会被解密
$file="Encrypt_挂机锁.exe"
_file_yihuo($file)
Func _file_yihuo($file)
      $jiami = FileOpen($file, 16);二进制打开文件
      If @error Then Return SetError(-1, 0, -1)
      $jiami_chars = FileRead($jiami) ;获取二进制文本
      $jiami_chars = StringTrimLeft ($jiami_chars,2)   ;删除字符串中从左开始指定数量的字符. StringTrimLeft ( "字符串", 数量 )
      $len = StringLen($jiami_chars);返回指定字符串的字符总数,StringLen ( "字符串" )
      For $i = 0 To $len/9200;分段加密-------------------------------
                $Tmp_Dat = _Encrypt(StringMid($jiami_chars,$i*9200+1,9200))
      Next
      FileClose($jiami) ;关闭文件
      $file = FileOpen("Encrypt_" & $file, 16 + 2);打开文件,二进制写入模式
      FileWrite($file, Binary('0x' & $Tmp_Dat)); Binary ( 表达式)--返回一个表达式的二进制值.
      FileClose($file)
      Return 1
EndFunc   ;==>yihuo
;~ 对照表
;~ $a_mingma = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];ascii明码表
;~ $a_mima1 = ['7','6','5','4','3','2','1','0','F','E','D','C','B','A','9','8'];第一位ascii密码表
;~ $a_mima2 = ['8','9','A','B','C','D','E','F','0','1','2','3','4','5','6','7'];第二位ascii密码表
;~ 函数名:__Encrypt
;~ 作用:内部调用函数
;~ 说明:按照上述对照表进行ascii码转换加密
Func _Encrypt($jiami_chars)
      $num = StringMid($jiami_chars, 1, 2);提取字符串中的第一个和第二个字符
      $n1 = Dec(StringMid($num,1,1));Dec ( "hex" )----返回$num的第一个字符为十进制
      $n2 = Dec(StringMid($num,2,1));Dec ( "hex" )----返回$num的第二个字符为十进制
      If $n2 >7 Then;若$n2>7
                $re2 = Hex($n2-8,2);转换,取2个长度
      Else
                $re2 = Hex($n2+8,2)   ;转换,取2个长度
      EndIf
      If StringMid($re2,1,1)='0' Then $re2 = StringMid($re2,2,1) ;若第一个字符为0,那么取第二个字符
      If $n1 < 8 Then
                $re1 = Hex(7-$n1,2)
      Else
                $re1 = Hex(23-$n1,2)
      EndIf
      If StringMid($re1,1,1)='0' Then $re1 = StringMid($re1,2,1);若第一个字符为0,那么取第二个字符
      $jiami_chars = StringTrimLeft ($jiami_chars,2);从左开始,删除2个字符串
      $Encrypt_Out &= $re1 &$re2
      If $jiami_chars <> '' Then _Encrypt($jiami_chars)
      Return $Encrypt_Out
EndFunc我个人已加了注释,对Func _Encrypt($jiami_chars)段看了许久,没看懂,盼懂的人给讲解讲解,谢谢了






======================
我的疑问是:
1:采用二进制读取文件后,二进制的头部或尾部加入一些 自定义代码后,为什么文件结构会增大一倍。如代码一,是什么原因呢??
如何进行修改,才能完成在既不修改文件大小(至少不至于增加一倍大)的情况下,添加一些自定义的字符或代码进去(代码二能实现,但无自定义代码),完成文件的加解密
--

我的想法:
加密:添加自定义代码(二进制方式),可考虑在文件头或文件尾或指定代码长度的中间插入。实现加密
解密实现:判断加密字段,去掉自定义字段即可

如何操作呢?上面的代码可以实现,但看了许久没能看明白,急盼能人给修改下,谢谢了

republican 发表于 2010-8-8 20:12:57

本帖最后由 republican 于 2010-8-8 20:48 编辑

首先,FileOpen($file, 16),表明你用二进制读取文件,而非16进制文本.
请弄明白先。$file="adk.exe"
_file_yihuo($file)
Func _file_yihuo($file)
      $jiami = FileOpen($file, 16);以只读二进制模式打开文件
      If @error Then Return SetError(-1, 0, -1)
      $jiami_chars = FileRead($jiami) ;读取整个文件,并将数据赋予变量
                $len = BinaryLen($jiami_chars);获取数据长度
      $jiami_chars = BinaryMid($jiami_chars,5,$len-4);提取数据
      FileClose($jiami) ;关闭文件
      $file = FileOpen("1" & $file, 18);以二进制,创建读取模式打开文件
                FileWrite($file,Binary(0x00) & $jiami_chars); 写入数据
                FileClose($file)
EndFunc以上代码应该能满足你第一个愿望。

feicuiboy 发表于 2010-8-8 20:44:23

回复 2# republican


代码$jiami_chars = BinaryMid($jiami_chars,3,$len-2)
为什么要取出前面2个字节的不要呢

republican 发表于 2010-8-8 20:47:49

回复republican


代码$jiami_chars = BinaryMid($jiami_chars,3,$len-2)
为什么要取出前面2个字节 ...
feicuiboy 发表于 2010-8-8 20:44 http://www.autoitx.com/images/common/back.gif

你不是要删除前两个字节吗?

你的问题是,你把数据当成字符串操作了。

2楼的例子我给你加了注释,文件大小也一样。具体分别用Winhex就能看出。

请不要直接操作EXE文件,如果想改变大小的话,你需要更改偏移量,是个麻烦的过程。

feicuiboy 发表于 2010-8-8 21:04:37

你不是要删除前两个字节吗?

你的问题是,你把数据当成字符串操作了。

2楼的例子我给你加了注释, ...
republican 发表于 2010-8-8 20:47 http://www.autoitx.com/images/common/back.gif
谢谢,能否简单讲下,怎么个偏移法,是不是类似花指令登类似的方法偏移。。有类似的代码参考吗

republican 发表于 2010-8-8 21:42:15

这种情况一般在软件汉化的时候会遇到,比如"Get"翻译成"取得",多了一位,而后面的字符需要向后延递一位,此时,需要找到后一个字符的偏移量,然后在整个文件中搜索该偏移量的ASCII码,向后延递多少位,就以十六进制运算加上多少位。只有这样做之后,整个EXE才能正常运行。
页: [1]
查看完整版本: 文件加密的代码