找回密码
 加入
搜索
查看: 19947|回复: 43

[效率算法] 【已解决】AU3脚本编译后是否可以将运行时更改的如ini文件注入到自身exe中

 火... [复制链接]
发表于 2010-6-12 11:00:33 | 显示全部楼层 |阅读模式
本帖最后由 C.L 于 2010-6-17 13:30 编辑

AU3用Fileinstall 包含的文件编译后,如:ini文件,不过目前的情况,并不能将脚本运行更改后的ini文件再注入到本身的exe中,每次运行都会重新释放原始的ini文件。

大家是否可以讨论一下,是否有可能将脚本编译后,运行时产生的与原始ini不同的ini文件在脚本退出时,注入到已编译的exe中,以便可以使用更新后的ini文件?

既然问题是我提出来的,我先说一下我自已的看法:
1、AU3可以用二进制读取文件的方式,而可执行文件exe也是二进制的文件,从理论上来看,是可以对这个二进制文件进行读写,所以,也就有了重新注入的可能性。
2、Fileinstall()的原理我不懂,不知道AU3是如何处理这种注入的文件,而且以这种方式包含的文件可能在已编译好的exe中可能也有严格的字节数限制(这是我的猜测,不知道实际上是不是这样),所以对这部份的包含的二进制改写可能不大行得通。
3、如果第2点行不通,那么是否可以编写代码来以二进制的方式自已注入文件,然后,在脚本完成将结束时自已重新注入已更改后的配置文件?这里有个问题,因为脚本运行时,是不能操作自身文件的,或者可以参考删除自身的代码?

欢迎参加讨论,我认为这个问题可能会有实用的意义,脚本运行时总是带着个小尾巴,看着总是有点不爽,而且有时将脚本copy时,忘了将这小尾巴一起copy,引起出错(我就有过)

补充:后来想起来,下面这点似乎用处更大:这个方法不单是为了注入配置文件,也可以注入图标库文件、可执行程序、等等,而且可以在使用的时候才提取出来,不象fileinstall那样,一运行就会将所有的文件都释放出来。

=====================
更新:25# 上传有最新完成的代码:现在只支持单个文件的注入,测试正常后再加入多文件支持,可用AU3的listview显示,支持从窗口提供提取的功能。(为方便下载测试,现改下一楼,把附件放到这里下载吧)

第一阶段,向自身已编泽的exe中注入文件,并在AU3的listview中显示,这一段代码已改造为WinAPI读写,已基本完成,我这里测试正常,现放到这里来,让大家测试一下,另:如果有杀软报杀的话,请通知一声,谢谢(按操作的思路,应该不会引起杀毒软件的查杀)。
代码说明:
现在只支持一个文件的注入和提取,这部份测试没有问题的话,下一步再加入多文件的注入:

现放上源码,有兴趣的可以自已写代码,增加新的功能,如果有朋友增加了新的功能的话,请放一份代码到这个贴,先谢谢了。

===========================================================

2010-06-17 更新:
向自身exe文件注入UDF,经过一段时间的研究,终于有点结果了,现在基本功能已经完成,可以发一个测试版了
在此先谢谢参与回贴讨论的所有朋友,谢谢你们的热心回贴。
由于本人是第一次做UDF,有不足之处,敬请大家原谅

由于这个UDF编写的时间较短,可能会存在某些不确定的错误,请大家测试使用时请注意,有什么问题及时到UDF区那个发布贴子反馈,谢谢

代码已发在UDF区,有兴趣的朋友可以到下面的链接下载代码:
http://www.autoitx.com/forum.php ... id=16292&extra=

附上完成后的UDF的简单介绍,详细情况请到上面的链接查看,上面的链接有图片预览、代码下载。
; =======================================================================
; 名称: 已编译后程序文件注入UDF
; 描述        : 可对已编译后的程序进行文件的注入
;                (程序正在运行时,是对临时文件进行模似操作,程序退出时,会自动更新到本程序中)
;运行环境:必须是脚本代码编译成exe文件后,才能正常运行
;AutoIt Version        : AutoIt v3 ++
;感谢:  此 UDF 两个Hex读写函数根据本论坛 my788521整理的代码改写,在此特别表示感谢
;        此 UDF 两个内置 InI 读取根据本论坛 Afan 提供的代码改写,在此特别表示感谢
;        另外,对本论坛提供源码的所有朋友,感谢你们无私的贡献
; 作者        : C.l ---- www.autoitx.com 
; =======================================================================
;========================================================================
;已编译后程序文件注入UDF使用说明:
;
;下面的 “文件名”,均为要本程序的临时文件,也可以是其他没有在运行中的二进制文件(即可实现外部读写)
;此代码考虑到内含文件的特性,好象没有必要支持太多的文件,所以文件表($TableSize)预设为一个扇区大小
;        默认支持最多为15个文件注入,
;        注入文件名使用24个字节保存,如果文件名长度大于24个字节(每个汉字占两个字节),将不注入
;
;添加内含文件:_AddNewHexFile($BackupFilePath, $TagNewFile = "")
;                        _AddNewHexFile(文件名,要注入的文件名)
;                                        
;删除内含文件:_DeleteHexFile($BackupFilePath, $delfileName)
;                        _DeleteHexFile(文件名, 要删除的内含文件名)
;
;清空碎片:_DelEmptyBlock($BackupFilePath, $TableSize = 512)
;                        _DelEmptyBlock(文件名, 内含文件表大小(默认512字节,一个扇区))
;                        本函数作用:将刷新文件、删除文件后产生的碎片清空,释放空间,文件操作过多后运行,
;                                                文件大小将会减少很多。
;                        此操作如果内含文件太多和太大,可能比较占用CPU.注意使用
;
;读取文件列表:_ReadFileInfo($BackupFilePath, $TableSize = 512)
;                        _ReadFileInfo(文件名, 文件表大小(默认512字节))
;                        函数运行后,如果有内含文件,返回一个内含文件的信息的一维数组
;                                数组内字符串信息如下:文件名|文件大小|文件开始偏移量
;                        
;文件保存: _HexFileSaveas($OutputFileName, $Offset, $FileSize):
;                        _HexFileSaveas(输出文件名, 内含文件偏移量, 内含文件大小)
;                                内含文件偏移量和内含文件大小,这两个参数,可调用_ReadFileInfo()得到
;
;内含INI文件字段名读取: _memoryIniReadSectionNames($MemoryIniFile, $Offset, $FileSize, $mode = 0, $flag = 1)
;                        _memoryIniReadSectionNames(内含文件名,文件偏移量,文件大小,读取模式,标志)
;                        内含文件偏移量和内含文件大小等参数,可调用_ReadFileInfo()得到
;                        此函数可直接读取内含的InI文件,而不必将INI文件提取后读取 (由Afan代码改写而成)
;                        些函数返回一个由字段名组成的一维数组
;内含INI文件值读取:_MemoryIniReadSection($MemoryIniFile, $Offset, $FileSize, $Section, $mode = 0)
;                        _MemoryIniReadSection(内含文件名, 偏移量, 文件大小, 字段名, 读取模式)
;                        此函数返回由字段内的数据组成的二维数组        
;                
;回写函数:_Selfcopy($iDelay = 3)
;                        _Selfcopy(延时)
下面的附件请不要下载了,请到UDF区下载最新代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 3金钱 +85 贡献 +1 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...
大绯狼 + 25 惯例,留名标记方便查找。
lynfr8 + 50 + 1 很棒的见解

查看全部评分

发表于 2010-6-12 11:14:02 | 显示全部楼层
学习 中-顶一个!!
发表于 2010-6-12 14:44:31 | 显示全部楼层
觉得不是很必要。哪exe老变,容易被利用。
 楼主| 发表于 2010-6-12 15:40:23 | 显示全部楼层
回复 3# ferelove

说得倒也是
我也是突然想起以前有人问过这个问题,纯技术方面的考虑,想看看这种要求有没有什么方法可以较好的实现,也可以拓展一下编程的思路,呵呵~
发表于 2010-6-12 16:18:07 | 显示全部楼层
这个问题·想过··一直没有实现过,希望有人能解决
估计够呛··
发表于 2010-6-12 16:51:42 | 显示全部楼层
这个问题提得很好
希望楼主能深入研究
发表于 2010-6-12 17:12:42 | 显示全部楼层
这个玩的层次太高了,等着学习~
不过这样做很可能会被杀软定义为木马行为病毒,而被干之……
发表于 2010-6-12 17:19:53 | 显示全部楼层
……忘了将(ini)这小尾巴一起copy,引起出错

说个题外话:这个ini最好由主程序自动判断并生成,如有特殊需要,可自动按不同的运行环境生成对应的ini,这样的程序更人性化一些。
我刚完成个小工具,就是可以根据不同的运行环境生成ini,譬如IP地址、文件路径……等等不同的因素去灵活生成ini。
发表于 2010-6-12 18:12:14 | 显示全部楼层
最简单的方法就是重新编译。。。
写好的AU3程序自带上AU3最小的编译环境,重新生成一具新的EXE,将INI打包到其中。
 楼主| 发表于 2010-6-12 20:51:41 | 显示全部楼层
回复 7# afan

这个只是普通的二进制文件的读写操作,应该不会被杀软件干掉的

今天正在考虑这个问题的时候,看到有个询问限制软件安装台数的贴子,就做了个例子,采用的方法就是将软件运行的次数回写到软件自身的exe二进制文件中的,装有杀软件的朋友可以用这个测试看看,我想应该不会被杀掉的。
传送门:
http://www.autoitx.com/thread-15722-1-1.html
7楼的代码,运行正常,可以计数,不过代码还不是很成熟,只是提供思路。
 楼主| 发表于 2010-6-12 20:56:35 | 显示全部楼层
回复 8# ferelove

简单一点的是可以,但复杂的,还有因某些原因不能由程序判断并生成的,需要读取外部数据生成配置文件的,就要用到了,如果不复杂的,根本就没有必要要配置文件。
 楼主| 发表于 2010-6-12 21:05:41 | 显示全部楼层
再回想一楼所说的问题,在那个限制软件安装台数的代码中,就实现了对编译后的exe文件回写了几个字节,既然能回写几个字节,那么ini文件只是字节数大一点而已,只要偏移量和算法正确,读取和回写的问题应该不算太大。

另外,想到一个问题,这个方法不单是为了注入配置文件,也可以注入图标库文件、可执行程序、等等,而且可以在使用的时候才提取出来,不象fileinstall那样,一运行就会将所有的文件都释放出来。
发表于 2010-6-13 08:36:59 | 显示全部楼层
如果是编辑成exe文件后再注入,偶是...........,在之前是否你注意过用“编译脚本(带选项)”的变化?
#Region AutoIt3Wrapper 预编译参数(常用参数)
#AutoIt3Wrapper_Icon=                                                                                 ;图标,支持EXE,DLL,ICO
#AutoIt3Wrapper_OutFile=                                                                        ;输出文件名
#AutoIt3Wrapper_OutFile_Type=exe                                                        ;文件类型
#AutoIt3Wrapper_Compression=4                                                                ;压缩等级
#AutoIt3Wrapper_UseUpx=y                                                                         ;使用压缩
#AutoIt3Wrapper_Res_Comment=                                                                 ;注释
#AutoIt3Wrapper_Res_Description=                                                        ;详细信息
#AutoIt3Wrapper_Res_Fileversion=                                                        ;文件版本
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=p                                ;自动更新版本  
#AutoIt3Wrapper_Res_LegalCopyright=                                                 ;版权
#AutoIt3Wrapper_Change2CUI=N                                                   ;修改输出的程序为CUI(控制台程序)
;#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%                ;自定义资源段
;#AutoIt3Wrapper_Run_Tidy=                                                   ;脚本整理
;#AutoIt3Wrapper_Run_Obfuscator=                                                      ;代码迷惑
;#AutoIt3Wrapper_Run_AU3Check=                                                                 ;语法检查
;#AutoIt3Wrapper_Run_Before=                                                                 ;运行前
;#AutoIt3Wrapper_Run_After=                                                                        ;运行后
#EndRegion AutoIt3Wrapper 预编译参数设置完成
#cs ____________________________________

 Au3 版本:
 脚本作者: 
        Email: 
        QQ/TM: 
 脚本版本: 
 脚本功能: 

#ce _______________脚本开始_________________
或许我的回答不沾边,请见谅!
发表于 2010-6-13 12:16:06 | 显示全部楼层
很难哦,初学,不懂这类东西
 楼主| 发表于 2010-6-13 21:49:28 | 显示全部楼层
回复 13# lchl0588

这个问题应该不大,我没有打算改与这部份的内容

现在问题也研究得有点进展了,说实在话,用AU3操作二进制有点不大好操作,数据类型有点混乱,现在一脑子的16进制数字,有点晕~

现在用的思路,简直是等于在二进制的可执行文件,划出一段空间地址,再自行构建一套文件系统,有点复杂了,文件表部份基本构建完成,估计不久就可以拿出代码来测试。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-20 20:33 , Processed in 0.139621 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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