| 
 
 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,脚本已经完全提取了
 |