au3反编译方法不错的AU3反编译教程哦
字体大小: 小 中 大
对于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:[ebp-1018]
push eax
mov ecx,ebx
ANY
test al,al
ANY
lea eax,dword ptr ss:[ebp-1018]
============================================
找到后在第二个lea eax,dword ptr ss:[ebp-1018]上面下断点(按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:[ebp-1018] ; 断在这里
004069E6 |. E8 ECF7FFFF |call AutoIt3A.004061D7
004069EB |. 84C0 |test al,al
=====================================================
点击刚才lea eax,dword ptr ss:[ebp-1018]上面那个je AutoIt3A.00406AAE,看它跑哪里去.
跑到了这里:
=====================================================
00406AAE |> \FF75 0C push dword ptr ss:[ebp+C]
=====================================================
在上面的地址下断.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:[ebp-238] ; |
004393AE |. 50 push eax ; |NewFileName = "d:\x.123456789"
004393AF |. 8D85 D0FEFFFF lea eax,dword ptr ss:[ebp-130] ; |
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:[eax],al
004591FB 0000 add byte ptr ds:[eax],al
004591FD 0000 add byte ptr ds:[eax],al
004591FF 0000 add byte ptr ds:[eax],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:[ebp+10],edi
mov eax,dword ptr ss:[ebp+C]
mov ecx,dword ptr ss:[ebp+10]
pop edi
pop ebx
mov dword ptr ds:[eax],ecx
xor eax,eax
pop esi
=====================================================================
假设:
dinmagao让thesnow去摸,但是在thesnow每分辨出一次**里面含有什么物质时就阻止.
dimgamao的断点如下:
找到后在那个POP EDI上面下断点(按F2)
按F9几次(可能很多次),直到寄存器窗口出现脚本(中断在上面的POP EDI处)
终于:thesnow分辨出这个东西就是**(脚本).
dingamao气消了,准备把那些**弄走.毕竟以前两人还是朋友.
看看dingamao的方法吧:
点击ECX寄存器的HEX代码,右键>在数据窗口中跟随.
内存区域就是AU3的完整代码了.
选中内存窗口>右键>备份>保存到文件>随便取一个名字,保存吧.
用ULTRAEDIT打开保存的那个文件,把两头无用的数据删除了.
OK,脚本已经完全提取了 |