找回密码
 加入
搜索
查看: 188269|回复: 653

[原创] 揭秘autoit3的运行机制和反编译原理

[复制链接]
发表于 2012-11-9 00:40:54 | 显示全部楼层 |阅读模式
本帖最后由 seeyou 于 2012-11-9 08:25 编辑

今天发这个帖子的目的在于和论坛里面的朋友交流一下学习心得,主要内容是围绕着autoit3的编译原理。先开门见山的说一下结果,我不知道如何反编译au3,但相信论坛有很多高手,能解开我心中的疑团。我没有想通过反编译去获取别人源码的欲望,只是在学习au3的过程中,总有想窥探庐山真面目的冲动。很多挥之不去的问题,比如autoit3是怎么工作的,它的exe文件又是如何被人反编译的?相信具备这些知识能帮助我们更好的了解autoit3,以下是我的探索过程,希望起到抛砖引玉之功效。

    据我第一次接触autoit3至今已有两个月之久,autoit的send和hotkey函数是我学习它的根本原因。随着学习的深入,我发现它称得上一门小而强大的脚本语言——内核小、功能强大。如果没有发生什么意外的话,对于autoit,我会像其他语言一样把它学下去,但是意外就在不经意之间发生了,这个意外也改变了我的学习轨迹。有一天,我把一个脚本打包成exe文件,在运行的时候产生了一个错误,信息居然告诉我某一行、某一个函数出错了。大家不要嘲笑我无知,我的确被这个提示震惊了。因为我一直认为它经过“编译”后,已经很难反编译到源码了,至少不能准确的知道出错处的是源码的第几行。显然,我的认识错了。我不禁想知道,它的编译是一个怎么样的过程?
autoit3本身很难给我这个答案,我只好把这个答案诉诸于它的胞弟autohotkey,我下了autohotkey的源码,包括compiler的源码。通过阅读代码我大致知道脚本文件是如何执行的,相信autoit也类似,所以请允许我以autoit作为描述的对象。

假设我们脚本中只有一句代码:WinActivate("QQ2012.exe")。解析的代码如下:
1)AutoIt3.exe读取脚本文件(一次读一行),接着对这一行进行词法分析。
2)找到了单词WinActivate,匹配关键词列表,检查是否是想要的关键词。WinActivate等,每个函数都有一个相对应的行为事件,供接下来调用。
3)如果是想要关键词(这里是WinActivate),检查它的参数:“QQ2012.exe”。(注意:参数是更加关键词的属性而定,有些关键词不需要参数。)
4)关键词和参数都已经得到,此时解释器已经知道了代码的行为。调用对应的事件对其进行处理。
5)查找进程列表,得到QQ2012.exe的进程号,然后通过windows api SetForegroundWindow激活窗口
好了,最简单的一个函数已经完成。其他功能估计也是大同小异,最终都是调用api来实现,从上面的过程来看,我们发现它不存在编译的过程。

Compiler又做了什么事情呢?
游客,如果您要查看本帖隐藏内容请回复


运行test.exe的时候发生了什么?
游客,如果您要查看本帖隐藏内容请回复

    到这里au3的机制也讲的差不多了。大家有什么意见请反馈,谢谢。

评分

参与人数 2金钱 +40 收起 理由
PPTBS + 10
chenronting + 30 确实是学习了。

查看全部评分

发表于 2012-11-9 02:12:18 | 显示全部楼层
我来学习一下了。。。。
发表于 2012-11-9 06:43:19 | 显示全部楼层
额   高科技
发表于 2012-11-9 07:44:39 | 显示全部楼层
谢谢,顶起哦!!!
发表于 2012-11-9 08:51:21 | 显示全部楼层
autohotkey後來的版本都把源碼存進resource裡
然後再去解析而已
发表于 2012-11-9 08:55:11 | 显示全部楼层
据说AU3属解释型语言,是把源码与解释器打包在一起的,所以容易反出来...
发表于 2012-11-9 09:45:17 | 显示全部楼层
如何做好防止反编译才好哈
发表于 2012-11-9 10:08:52 | 显示全部楼层
原来我的代码外面只穿了件纸衣服。
 楼主| 发表于 2012-11-9 10:20:49 | 显示全部楼层
回复 9# menfan1

我觉得迷惑已经差不多了,要看懂迷惑代码代价很高,看懂迷惑的人都具备把它重新实现的能力。还有可以把最核心的模块用其他语言实现,用dll的形式调用。
发表于 2012-11-9 10:31:18 | 显示全部楼层
我還真沒想過運作機制,不過您說的情況 「包成 exe 後出錯還能指示哪行有問題」,
這在高階程式語言裡面,部份編譯語言具有這特性,如 C 語言裡之 assert 指令。
 楼主| 发表于 2012-11-9 10:50:07 | 显示全部楼层
回复 12# edisonx
两者还是有一点区别的,assert是编码者主动写的,au3的错误提示是解释器完成的,编码者没有主观要求,这就说明了exe里面具有源码信息。
发表于 2012-11-9 10:53:11 | 显示全部楼层
回复 13# seeyou

這麼說倒也是,漏了這點。
发表于 2012-11-9 11:06:13 | 显示全部楼层
回复 1# seeyou


    学习了,呵呵
发表于 2012-11-9 11:13:19 | 显示全部楼层
学习一下,看看庐山真面目
发表于 2012-11-9 11:22:21 | 显示全部楼层
没看明白楼主想说什么。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 08:18 , Processed in 0.081312 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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