志福's profile阿福台PhotosBlogLists Tools Help

Blog


    6/16/2008

    人生

    想法总是很多,现实总很无奈;只要尽你全力,人生定会精彩。
    6/6/2008

    Asprotect V2.X 的脱壳与修复的总结及练习

    作 者: blackeyes
    关于Asprotect V2.X 的脱壳与修复, loveboom的《ASPROTECT 2.x 脱壳系列》已经非常的全面与经典.
    本人在此只是依葫芦画瓢, 并将有些地方再详细的解释一下, 给菜鸟们脱Asprotect V2.X时进行参考, 高手就不要看了.
    先在理论上研讨一下, 由于编译器的不一样, C 与 Delphi 所编译的汇编结果有差别, Asprotect 加壳时处理的也不一样.
    先假设有一程序:
    OEP: 00401000
    IAT: 00407000 - 00407FFF
    在00401100 CALL DLL1.API1
    在00401180 CALL DLL1.API2
    Ospr 加壳后, 好多的API CALL 被改成 CALL 12000000
    然后开始研究.
    1. C/C++ Program
    1.1) 未被加壳的程序
    00401000 55 PUSH EBP ; 程序 OEP
    00401001 8BEC MOV EBP, ESP
    ...
    00401100 FF15 00704000 CALL DWORD PTR DS:[00407000] ; DLL1.API1
    00401106 ...
    00401180 FF15 04704000 CALL DWORD PTR DS:[00407004] ; DLL1.API2
    00401186 ...
    ********* IAT 可能是这样的 ************
    00407000 DD 7C571000 // DLL1.API1
    00407004 DD 7C572000 // DLL1.API2
    ...
    004070FC DD 00000000
    00407100 DD 7D00XXXX // DLL2.API1
    ...
    004071FC DD 00000000
    ...
    00407F00 DD 7F00XXXX // DLLn.API1
    ...
    00407FFC DD 00000000

    1.2) 被 Asprotect 加壳后的程序在OEP
    00401000 55 PUSH EBP ; 程序 OEP
    00401001 8BEC MOV EBP, ESP
    ...
    00401100 E8 FBEEBF11 CALL 12000000 ; 壳
    00401105 ??
    00401106 ...
    00401180 E8 7BEEBF11 CALL 12000000 ; 壳
    00401185 ??
    00401186 ...
    *************IAT************************
    00407000 DD ???????? // 被加密的 DLL1.API1 信息
    00407004 DD 7C572000 // 未加密的 DLL1.API2
    ASPR 将许多的API CALL 都改成了统一的 CALL 12000000
    即改 CALL DWORD PTR DS:[xxxxx] 成 CALL 12000000
    作 者: blackeyes
    关于Asprotect V2.X 的脱壳与修复, loveboom的《ASPROTECT 2.x 脱壳系列》已经非常的全面与经典.
    本人在此只是依葫芦画瓢, 并将有些地方再详细的解释一下, 给菜鸟们脱Asprotect V2.X时进行参考, 高手就不要看了.
    先在理论上研讨一下, 由于编译器的不一样, C 与 Delphi 所编译的汇编结果有差别, Asprotect 加壳时处理的也不一样.
    先假设有一程序:
    OEP: 00401000
    IAT: 00407000 - 00407FFF
    在00401100 CALL DLL1.API1
    在00401180 CALL DLL1.API2
    Ospr 加壳后, 好多的API CALL 被改成 CALL 12000000
    然后开始研究.
    1. C/C++ Program
    1.1) 未被加壳的程序
    00401000 55 PUSH EBP ; 程序 OEP
    00401001 8BEC MOV EBP, ESP
    ...
    00401100 FF15 00704000 CALL DWORD PTR DS:[00407000] ; DLL1.API1
    00401106 ...
    00401180 FF15 04704000 CALL DWORD PTR DS:[00407004] ; DLL1.API2
    00401186 ...
    ********* IAT 可能是这样的 ************
    00407000 DD 7C571000 // DLL1.API1
    00407004 DD 7C572000 // DLL1.API2
    ...
    004070FC DD 00000000
    00407100 DD 7D00XXXX // DLL2.API1
    ...
    004071FC DD 00000000
    ...
    00407F00 DD 7F00XXXX // DLLn.API1
    ...
    00407FFC DD 00000000

    1.2) 被 Asprotect 加壳后的程序在OEP
    00401000 55 PUSH EBP ; 程序 OEP
    00401001 8BEC MOV EBP, ESP
    ...
    00401100 E8 FBEEBF11 CALL 12000000 ; 壳
    00401105 ??
    00401106 ...
    00401180 E8 7BEEBF11 CALL 12000000 ; 壳
    00401185 ??
    00401186 ...
    *************IAT************************
    00407000 DD ???????? // 被加密的 DLL1.API1 信息
    00407004 DD 7C572000 // 未加密的 DLL1.API2
    ASPR 将许多的API CALL 都改成了统一的 CALL 12000000
    即改 CALL DWORD PTR DS:[xxxxx] 成 CALL 12000000

    [转]手动脱壳ASProtect V2.X Registered

    【PYG官方论坛】http://bbs.chinapyg.com
    大家有空去看看

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


    我是个菜鸟,想跟大家学习点技术。

    第一次做动画,有什么错误的地方望高手指正。

    今天和大家讨论一下

    手动脱壳之ASProtect V2.X Registered -> Alexey Solodovnikov *

    //////////////////////////
    设置Ollydbg忽略除了“内存访问异常”之外的所有其他异常选项。
    用插件去掉Ollydbg的调试器标志。

    ////////////////////////////////////////
    OD载入后停在这里:
    00401000 >  68 01B05600     PUSH csetup.0056B001  ===》壳的入口,F9运行
    00401005    E8 01000000     CALL csetup.0040100B
    0040100A    C3              RETN
    0040100B    C3              RETN
    0040100C    0D 6F2F026F     OR EAX,6F022F6F
    00401011    5B              POP EBX

    ===============
    Shift+F9按N次,注意右下角堆栈
    00AFFAFF    C601 9E         MOV BYTE PTR DS:[ECX],9E
    00AFFB02    BB 71FE8A67     MOV EBX,678AFE71
    00AFFB07    64:8F06         POP DWORD PTR FS:[ESI]
    00AFFB0A    0000            ADD BYTE PTR DS:[EAX],AL
    00AFFB0C    83C4 04         ADD ESP,4
    00AFFB0F    8D0C07          LEA ECX,DWORD PTR DS:[EDI+EAX]
    00AFFB12    59              POP ECX

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

    0012FF50   0012FF5C  指向下一个 SEH 记录的指针
    0012FF54   00AFFA50  SE处理程序
    0012FF58   00000002
    0012FF5C   0012FF80  指向下一个 SEH 记录的指针
    0012FF60   00AFFFE8  SE处理程序
    0012FF64   0012FF78
    0012FF68   00A80000
    0012FF6C   00AFF62C
    0012FF70   00000000
    0012FF74   00B3D84C  ASCII "FECE69A1-E37D"  ====》硬盘特征指纹
    0012FF78   0012FF98
    0012FF7C   00ADE2D0
    0012FF80   0012FFE0  指向下一个 SEH 记录的指针
    0012FF84   00AFF854  SE处理程序
    0012FF88   0012FF98

    Shift+F9经过=23次异常后,堆栈出现硬盘特征指纹
    =================
    Shift+F9按5次,堆栈硬盘特征指纹消失,再按1次Shift+F9
    00AFE8F9    C601 9E         MOV BYTE PTR DS:[ECX],9E
    00AFE8FC    BB 71FE8A67     MOV EBX,678AFE71
    00AFE901    64:8F06         POP DWORD PTR FS:[ESI]
    00AFE904    0000            ADD BYTE PTR DS:[EAX],AL
    00AFE906    83C4 04         ADD ESP,4
    00AFE909    8D0C07          LEA ECX,DWORD PTR DS:[EDI+EAX]
    00AFE90C    59              POP ECX
    00AFE90D    A1 4848B000     MOV EAX,DWORD PTR DS:[B04848]
    ==================
    向上找到这里:
    00AFE8E3    C3              RETN
    00AFE8E4    EB 01           JMP SHORT 00AFE8E7
    00AFE8E6    9A C1D19D36 EB0>CALL FAR 01EB:369DD1C1                   ; 远调用
    00AFE8ED    9A 83F1102B C96>CALL FAR 64C9:2B10F183                   ; 远调用
    00AFE8F4    FF31            PUSH DWORD PTR DS:[ECX]
    00AFE8F6    64:8921         MOV DWORD PTR FS:[ECX],ESP
    00AFE8F9    C601 9E         MOV BYTE PTR DS:[ECX],9E

    在00AFE8E3    C3              RETN按F2下断,Shift+F9断下,取消断点,F8单步

    7C9237BF    64:8B25 0000000>MOV ESP,DWORD PTR FS:[0]
    7C9237C6    64:8F05 0000000>POP DWORD PTR FS:[0]
    7C9237CD    8BE5            MOV ESP,EBP
    7C9237CF    5D              POP EBP
    7C9237D0    C2 1400         RETN 14

    Alt+M查看内存在00401000按F2下断,F9运行
    004B02B8    55              PUSH EBP
    004B02B9    8BEC            MOV EBP,ESP
    004B02BB    83C4 E4         ADD ESP,-1C
    004B02BE    53              PUSH EBX
    004B02BF    56              PUSH ESI
    004B02C0    33C0            XOR EAX,EAX
    004B02C2    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX

    004B02B8程序OEP脱壳之。是Borland Delphi 6.0 - 7.0
    ==================

    脱壳之后如何修复请高手指教。

    动画下载
    http://free.ys168.com/?a3chenming

    破解常用断点大全


    断点大全

    断点大全
    密码常用中断
    Hmemcpy (win9x专用)
    GetDlgItemTextA
    GetDlgItemInt
    vb:
    getvolumeinformationa  

    vbastrcomp (trw)
    Bpx __vbaStrComp (记得是两个 '_')
    MSVBVM60!_vbastrcomp|sofice
    MSVBVM50!           | 

    VBAI4STR 

    Ctrl+D
    bpx msvbvm60!__vbastrcomp do "d *(esp+0c)"(softice)
    按几次F5出册码出来了。
    bpx regqueryvalueexa do “d esp->8”(trw) 

    vbaVarTstEq 判断是否注册的函数
    (0042932F 66898580FEFFFF          mov word ptr [ebp+FFFFFE80], ax
    改为0042932F 66898580FEFFFF       mov word ptr [ebp+FFFFFE80], bx)

    时间常用中断
    GetSystemTime
    GetLocalTime
    GetTickCount
    vb:
    rtcGetPresentDate          //取得当前日期 

    杀窗常用中断
    Lockmytask (win9x专用)
    DestroyWindow
    mouse_event (鼠标中断)
    postquitmessage (Cracking足彩xp,很有用^_^)
    vb:
    _rtcMsgBox 

    ini文件内容常用中断
    GetPrivateProfileStringA
    GetPrivateProfileProfileInt 

    key文件:
    getprivateprofileint
    ReadFile
    CreateFileA 

    注册表常用中断
    RegQueryvalueA
    RegQueryvalueExA 

    狗加密中断
    BPIO -h 278 R
    BPIO -h 378 R  

    其它常用函数断点
    CreateFileA (读狗驱动程序),
    DeviceIOControl,
    FreeEnvironmentStringsA (对付HASP非常有效).
    Prestochangoselector (16-bit HASP's), '7242' 查找字符串 (对付圣天诺).具体含义参考下面的范例。 

    光盘破解中断
    16:
    getvolumeinformation
    getdrivetype
    int 2fh (dos)
    32:
    GetDriveTypeA  
    GetFullPathNameA
    GetWindowsDirectoryA 

    读磁盘中断
    GETLASTERROR 返回扩充出错代码  

    限制中断
    EnableMenuItem 允许、禁止或变灰指定的菜单条目
    EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)  

    不知道软盘中断是什么了?还有其它特殊中断,不知道其他朋友可否说一下了?
    如:Lockmytask and mouse_event,这些就不是api32函数?
    win9x 与 win2k进行破解,以上中断有部分已经不能用了?
    不知道在win2k上,以上常用中断函数是什么了?
    也就是问密码、时间、窗口、ini、key、注册表、加密狗、光盘、软盘、限制等!
    了解常用的中断,对破解分析可以做到事半功倍!
    请大家说一下!还有如何破解了某个软件时,一重启就打回原形?
    不知道下什么中断了?可以分为三种情况:
    1.比较可能在注册表中
    2.比较在特殊文件(*.key *.ini *.dat等)
    3.比较在程序中,没有任何错误提示或者反译也找不到明显字符(这个就是我想问的) 

    还有一个是最难的,就是去掉水印!
    也可以三种情况:
    A.水印是位图文件(bitblt,creatBITMAP等位图函数)
    B.水印是明显字符(反译分析)
    C.水印不是明显字符(如:This a demo!它只是显示在另一个制作文件上,可是*.htm *.exe等)
    C.才是最难搞,也是很多人想知道的!包括我在内。不知道高手们有何提示了? 

    广告条:
    可以分两种情况:
    A.从创建窗口进手,可以用到movewindow或者其它窗口函数!
    B.从位图进手,也可以用到bitblt或者其它位图函数!
    最后可以借助一些现有工具(如:api27,vwindset,freespy之类的工具) 

    葡萄虽无树,藤生棚中秧。
    人处凡尘中,岂不惹尘埃? 

    小球[CCG]
    那要看是在哪作的标记,通常是在注册表中留下信息!
    在softice中就要用bpx regqueryvalueexa do "d esp->8"来中断看看,
    在trw中要用bpx regqueryvalueexa do "d*(esp+8)"来中断看看。
    还有的是在本目录下留下注册信息,常见的有.dat .ini .dll等等,
    我是用bpx readfile来中断的,还有的是在windows目录下留下注册信息。
    你可以借助专用的工具帮助你查看,入filemon等!  

    vb: 

    1、__vbaVarTstNe              //比较两个变量是否不相等
    2、rtcR8ValFromBstr            //把字符串转换成浮点数
    3、rtcMsgBox  显示一信息对话框  
    4、rtcBeep                    //让扬声器叫唤
    5、rtcGetPresentDate          //取得当前日期  

    针对字串:
    __vbaStrComp
    __vbaStrCmp
    __vbaStrCompVar
    __vbaStrLike
    __vbaStrTextComp
    __vbaStrTextLike
    针对变量:
    __vbaVarCompEq
    __vbaVarCompLe
    __vbaVarCompLt
    __vbaVarCompGe
    __vbaVarCompGt
    __vbaVarCompNe  

    VB的指针:
    THROW  

    VB DLL还调用了oleauto32.dll中的部分函数。oleauto32.dll是个通用的proxy/stub DLL,其每个函数的原型在<oleauto.h>中定义,并在MSDN中有详细描述。这也有助于理解VB DLL中的函数的作用。  

    举例:  

    LEA EAX, [EBP-58]
    PUSH EAX
    CALL [MSVBVM60!__vbaI4Var]  

    执行call之前敲dd eax+8,得到的值为3;
    执行完call之后,eax = 3
    从而可知__vbaI4Var的作用是将一个VARIANT转换为I4(即一个长整数)。 

    __vbaVarTstNe似乎是用来进行自校验的,正常情况下返回值为0。
    已知适用的软件有:网络三国智能机器人、音乐贺卡厂。当这两个软件被脱壳后都回出错,网络三国智能机器人会产生非法*作,而音乐贺卡厂会告诉你是非法拷贝,通过修改__vbaVarTstNe的返回值都可让它们正常运行。
    所以当您遇到一个VB软件,脱壳后无法正常运行,而又找不出其它问题时,可试试拦截这个函数,说不定会有用哦。8-) 

    API不太知道,也许可以通过BIOS在98平台上读写扇区,不过在2000/NT下可以通过内黑ATAPI,HAL写扇区
    machoman[CCG]
    bpx WRITE_PORT_BUFFER_USHORT
    NT/2000下这个断点,当edx=1f0h,时,可以看见EDI地址内数据为扇区位置数据,必须先 在winice.dat 中装入hal.sys 详细内容看ATAPI手册  

    补充篇:
    关于对VB程序和时间限制程序的断点
    CrackerABC
    先给出修改能正确反编译VB程序的W32DASM的地址:
    ======================
    offsets 0x16B6C-0x16B6D  

    修改机器码为: 98 F4
    ======================  

    VB程序的跟踪断点:  

    ============
    MultiByteToWideChar,
    rtcR8ValFromBstr,
    WideCharToMultiByte,
    __vbaStrCmp
    __vbaStrComp
    __vbaStrCopy
    __vbaStrMove
    __vbaVarTstNe
    rtcBeep
    rtcGetPresentDate (时间API)
    rtcMsgBox
    =========  

    时间限制断点:  

    ================
    CompareFileTime
    GetLocalTime
    GetSystemTime
    GetTimeZoneInformation
    msvcrt.diffTime()
    msvcrt.Time()
    ================  

    一般处理

    bpx hmemcpy
    bpx MessageBox
    bpx MessageBoxExA
    bpx MessageBeep
    bpx SendMessage 

    bpx GetDlgItemText
    bpx GetDlgItemInt
    bpx GetWindowText
    bpx GetWindowWord
    bpx GetWindowInt
    bpx DialogBoxParamA
    bpx CreateWindow
    bpx CreateWindowEx
    bpx ShowWindow
    bpx UpdateWindow 

    bmsg xxxx wm_move
    bmsg xxxx wm_gettext
    bmsg xxxx wm_command
    bmsg xxxx wm_activate   

    时间相关
    bpint 21 if ah==2A (DOS)
    bpx GetLocalTime
    bpx GetFileTime
    bpx GetSystemtime   

    CD-ROM 或 磁盘相关
    bpint 13 if ah==2 (DOS)
    bpint 13 if ah==3 (DOS)
    bpint 13 if ah==4 (DOS)
    bpx GetFileAttributesA
    bpx GetFileSize
    bpx GetDriveType
    bpx GetLastError
    bpx ReadFile
    bpio -h (Your CD-ROM Port Address) R   

    软件狗相关
    bpio -h 278 R
    bpio -h 378 R   

    键盘输入相关
    bpint 16 if ah==0 (DOS)
    bpint 21 if ah==0xA (DOS)   

    文件访问相关
    bpint 21 if ah==3dh (DOS)
    bpint 31 if ah==3fh (DOS)
    bpint 21 if ah==3dh (DOS)
    bpx ReadFile
    bpx WriteFile
    bpx CreateFile
    bpx SetFilePointer
    bpx GetSystemDirectory  

    INI 初始化文件相关
    bpx GetPrivateProfileString
    bpx GetPrivateProfileInt
    bpx WritePrivateProfileString
    bpx WritePrivateProfileInt  

    注册表相关
    bpx RegCreateKey
    bpx RegDeleteKey
    bpx RegQueryvalue
    bpx RegCloseKey
    bpx RegOpenKey  

    注册标志相关
    bpx cs:eip if EAX==0  

    内存标准相关
    bpmb cs:eip rw if 0x30:0x45AA==0  

    显示相关
    bpx 0x30:0x45AA do "d 0x30:0x44BB"
    bpx CS:0x66CC do "? EAX"

    [转]ASProtect V2.X脱壳+处理附加数据+去自校验~ASProtect V2.X脱壳+处理附加数据+去自校验~

    ------------------------------------------------------------------
    ASProtect V2.X脱壳+处理附加数据+去自校验
    作者:Hmily
    博客:Http://Blog.52Hmily.Cn
    QQ群:39940458
    -------------------------------------------------------------------
    大家好,我是Hmily,今天给大家带来 Q宠保姆VC版 2.23 SP8版2007.09.13脱壳教程,需要的工具有:
    PEiD,OD,Volx大侠ASProtect脚本(http://www.unpack.cn/viewthread.php?tid=9487),ImportREC,Overlay 最终版,Resource Binder......(这些网上都能下到,就不提供了)
    这个是我上次脱Q宠保姆VC版 2.23 SP7版 2007.09.06的记录:http://hi.baidu.com/52hmily/blog ... 7a120b28388a04.html
    好,开始,先查下壳
    普通扫描:ASProtect V2.X Registered -> Alexey Solodovnikov          * Sign.By.fly [Overlay] *注意是有附加数据的
    用插件VerA 0.15扫描:Version: ASProtect 2.3 SKE build 06.26 Beta [Extract]

    第一步:脱壳
    先OD载入吧,运行脚本,就会自动脱壳了,脱完先修复,先查看OD运行记录,再打开ImportREC,然后对照着填OEP地址,点获取输入表,再点修复转存文件。

    第二步:处理附加数据
    好了,现在来处理附加数据,打开Overlay,点复制Overlay,这样就处理了附加数据

    第三步:去自校验
    现在还是运行不了,看来是有自校验,我们把脱好的程序再次载入OD,在命令出输入:bp CreateFileA,回车,按F9运行,到这就可以了,下面看清楚,点反汇编窗口中跟随,F2下端,F9运行到这里,取消断点,这里都是系统的领空,我们要到程序的领空去,按F8先跟到程序领空,好,这里已经到系统领空了,下面还是用F8跟,后面慢慢来,大家看好,
    004638D8      .    A3 04DB4D00      mov        dword ptr [4DDB04], eax
    004638DD      .    E8 61F5FFFF      call      00462E43
    004638E2      .    E8 272BFFFF      call      0045640E
    004638E7      .    85C0            test      eax, eax
    004638E9      .    0F85 15010000 jnz        00463A04    ————跳转没实现
    004638EF      .    52              push      edx
    004638F0      .    57              push      edi
    004638F1      .    C1D2 E7          rcl        edx, 0E7
    004638F4      .    83EA 03          sub        edx, 3
    004638F7      .    68 28214200      push      00422128
    004638FC      .    81D2 EC7E7BD3 adc        edx, D37B7EEC
    00463902      .    5A              pop        edx
    00463903      .    FF32            push      dword ptr [edx]
    00463905      .    335424 08        xor        edx, dword ptr [esp+8]
    00463909      .    335424 28        xor        edx, dword ptr [esp+28]
    如果这样下去你会发现程序就结束了,说明这里是关键的跳转,我们先看看,继续跟,出错了,好了,现在我们重新载入程序,直接跳到刚才那个地方004638E9,
    004638E9      . /0F85 15010000 jnz        00463A04
    没实现跳转,我们来让他实现,可以直接把JNZ改成JMP就可以了,保存
    好,我们现在再看看能不能运行,晕,刚才突然点错了,我们继续,OK,可以啦,查下壳 VC8 -> Microsoft Corporation [Overlay] *,我们再用Resource Binder给它优化下,重建资源,
    程序也会小点,好了,这样教程就结束了。

    欢迎大家和我交流技术!

    88


    教程地址:http://exs.mail.qq.com/cgi-bin/d ... 5281125d325ea32d7ce

    提取码:edac828d

    Q宠保姆VC版 2.23 SP8版2007.09.13UNPack:http://exs.mail.qq.com/cgi-bin/d ... 4d0ac7ddece7271e0dc

    提取码:ae5027bb