吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7524|回复: 3
收起左侧

[分享] 简析AutoIt程序脱壳后的自校验处理[转自UnPack.Cn]

[复制链接]
Hmily 发表于 2008-5-27 23:23
软件大小: 1739 KB
软件语言: 英文
软件类别: 国外软件 / 免费版 / 系统增强
应用平台: Win9x/NT/2000/XP
加入时间: 2005-02-13 15:41:45
下载次数: 5596
开 发 商: http://www.hiddensoft.com/AutoIt/index.html
软件介绍: 允许您使用宏来自动执行一些操作,可以将宏编译成 EXE 来运行。

【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
      
【调试环境】:WinXP、OllyDBD、PEiD、LordPE、WinHex
      
—————————————————————————————————
【调试过程】:



AutoIt是一款功能强大的程序。下面来简单分析一下AutoIt程序脱壳后的自校验处理。
—————————————————————————————————
一、如何确定是AutoIt编译的文件


先下载AutoIt主程序,用其自带的Examples文件编译一个例子。 复制内容到剪贴板 代码:
;Test AutoIt CRC

; AutoIt Version: 3.10
; Language:    English
; Platform:    WinALL
; Author:     fly

; Use the @CRLF macro to do a newline in a MsgBox - it is similar to the \n in v2.64
MsgBox(0, "Test AutoIt CRC", "       fly" & @CRLF & "http://www.unpack.cn" & @CRLF & "    2006.02.25")
使用Aut2Exe.exe编译Test.AutoIt.CRC.au3脚本,得到Test.AutoIt.CRC.exe

1、AutoIt 目前使用UPX V1.25压缩,脚本数据以Overlay保存
PEiD V0.94显示如下:

用WinHex打开Test.AutoIt.CRC.exe,可以看到UPX版本:


2、在WinHex里面搜索ASCII文本字符串:AutoIt

找到“<description>AutoIt 3</description>”字样


基本可以确定是AutoIt编译的文件了


—————————————————————————————————
二、脱壳


UPX用UPX相应版本自脱是最完美的
使用UPX V1.25 -d对Test.AutoIt.CRC.exe脱壳,附加数据自动保留下来
也可以用UPX-Ripper脱壳
如果手动脱壳的话,则需要手工处理Overlay
脱壳文件重命名为:UnPacKed.exe


—————————————————————————————————
三、附加数据


由于脚本数据以Overlay保存在程序中,所以先说一下如何简单识别附加数据吧。
1、看上面的图片,PEiD侦壳时已经显示“[Overlay]”字样
2、用LordPE打开Test.AutoIt.CRC.exe的区段,可以看到最后一个区段的信息:
复制内容到剪贴板 代码:
RawOffset=0001B800
RawSize=00007200
0001B800+00007200=22A00
最后一个区段数据至0X229FF处为止。
如果偏移0X22A00处及其后还有数据,就是Overlay了
3、可以用LordPE来快速确定Overlay
在最后区段上点右键->Hex Edit Secton,向下拉动滚动条察看

一直拉到“黑白”交界处,0X22A00下面就是附加数据了。


—————————————————————————————————
四、分析校验


如果现在运行脱壳文件,会提示错误的

那么开始调试吧。用OllyDbg载入Test.AutoIt.CRC.exe原版 复制内容到剪贴板 代码:
00459160   60         pushad
//暂停在UPX外壳入口
00459161   BE 00E04300    mov esi,43E000
00459166   8DBE 0030FCFF   lea edi,dword ptr ds:[esi+FFFC3000]
0045916C   57         push edi
0045916D   83CD FF      or ebp,FFFFFFFF
00459170   EB 10       jmp short 00459182
不必管UPX
BP SetFilePointer
F9运行,中断后取消断点 复制内容到剪贴板 代码:
0011EB10  0042C552 /CALL 到 SetFilePointer 来自 Test_Aut.0042C54C
0011EB14  000000D8 |hFile = 000000D8 (window)
0011EB18  FFFFFFF4 |OffsetLo = FFFFFFF4 (-12.)
0011EB1C  00000000 |pOffsetHi = NULL
0011EB20  00000002 \Origin = FILE_END
文件指针移动至文件末尾,从末尾再向上移动12字节

再BP ReadFile,中断后取消断点 复制内容到剪贴板 代码:
0011EACC  0042C98E /CALL 到 ReadFile 来自 Test_Aut.0042C988
0011EAD0  000000D8 |hFile = 000000D8 (window)
0011EAD4  003F9D28 |Buffer = 003F9D28
0011EAD8  00001000 |BytesToRead = 1000 (4096.)
0011EADC  0011EAF0 |pBytesRead = 0011EAF0
0011EAE0  00000000 \pOverlapped = NULL
数据窗口中定位到003F9D28处,Ctrl+F9执行完ReadFile 复制内容到剪贴板 代码:
003F9D28 22 87 A8 AA AA 80 A8 AA 3C FC 95 58可以看到003F9D28处是读取的12个字节数据

用WinHex打开Test.AutoIt.CRC.exe,到末尾看看 复制内容到剪贴板 代码:
Offset   0 1 2 3 4 5 6 7  8 9 A B C D E F
00022D80              22 87 A8 AA AA 80 A8 AA
00022D90  3C FC 95 58
正是这些数据。

这些数据有何用处?呵呵,3个Dword数据就是AutoIt需要校验的三个值了

抓住这个线索吧
数据窗口003F9D28处选择这12个字节,点击右键->断点->内存访问
F9运行,中断在0042C88F 复制内容到剪贴板 代码:
0042C88B   0FB601       movzx eax,byte ptr ds:[ecx]
0042C88E   41         inc ecx
0042C88F   890E        mov dword ptr ds:[esi],ecx
0042C891   5E         pop esi
0042C892   C3         retn
//返回00429747

00429742   E8 86300000    call 0042C7CD
00429747   83F8 FF      cmp eax,-1
0042974A   59         pop ecx
0042974B   74 28       je short 00429775
0042974D   8803        mov byte ptr ds:[ebx],al
//EBX=0012ECAD  每个处理取4个字节至[EBX]
0042974F   8B46 18      mov eax,dword ptr ds:[esi+18]
00429752   43         inc ebx
00429753   FF4D 08      dec dword ptr ss:[ebp+8]
00429756   8945 14      mov dword ptr ss:[ebp+14],eax
00429759   837D 08 00     cmp dword ptr ss:[ebp+8],0
0042975D   0F85 76FFFFFF   jnz 004296D9
00429763   8B45 10      mov eax,dword ptr ss:[ebp+10]
00429766   5F         pop edi
00429767   5E         pop esi
00429768   5B         pop ebx
00429769   C9         leave
0042976A   C3         retn
取消内存断点,在数据窗口定位至0012ECAD处,选择那4个字节,右键->断点->内存写入
F9运行,中断在00427F07处 复制内容到剪贴板 代码:
00427EFD   FF36        push dword ptr ds:[esi]
00427EFF   8D5E 04      lea ebx,dword ptr ds:[esi+4]
00427F02   BF AAAAAAAA    mov edi,AAAAAAAA
00427F07   317D F8      xor dword ptr ss:[ebp-8],edi
//[ebp-8]=AAA88722 XOR AAAAAAAA=00022D88
//第一个校验值
//这个是计算CRC的代码长度
//可以记住0X00022D88处数据,然后在脱壳文件中搜索,就可以得到新的长度=00043B88
取消内存断点,下面就是其他2组校验值的处理了 复制内容到剪贴板 代码:
00427F0A   6A 01       push 1
00427F0C   6A 04       push 4
00427F0E   53         push ebx
00427F0F   E8 56170000    call 0042966A
00427F14   FF36        push dword ptr ds:[esi]
00427F16   313B        xor dword ptr ds:[ebx],edi
//[ebx]=[0012FCD0]=AAA880AA XOR AAAAAAAA=00022A00
//第二个校验值
//WinHex中去偏移00022A00处看看,发现是附加数据开始的地址
复制内容到剪贴板 代码:
00427F18   8D45 F0      lea eax,dword ptr ss:[ebp-10]
00427F1B   6A 01       push 1
00427F1D   6A 04       push 4
00427F1F   50         push eax
00427F20   E8 45170000    call 0042966A
00427F25   317D F0      xor dword ptr ss:[ebp-10],edi
//[ebp-10]=[0012ECA4]=5895FC3C XOR AAAAAAAA=F23F5696
//第三个校验值
//这个运算后的值是文件校验值
复制内容到剪贴板 代码:
00427F28   33FF        xor edi,edi
00427F2A   57         push edi
00427F2B   57         push edi
00427F2C   FF36        push dword ptr ds:[esi]
00427F2E   E8 3A160000    call 0042956D
00427F33   8B45 F8      mov eax,dword ptr ss:[ebp-8]
00427F36   83C4 48      add esp,48
00427F39   85C0        test eax,eax
00427F3B   7E 4A       jle short 00427F87
00427F3D   8D8F 00000100   lea ecx,dword ptr ds:[edi+10000]
00427F43   3BC8        cmp ecx,eax
00427F45   7E 07       jle short 00427F4E
00427F47   2BC7        sub eax,edi
00427F49   8945 0C      mov dword ptr ss:[ebp+C],eax
00427F4C   EB 07       jmp short 00427F55
00427F4E   C745 0C 00000100  mov dword ptr ss:[ebp+C],10000
00427F55   FF36        push dword ptr ds:[esi]
00427F57   037D 0C      add edi,dword ptr ss:[ebp+C]
00427F5A   8D85 E4FEFEFF   lea eax,dword ptr ss:[ebp+FFFEFEE4]
00427F60   FF75 0C      push dword ptr ss:[ebp+C]
00427F63   6A 01       push 1
00427F65   50         push eax
00427F66   E8 FF160000    call 0042966A
00427F6B   83C4 10      add esp,10
00427F6E   8D85 E4FEFEFF   lea eax,dword ptr ss:[ebp+FFFEFEE4]
00427F74   8D4D EC      lea ecx,dword ptr ss:[ebp-14]
00427F77   FF75 0C      push dword ptr ss:[ebp+C]
00427F7A   50         push eax
00427F7B   E8 25060000    call 004285A5
//计算校验值
00427F80   8B45 F8      mov eax,dword ptr ss:[ebp-8]
00427F83   3BF8        cmp edi,eax
//EAX=计算CRC的代码长度
00427F85   7C B6       jl short 00427F3D
00427F87   8B45 F0      mov eax,dword ptr ss:[ebp-10]
00427F8A   3B45 EC      cmp eax,dword ptr ss:[ebp-14]
//[ebp-14]中是计算出的校验值   比较校验值
00427F8D   74 05       je short 00427F94
//不跳就挂了
00427F8F   6A 03       push 3
00427F91   5F         pop edi
00427F92   EB 45       jmp short 00427FD9
—————————————————————————————————
五、修复校验


分析清楚了
AutoIt取Overlay的最后12个字节异或AAAAAAAA得到校验值或者数据地址 复制内容到剪贴板 代码:
1、第一个校验数据 XOR AAAAAAAA=计算CRC的代码长度
2、第二个校验数据 XOR AAAAAAAA=附加数据开始的地址
3、第三个校验数据 XOR AAAAAAAA=文件校验值
看看我们用UPX对Test.AutoIt.CRC.exe脱壳得到的UnPacKed.exe文件信息: 复制内容到剪贴板 代码:
1、计算CRC的代码长度=00043B88
2、附加数据开始的地址=00043800
3、文件校验值=需要跟踪->F928C0C3
修复校验: 复制内容到剪贴板 代码:
1、第一个校验数据=00043B88 XOR AAAAAAAA=AAAE9122
2、第二个校验数据=00043800 XOR AAAAAAAA=AAAE92AA
在UnPacKed.exe的校验数据开始的地址处修正这2个值,再看文件校验
载入UnPacKed.exe调试,BP 00427F8A,运行、中断,[ebp-14]=[0012ECA0]=F928C0C3 复制内容到剪贴板 代码:
3、第三个校验数据=F928C0C3 XOR AAAAAAAA=53826A69当然,第三个校验可以修改00427F8D jmp 00427F94直接去除,但是不推荐这样做 复制内容到剪贴板 代码:
Offset   0 1 2 3 4 5 6 7  8 9 A B C D E F
00043B80              22 91 AE AA AA 92 AE AA
00043B90  69 6A 82 53

修正这12个字节后,脱壳文件就可以正常运行了。


—————————————————————————————————
六、例子演示


论坛有个SW.exe也是AutoIt编译的文件
用UPX-Ripper脱壳得到SW.UnPacKed.exe
载入SW.exe原版调试 复制内容到剪贴板 代码:
[/code]
00476760   60         pushad
//暂停在UPX外壳入口
00476761   BE 00E04400    mov esi,44E000
00476766   8DBE 0030FBFF   lea edi,dword ptr ds:[esi+FFFB3000]
0047676C   57         push edi
0047676D   83CD FF      or ebp,FFFFFFFF
00476770   EB 10       jmp short 00476782

004768CB   61         popad
004768CC   E9 17A9FCFF    jmp 004411E8
//F4 到这里
复制内容到剪贴板 代码:
004411E8   55         push ebp
//OEP
004411E9   8BEC        mov ebp,esp
004411EB   6A FF       push -1
004411ED   68 28E44400    push 44E428
004411F2   68 50254400    push 442550
004411F7   64:A1 00000000   mov eax,dword ptr fs:[0]
004411FD   50         push eax
004411FE   64:8925 00000000  mov dword ptr fs:[0],esp
00441205   83EC 58      sub esp,58
00441208   53         push ebx
00441209   56         push esi
0044120A   57         push edi
0044120B   8965 E8      mov dword ptr ss:[ebp-18],esp
0044120E   FF15 A4D94600   call dword ptr ds:[46D9A4] ; kernel32.GetVersion
正常的分析途径如上面所操作的。不过这里用个简便的方法来到检验值处理的地方
Ctrl+F 在整个段块搜索命令:mov edi,0AAAAAAAA
找到0043D50A处,下断,F9运行后中断 复制内容到剪贴板 代码:
0043D50A   BF AAAAAAAA    mov edi,AAAAAAAA
0043D50F   317D FC      xor dword ptr ss:[ebp-4],edi
//[ebp-4]=[0012E844]=AAA81120 XOR AAAAAAAA=0002BB8A
//第一个校验值
//计算CRC的代码长度
//看看0X0002BB8A处数据,然后去SW.UnPacKed.exe里搜索,得到新的长度=0005F58A
0043D512   6A 01       push 1
0043D514   6A 04       push 4
0043D516   53         push ebx
0043D517   E8 55230000    call 0043F871
0043D51C   FF36        push dword ptr ds:[esi]
0043D51E   313B        xor dword ptr ds:[ebx],edi
//[ebx]=[0012F864]=AAA80CAA XOR AAAAAAAA=0002A600
//第二个校验值
//附加数据开始的地址,UnPacKed.exe里的附加数据开始地址=0005E000
0043D520   8D45 F4      lea eax,dword ptr ss:[ebp-C]
0043D523   6A 01       push 1
0043D525   6A 04       push 4
0043D527   50         push eax
0043D528   E8 44230000    call 0043F871
0043D52D   317D F4      xor dword ptr ss:[ebp-C],edi
//[ebp-C]=[0012E83C]=5BC7EF2F XOR AAAAAAAA=F16D4585
//第三个校验值
//这个运算后的值是文件校验值
0043D530   33FF        xor edi,edi
0043D532   57         push edi
0043D533   57         push edi
0043D534   FF36        push dword ptr ds:[esi]
0043D536   E8 39220000    call 0043F774
0043D53B   8B45 FC      mov eax,dword ptr ss:[ebp-4]
0043D53E   83C4 48      add esp,48
0043D541   85C0        test eax,eax
0043D543   7E 4A       jle short 0043D58F
0043D545   8D8F 00000100   lea ecx,dword ptr ds:[edi+10000]
0043D54B   3BC8        cmp ecx,eax
0043D54D   7E 07       jle short 0043D556
0043D54F   2BC7        sub eax,edi
0043D551   8945 0C      mov dword ptr ss:[ebp+C],eax
0043D554   EB 07       jmp short 0043D55D
0043D556   C745 0C 00000100  mov dword ptr ss:[ebp+C],10000
0043D55D   FF36        push dword ptr ds:[esi]
0043D55F   037D 0C      add edi,dword ptr ss:[ebp+C]
0043D562   8D85 E8FEFEFF   lea eax,dword ptr ss:[ebp+FFFEFEE8]
0043D568   FF75 0C      push dword ptr ss:[ebp+C]
0043D56B   6A 01       push 1
0043D56D   50         push eax
0043D56E   E8 FE220000    call 0043F871
0043D573   83C4 10      add esp,10
0043D576   8D85 E8FEFEFF   lea eax,dword ptr ss:[ebp+FFFEFEE8]
0043D57C   8D4D F0      lea ecx,dword ptr ss:[ebp-10]
0043D57F   FF75 0C      push dword ptr ss:[ebp+C]
0043D582   50         push eax
0043D583   E8 25060000    call 0043DBAD
0043D588   8B45 FC      mov eax,dword ptr ss:[ebp-4]
0043D58B   3BF8        cmp edi,eax
0043D58D   7C B6       jl short 0043D545
0043D58F   8B45 F4      mov eax,dword ptr ss:[ebp-C]
0043D592   3B45 F0      cmp eax,dword ptr ss:[ebp-10]
//比较校验值
0043D595   74 05       je short 0043D59C
0043D597   6A 03       push 3
0043D599   5F         pop edi
0043D59A   EB 45       jmp short 0043D5E1
修复SW.UnPacKed.exe的校验: 复制内容到剪贴板 代码:
1、第一个校验数据=0005F58A XOR AAAAAAAA=AAAF5F20
2、第二个校验数据=0005E000 XOR AAAAAAAA=AAAF4AAA
在SW.UnPacKed.exe的校验数据开始的地址处修正这2个值,再看文件校验
载入SW.UnPacKed.exe调试,BP 0043D592,运行、中断,[ebp-10]=[0012E838]=6C93F7B3 复制内容到剪贴板 代码:
3、第三个校验数据=6C93F7B3 XOR AAAAAAAA=C6395D19再修正最后一个校验值,可以运行了。


Game Over
————————————————————————————————— 复制内容到剪贴板

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

淫乱一世纪 发表于 2008-5-30 19:35
严重学习,fly太强大了。。
wnn500 发表于 2010-6-19 19:37
看得头晕了。站长能做个自动脱壳软件就好了。要不做个反编译的也行啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 21:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表