Hmily 发表于 2009-10-19 00:35

关于AUTOIT的反向编译[thesnow]

对于3.2.5.2+以前的版本编译的代码可以使用,对之后的新版将无法反编译出源代码.教程目的:学习他人脚本思想.提醒大家注意如果要保证脚本的安全,建议使用代码迷惑.(虽然也能反)

3.1.1.0+的autoit的反向编译(包括3.2.5.1最新版本).
所需工具: OLLYDBG,ULTRAEDIT.AUTOIT中的autoit3a.exe

请自己确定这个程序是不是autoit编写的.
OD打开 autoit3a.exe (位于已经安装的autoit的路径,汉化版本默认为d:\autoit3\)
参数填 那个前面确认是autoit3程序的EXE路径,A3X也可以.



CTRL+S 查找命令序列:
============================================
push eax
ANY
test eax,eax
pop ecx
pop ecx
ANY
push ebx
push ebx
============================================




找到后显示为:
0043964E      |.      50                     |push eax
0043964F      |.      E8 ACFC0000            |call AutoIt3A.00449300
00439654      |.      85C0                     |test eax,eax
00439656      |.      59                     |pop ecx
00439657      |.      59                     |pop ecx
00439658      |.      74 48                  |je short AutoIt3A.004396A2
0043965A      |.      53                     |push ebx
0043965B      |.      53                     |push ebx

在push eax上面按F2下断,F9运行,中断.
如果EAX显示:
ASCII ">AUTOIT UNICODE SCRIPT<"
就说明脚本是UNICODE编码的.
如果显示:
ASCII ">AUTOIT SCRIPT<"
就说明脚本是ANSI编码的.
取消断点.




CTRL+S 查找命令序列:
============================================
lea eax,dword ptr ss:
push eax
mov ecx,ebx
ANY
test al,al
ANY
lea eax,dword ptr ss:

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



找到后在第二个lea eax,dword ptr ss:上面下断点(按F2)

按F9一次,中断,F8一次,寄存器窗口出现脚本?取消刚才设置的断点(F2)
=====================================================
004069D3      |.      E8 D5FDFFFF            |call AutoIt3A.004067AD
004069D8      |.      84C0                     |test al,al
004069DA      |.      0F84 CE000000            |je AutoIt3A.00406AAE
004069E0      |.      8D85 E8EFFFFF            |lea eax,dword ptr ss:            ;      断在这里
004069E6      |.      E8 ECF7FFFF            |call AutoIt3A.004061D7
004069EB      |.      84C0                     |test al,al
=====================================================
点击刚才lea eax,dword ptr ss:上面那个je AutoIt3A.00406AAE,看它跑哪里去.

跑到了这里:
=====================================================
00406AAE      |> \FF75 0C                  push dword ptr ss:
=====================================================

在上面的地址下断.F9运行一次,再次中断.
现在脚本解压缩完了.
看看寄存器EDX的值(如果EDX未出现脚本,请使用下面的那个方法):
EAX 0012F700 ASCII "U3TOOL.exe"
ECX 0046E2D8 AutoIt3A.0046E2D8
EDX 00C10048 ASCII 3B," <AUT2EXE VERSION: 3.2.5.1>
在EDX那一行上面点击右键>在数据窗口跟随.
再看左下方内存窗口.




在内存窗口右键>备份>保存数据到文件(扩展名修改为AU3).
用scite打开这个保存的au3脚本,删除无用的数据.OK,脚本已经反编译完成了.
另外的方法:
我们按ALT+M打开内存.
按CTRL+B搜索 AUT2EXE VERSION
注意:这里要粘贴进去,不然无法识别.
搜索到后回自动打开,里面就是包含有代码的数据了.
右键>备份>保存数据到文件>
随便取一个名字,保存吧.

用scite打开这个保存的au3脚本,删除无用的数据.OK,脚本已经反编译完成了.
附加说明:
如果脚本是UNICODE编码的,先用ULTRAEDIT打开保存的那个文件,
的脚本,搜索 FF FE (不用选中查找ASCII)
把FF FE 前面的数据删除了(不要把FF FE删除了,这是让编辑器识别UNICODE用的).再用SCITE打开,把无用的数据删除了.
搞定!收工.
下次再写,怎么提取释放的文件.
==============================================================================
XD,继续写.先跟踪到上面提取代码的位置,并禁用所有断点.(不要运行)
怎么提取文件呢?
通过跟踪分析,autoit会先将A3X截取存在文件的部分放到临时文件夹(%temp%),再进行解码.解码过后,再按照脚本指定的路径复制过去.
复制文件当然是用CopyFile API.那好,我们下断点.
在左下方的命令行里面输入:
BPX CopyFileA
关闭自动打开的窗口先...
按下ALT+B打开断点窗口.
是否存在一个类似call dword ptr ds:[<&KERNEL32.CopyFileA>]的行?
双击它.



来到:
004393A6      |> \6A 00                  push 0                                    ; /FailIfExists = FALSE
004393A8      |.      8D85 C8FDFFFF            lea eax,dword ptr ss:            ; |
004393AE      |.      50                     push eax                                    ; |NewFileName = "d:\x.123456789"
004393AF      |.      8D85 D0FEFFFF            lea eax,dword ptr ss:            ; |
004393B5      |.      50                     push eax                                    ; |ExistingFileName
004393B6      |.      FF15 40714500            call dword ptr ds:[<&KERNEL32.CopyFil>; \CopyFileA

在第一个PUSH EAX上面下断点(按F2.)
解释一下:
PUSH 0在这里代表如果文件存在就失败(不进行复制)
第一个PUSH EAX代表要复制到哪里去(脚本中指定释放文件到哪里(fileinstall函数)或者复制到哪里(filecopy函数))...
第二个PUSH EAX代表从哪里复制,前面已经说过,解码是在临时文件夹操作的...那这里当然是指向临时文件的路径.
后面的那个CALL 就是执行文件复制了.

OK,我们先F9一直到刚才下的这个断点.
看看EAX寄存器的值就知道文件将会被复制到哪里去.文件名是什么.
再按F8走到第二个PUSH EAX.此时EAX的值就是那个已经解码的临时文件的路径.
再按F8走过那个CALL ,好了,文件已经释放完成了(也可能是脚本在执行filecopy函数).
多的不说.请大家继续期待3.1.1.0的脚本的反编译.毕竟当时还是有不少优秀作品的.
=================================
XD,继续我们的反编译教程.
这次是3.1.1.0的脚本(标识EA03,EA04.貌似3.2.2.0以上就是EA05了.应该说是第五代脚本压缩引擎了.)
这里只是给个思路,不一定正确.大家还是自己研究.
好了,我们开始.
EXE来自死性不改的系统封装工具(声明:只是为了研究autoit 3.1.1.0 脚本的反编译方法,没有其他意思.)
PEID查壳,UPX的,手脱可以,脚本脱也可以.
这里不是为了脱壳,因为3.1.1.0及下面的版本脱壳了修复很麻烦,我们需要带壳调试.带壳调试首先还是要到真正的入口点(OEP).
先给大家一个OD脚本:
UPX OEP.txt (虚线内)
------------------------------------------------
//先加载EXE,再运行
eob Break
findop eip, #61#
bphws $RESULT, "x"
run
Break:
sto
sto
bphwc $RESULT
ret
----------------------------------------------------------------
OD加载这个EXE.



压缩代码是否分析>否
打开脚本插件(插件>OD脚本>运行 或者 插件>ollydbg script>run script)运行UPX OEP.txt脚本.
UPX OEP.txt在上面附件中.
脚本执行完了,出现一个脚本运行完的对话框确定,现在就已经停在OEP(入口点)处了.

如果下面有一个循环,请在JMP 那行F4运行一下.再F7,就是真的OEP了.
===================================================================
004591EB          6A 00                      push 0
004591ED          39C4                     cmp esp,eax
004591EF      ^ 75 FA                      jnz short autohal.004591EB
004591F1          83EC 80                  sub esp,-80
004591F4      - E9 EF1BFDFF                jmp autohal.0042ADE8
004591F9          0000                     add byte ptr ds:,al
004591FB          0000                     add byte ptr ds:,al
004591FD          0000                     add byte ptr ds:,al
004591FF          0000                     add byte ptr ds:,al




话说thesnow站在看台上,说道:这个OEP啊,嗯,嘿,咳...就是如此,就是这般...
只见居士拿着一把斧头过来,"你Y找打!OD加载完了左下方就是显示的OEP!!!."
"非也!非也!这是壳的OEP,不是程序的OPE..."
"Y的,又不早说,兄弟们上啊!"
只见黄土漫天,风雨变色.几千号人硬是把看台处锤平了...

继续继续...
====================================================================
OD左下方有个命令行插件,输入BPX READFILE并回车.按下ALT+B看看是否已经有几个断点.
如果一个都没有,晕啊,你当前所在的位置还没有到OEP...
====================================================================

关闭其它窗口,保留CPU窗口,最大化.
F9运行1次,中断在readfile API处.
readfile当然就是读取文件了,读取自己身上的脚本.
打个比方哈:
thesnow被居士打到医院住了半个月.
不幸的事情发生了.原来这个医院是dingamao的地盘...
dimgamao原先沉迷美色,残害多少良家少女(少妇?)...后来被thesnow打得满地找牙.称再也不敢了.
这次撞到他手里,挨...
dingamao使尽(拼音:失禁?)全身力气(包括吃奶的)在thesnow头上大便(假设是大便 )
thesnow身上多了东西(附加数据),thesnow昏迷醒来过后 当然要研究一下头上是什么东西.
dingamao就在thesnow的手上按F2下断点.只要thesnow用手去摸(假设是摸),就会有一个恐龙护士来阻止(中断下来.)
thesnow第一次去摸就被发现阻止了(中断),把dinmagao也叫来了...
===========================================================
在ASM代码区右键>搜索>搜索命令序列.(可以直接按CTRL+S)

输入:
====================================================================
mov dword ptr ss:,edi
mov eax,dword ptr ss:
mov ecx,dword ptr ss:
pop edi
pop ebx
mov dword ptr ds:,ecx
xor eax,eax
pop esi
=====================================================================
假设:
dinmagao让thesnow去摸,但是在thesnow每分辨出一次**里面含有什么物质时就阻止.
dimgamao的断点如下:

找到后在那个POP EDI上面下断点(按F2)
按F9几次(可能很多次),直到寄存器窗口出现脚本(中断在上面的POP EDI处)

终于:thesnow分辨出这个东西就是**(脚本).

dingamao气消了,准备把那些**弄走.毕竟以前两人还是朋友.
看看dingamao的方法吧:
点击ECX寄存器的HEX代码,右键>在数据窗口中跟随.
内存区域就是AU3的完整代码了.
选中内存窗口>右键>备份>保存到文件>随便取一个名字,保存吧.
用ULTRAEDIT打开保存的那个文件,把两头无用的数据删除了.
OK,脚本已经完全提取了.

Hmily 发表于 2009-10-19 00:54

http://www.52pojie.cn/thread-33622-1-1.html

http://www.52pojie.cn/thread-33623-1-1.html

找了2个解老版本的现成工具~

温柔 发表于 2009-10-19 03:31

转QQ空间去

xieyuzhe 发表于 2009-12-1 02:20

来篇搞最新版本的,这个方式不行了,需要3.3.0的了

a5222520 发表于 2010-10-4 14:13

老版本的,对最新版 没有用

ldlyhwf 发表于 2012-5-21 22:57

哪有3.3.6.1的?

baoshan19880425 发表于 2012-5-24 18:56

先收藏后学习 、、、、、

xxhaishixx 发表于 2012-6-6 04:39

受教了,感谢啊
页: [1]
查看完整版本: 关于AUTOIT的反向编译[thesnow]