今天发这个帖子的目的在于和论坛里面的朋友交流一下学习心得,主要内容是围绕着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又做了什么事情呢?

本帖隐藏的内容需要回复才可以浏览

1)创建一个exe文件,假设为test.exe 2)把AutoItSC.bin拷贝到test.exe,此时AutoItSC.bin完全等于test.exe 3)对test.exe进行压缩(可选) 4)调用exearc库将源码写入test.exe,exearc是闭源库,所以无法知道它做了什么。 一个test.exe就完成了,悬念就在exearc做了什么,下面马上为你解答。

运行test.exe的时候发生了什么?

本帖隐藏的内容需要回复才可以浏览

一切结果都源自合理的猜测,在没有知道真相之前,我认为test.exe进程会读取自身空间的某个地址,也就是源码地址然后进行“反编译”,但是我没有发现这样的行为。而是发现了test.exe把自身当成一个文件读了进来。我不禁拍案叫到,这不是和脚本解析一模一样吗?的确一样。但是它读取的数据都是“乱码”并不是明文。我突然想到了a3x文件,然后通过很多对比实验发现所谓的exe文件 == bin + a3x。所以反编译exe就等于对a3x的反编译。 a3x不是一个编译文件,而是一个加密文件,它的组成结构是:头 + 校验码 + 密文 + 尾 的形式存在,以上结论都是通过实验进行推断。所以那些破解au3的人们并没有什么神秘之处,用心就能发现更多。但是我对如何解密源码兴趣不大,因为这个已经超出了我的领域。

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

揭秘autoit3的运行机制和反编译原理的更多相关文章

  1. .net反编译原理

    目录 目录 前言 ILdasm ILasm 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 本来没有想写反编译相关的文章,但是写着写 ...

  2. 转载:微信小程序源码提取反编译

    转载来源:www.51xuediannao.com/xiaochengxu/019c08cc.html 一.前言 微信小程序源码提取反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作.要想拿到微信小 ...

  3. Android反编译(二)之反编译XML资源文件

    Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具  apktool http ...

  4. 7 款开源 Java 反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...

  5. 7款开源Java反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...

  6. Java 反编译工具下载

    反编译,通俗来讲,就是将.java 文件经过编译生成的 .class 文件还原.注意这里的还原不等于 .java 文件.因为Java编译器在编译.java 文件的时候,会对代码进行一些处理. 那么接下 ...

  7. java常见反编译工具

    1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...

  8. exe4j生成的exe反编译成java代码

    很早以前写了一个java串口小程序,现在只有exe4j打包后的源程序了,最近又要用,折腾了一下发现其实要找回来也很简单,这里记录一下,以免以后忘记. exe4j只是将java程序,使用自己的方式打包了 ...

  9. java 对象 拆箱装箱 编译和反编译的验证

    创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...

随机推荐

  1. php虚拟主机下实现定时任务(仅供参考)

    因为要做简单的中控  在实现心跳包的时候遇到了困难 正常的心跳包思路是这样的  举个例子 我写一个登陆签到脚本   当我登陆成功的时候 会把登陆成功这个状态传递给网络上的中控端 当我签到完成的时候会把 ...

  2. socket实现简单的FTP

    一.开发环境 server端:centos 7  python-3.6.2 客户端:Windows 7 python-3.6.2 pycharm-2018 程序目的:1.学习使用socketserve ...

  3. acm数论之旅(转载)--素数

    https://www.cnblogs.com/linyujun/p/5198832.html 前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么区别,反正以后有关数学的知识我 ...

  4. C:sizeof 运算符

    sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节 sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无 ...

  5. lena全身像

    数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中 (为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑的皮肤),也有高频(帽子上的羽毛),很 ...

  6. Ubuntu18 mongodb 离线安装

    环境 Ubuntu 18 + mongodb 4.0.10 1.下载版本所需库 https://www.mongodb.com/download-center/community https://re ...

  7. Uncaught SyntaxError: Unexpected identifier 报错 import Vue from 'vue';

    一般情况是因为Webpack与webpack-dev-server版本不兼容导致. package.json { "name": "vue-loader-demo&quo ...

  8. 内存泄漏与weakMap、weakSet

    “DOM 引用造成内存泄露”这一点我们可以使用WeakMap或者WeakSet存储DOM节点,DOM被移除掉WeakMap或者WeakSet内部的DOM引用会被自动回收清除 https://jueji ...

  9. Feign代理必须加value否则启动失败

    Feign代理必须加value否则启动失败 @RequestParam(value=”xxx”)

  10. Windows下MySQL5.7版本中修改编码为utf-8

    我们新安装的MySQL数据库默认的字符是 latin1 ,所以每次新建数据库都要修改字符,非常麻烦.所以我们必须将它改成UTF8字符的. 修改方法如下: 一.修改MySQL的my.ini 首先在 \P ...