揭秘autoit3的运行机制和反编译原理
今天发这个帖子的目的在于和论坛里面的朋友交流一下学习心得,主要内容是围绕着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的运行机制和反编译原理的更多相关文章
- .net反编译原理
目录 目录 前言 ILdasm ILasm 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 本来没有想写反编译相关的文章,但是写着写 ...
- 转载:微信小程序源码提取反编译
转载来源:www.51xuediannao.com/xiaochengxu/019c08cc.html 一.前言 微信小程序源码提取反编译,听起来很屌,其实还是简单的,基本是傻瓜式操作.要想拿到微信小 ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 7 款开源 Java 反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- 7款开源Java反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- Java 反编译工具下载
反编译,通俗来讲,就是将.java 文件经过编译生成的 .class 文件还原.注意这里的还原不等于 .java 文件.因为Java编译器在编译.java 文件的时候,会对代码进行一些处理. 那么接下 ...
- java常见反编译工具
1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...
- exe4j生成的exe反编译成java代码
很早以前写了一个java串口小程序,现在只有exe4j打包后的源程序了,最近又要用,折腾了一下发现其实要找回来也很简单,这里记录一下,以免以后忘记. exe4j只是将java程序,使用自己的方式打包了 ...
- java 对象 拆箱装箱 编译和反编译的验证
创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...
随机推荐
- python调用c++开发的动态库
此处列举一下python调用Windows端动态库. # *- coding=utf-8 -* import ctypes from ctypes import * import os objdll ...
- Servlet_001 我的第一个servlet程序
今天开启servlet学习 一.第一个Servlet程序 首先写我们的第一个servlet程序 第一步:新建我们的servlet程序(Web Project),命名为Servlet_001 第二步 : ...
- linux查看公网ip的方法
curl ifconfig.me 或者 curl cip.cc
- python加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
加密算法介绍 一,HASH Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种 ...
- Fluent_Python_Part3函数即对象,05-1class-func,一等函数,函数即对象
一等函数 一等函数即将函数看作一等对象.一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是 ...
- IDEA导入maven项目不自动识别
解决办法: 选中module的pom.xml,右键,选择" add as maven project",即可刷新为maven项目
- AOP的基本认识
一.AOP的概念 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...
- vmware克隆机无法启动eth0联网问题
cd /etc/sysconfig/network-scrip vi ifcfg-eth0 把eth0修改成eth1,重启网卡就可以了
- linux的端口学习(一)
1.端口是什么? 1.1 是英文port的意译,可认为是设备与外界通讯交流的出口. 1.2 端口可分为虚拟端口和物理端口. 1.2.1 虚拟端口:指计算机内部或交换机路由器内的端口,不可见.例如计算机 ...
- node express 应用笔记关键点
1.处理客户端 POST数据(标签 <form>), req.body 对象 app.js var bodyParser = require('body-parser'); ... ... ...