找回密码
 加入
搜索
查看: 3757|回复: 5

[AU3基础] 文件加密的代码

  [复制链接]
发表于 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[16] = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];ascii明码表
;~ $a_mima1[16] = ['7','6','5','4','3','2','1','0','F','E','D','C','B','A','9','8'];第一位ascii密码表
;~ $a_mima2[16] = ['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:采用二进制读取文件后,二进制的头部或尾部加入一些 自定义代码后,为什么文件结构会增大一倍。如代码一,是什么原因呢??
  如何进行修改,才能完成在既不修改文件大小(至少不至于增加一倍大)的情况下,添加一些自定义的字符或代码进去(代码二能实现,但无自定义代码),完成文件的加解密
--

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

如何操作呢?上面的代码可以实现,但看了许久没能看明白,急盼能人给修改下,谢谢了
发表于 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
以上代码应该能满足你第一个愿望。

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
afan + 20 + 2

查看全部评分

 楼主| 发表于 2010-8-8 20:44:23 | 显示全部楼层
回复 2# republican


代码$jiami_chars = BinaryMid($jiami_chars,3,$len-2)
为什么要取出前面2个字节的不要呢
发表于 2010-8-8 20:47:49 | 显示全部楼层
回复  republican


代码$jiami_chars = BinaryMid($jiami_chars,3,$len-2)
为什么要取出前面2个字节 ...
feicuiboy 发表于 2010-8-8 20:44


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

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

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

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

评分

参与人数 1金钱 +10 收起 理由
feicuiboy + 10 谢谢

查看全部评分

 楼主| 发表于 2010-8-8 21:04:37 | 显示全部楼层
你不是要删除前两个字节吗?

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

2楼的例子我给你加了注释, ...
republican 发表于 2010-8-8 20:47

谢谢,能否简单讲下,怎么个偏移法,是不是类似花指令登类似的方法偏移。。有类似的代码参考吗
发表于 2010-8-8 21:42:15 | 显示全部楼层
这种情况一般在软件汉化的时候会遇到,比如"Get"翻译成"取得",多了一位,而后面的字符需要向后延递一位,此时,需要找到后一个字符的偏移量,然后在整个文件中搜索该偏移量的ASCII码,向后延递多少位,就以十六进制运算加上多少位。只有这样做之后,整个EXE才能正常运行。

评分

参与人数 1威望 +1 金钱 +30 收起 理由
afan + 1 + 30

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 10:34 , Processed in 0.082272 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表