• [ x0429.COM 电 脑 知 识 学 习 网 ]
  • RSS订阅
  • 网站地图
  • 搜索: 您的位置电脑基础知识网>加密破解>阅读资讯文章

    记一次手动脱壳经历

    2008-06-11 09:31:42 来源:本站原创 作者:小时候挺帅 点击: 评论:4

    前言:本人也是新手,刚学不到1个月,也是看别人的例子教程来学习。通过1个基础的upx,来说说我的脱壳过程,希望对你有所帮助。

    “壳”的历史我就不介绍了,如果不知道什么是壳,问问百度。废话不多说,手动脱壳的主要步骤是:寻找入口点,转储(dump)程序,修复引入函数表(Import Table)

    首先必须的工具要准备好,

    查壳工具:

    PeiD v0.94

    脱壳工具:

    Ollydbg //(有汉化版)

    修复引入函数表(Import Table)工具:

    ImpREC

    //如果以上工具没找到,联系我,我给你发。。。。

    测试软件下载:  upx壳小软件

    工具准备好,开始小试验牛刀。

    首先用PEID查壳




    UPX0.89.6-1.02的壳

    //手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。

    接着用OD载入程序:

    0046AC00 > 60 PUSHAD 停在这里,我们先记住UPX壳的加壳入口第一句是PUSHAD
    出口暂时不清楚,为的是今后碰到多层壳有准备。
    接着一步按一下F8 //F8是单步步过的意思
    0046AC01 BE 00104400 MOV ESI,ex1.00441000
    0046AC06 8DBE 0000FCFF LEA EDI,DWORD PTR DS:[ESI+FFFC0000]
    0046AC0C C787 D0940500 D>MOV DWORD PTR DS:[EDI+594D0],10A125D8
    0046AC16 57 PUSH EDI
    0046AC17 83CD FF OR EBP,FFFFFFFF
    0046AC1A EB 0E JMP SHORT ex1.0046AC2A // 向下跳走
    0046AC1C 90 NOP
    0046AC1D 90 NOP
    0046AC1E 90 NOP
    0046AC1F 90 NOP
    0046AC20 8A06 MOV AL,BYTE PTR DS:[ESI]
    0046AC22 46 INC ESI
    0046AC23 8807 MOV BYTE PTR DS:[EDI],AL
    0046AC25 47 INC EDI
    0046AC26 01DB ADD EBX,EBX
    0046AC28 75 07 JNZ SHORT ex1.0046AC31
    0046AC2A 8B1E MOV EBX,DWORD PTR DS:[ESI] //到这里。
    0046AC2C 83EE FC SUB ESI,-4
    0046AC2F 11DB ADC EBX,EBX
    0046AC31 ^ 72 ED JB SHORT ex1.0046AC20 //这里注意,往回跳。脱壳时记住只能让程序往前运行
    0046AC33 B8 01000000 MOV EAX,1 //在这里点一下,F4运行到这句继续。
    0046AC38 01DB ADD EBX,EBX
    0046AC3A 75 07 JNZ SHORT ex1.0046AC43 //跳
    0046AC3C 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC3E 83EE FC SUB ESI,-4
    0046AC41 11DB ADC EBX,EBX
    0046AC43 11C0 ADC EAX,EAX
    0046AC45 01DB ADD EBX,EBX
    0046AC47 ^ 73 EF JNB SHORT ex1.0046AC38
    0046AC49 75 09 JNZ SHORT ex1.0046AC54 //跳
    0046AC4B 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC4D 83EE FC SUB ESI,-4
    0046AC50 11DB ADC EBX,EBX
    0046AC52 ^ 73 E4 JNB SHORT ex1.0046AC38
    0046AC54 31C9 XOR ECX,ECX
    0046AC56 83E8 03 SUB EAX,3
    0046AC59 72 0D JB SHORT ex1.0046AC68 //跳
    0046AC5B C1E0 08 SHL EAX,8
    0046AC5E 8A06 MOV AL,BYTE PTR DS:[ESI]
    0046AC60 46 INC ESI
    0046AC61 83F0 FF XOR EAX,FFFFFFFF
    0046AC64 74 74 JE SHORT ex1.0046ACDA
    0046AC66 89C5 MOV EBP,EAX
    0046AC68 01DB ADD EBX,EBX
    0046AC6A 75 07 JNZ SHORT ex1.0046AC73 //跳
    0046AC6C 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC6E 83EE FC SUB ESI,-4
    0046AC71 11DB ADC EBX,EBX
    0046AC73 11C9 ADC ECX,ECX
    0046AC75 01DB ADD EBX,EBX
    0046AC77 75 07 JNZ SHORT ex1.0046AC80 //跳
    0046AC79 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC7B 83EE FC SUB ESI,-4
    0046AC7E 11DB ADC EBX,EBX
    0046AC80 11C9 ADC ECX,ECX
    0046AC82 75 20 JNZ SHORT ex1.0046ACA4 //跳
    0046AC84 41 INC ECX
    0046AC85 01DB ADD EBX,EBX
    0046AC87 75 07 JNZ SHORT ex1.0046AC90
    0046AC89 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC8B 83EE FC SUB ESI,-4
    0046AC8E 11DB ADC EBX,EBX
    0046AC90 11C9 ADC ECX,ECX
    0046AC92 01DB ADD EBX,EBX
    0046AC94 ^ 73 EF JNB SHORT ex1.0046AC85
    0046AC96 75 09 JNZ SHORT ex1.0046ACA1
    0046AC98 8B1E MOV EBX,DWORD PTR DS:[ESI]
    0046AC9A 83EE FC SUB ESI,-4
    0046AC9D 11DB ADC EBX,EBX
    0046AC9F ^ 73 E4 JNB SHORT ex1.0046AC85
    0046ACA1 83C1 02 ADD ECX,2
    0046ACA4 81FD 00F3FFFF CMP EBP,-0D00
    0046ACAA 83D1 01 ADC ECX,1
    0046ACAD 8D142F LEA EDX,DWORD PTR DS:[EDI+EBP]
    0046ACB0 83FD FC CMP EBP,-4
    0046ACB3 76 0F JBE SHORT ex1.0046ACC4 //这一句可以跳出这个循环。
    0046ACB5 8A02 MOV AL,BYTE PTR DS:[EDX]
    0046ACB7 42 INC EDX
    0046ACB8 8807 MOV BYTE PTR DS:[EDI],AL
    0046ACBA 47 INC EDI
    0046ACBB 49 DEC ECX
    0046ACBC ^ 75 F7 JNZ SHORT ex1.0046ACB5 //注意,往回跳。
    0046ACBE ^ E9 63FFFFFF JMP ex1.0046AC26 //这里也往回跳。
    0046ACC3 90 NOP
    0046ACC4 8B02 MOV EAX,DWORD PTR DS:[EDX] //呵,在这里点一下,F4到这里。
    0046ACC6 83C2 04 ADD EDX,4
    0046ACC9 8907 MOV DWORD PTR DS:[EDI],EAX
    0046ACCB 83C7 04 ADD EDI,4
    0046ACCE 83E9 04 SUB ECX,4
    0046ACD1 ^ 77 F1 JA SHORT ex1.0046ACC4 //往回跳。
    0046ACD3 01CF ADD EDI,ECX
    0046ACD5 ^ E9 4CFFFFFF JMP ex1.0046AC26 //这里也往回跳
    0046ACDA 5E POP ESI //呵,在这里点一下,F4到这里。
    0046ACDB 89F7 MOV EDI,ESI
    0046ACDD B9 C8230000 MOV ECX,23C8
    0046ACE2 8A07 MOV AL,BYTE PTR DS:[EDI]
    0046ACE4 47 INC EDI
    0046ACE5 2C E8 SUB AL,0E8
    0046ACE7 3C 01 CMP AL,1
    0046ACE9 ^ 77 F7 JA SHORT ex1.0046ACE2 //往回跳。
    0046ACEB 803F 0D CMP BYTE PTR DS:[EDI],0D//在这里点一下,F4到这里。
    0046ACEE ^ 75 F2 JNZ SHORT ex1.0046ACE2
    0046ACF0 8B07 MOV EAX,DWORD PTR DS:[EDI]
    0046ACF2 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]
    0046ACF5 66:C1E8 08 SHR AX,8
    0046ACF9 C1C0 10 ROL EAX,10
    0046ACFC 86C4 XCHG AH,AL
    0046ACFE 29F8 SUB EAX,EDI
    0046AD00 80EB E8 SUB BL,0E8
    0046AD03 01F0 ADD EAX,ESI
    0046AD05 8907 MOV DWORD PTR DS:[EDI],EAX
    0046AD07 83C7 05 ADD EDI,5
    0046AD0A 89D8 MOV EAX,EBX
    0046AD0C ^ E2 D9 LOOPD SHORT ex1.0046ACE7 //这是个循环,往回跳。
    0046AD0E 8DBE 00700600 LEA EDI,DWORD PTR DS:[ESI+67000]//在这里点一下,F4到这里。
    0046AD14 8B07 MOV EAX,DWORD PTR DS:[EDI]
    0046AD16 09C0 OR EAX,EAX
    0046AD18 74 3C JE SHORT ex1.0046AD56
    0046AD1A 8B5F 04 MOV EBX,DWORD PTR DS:[EDI+4]
    0046AD1D 8D8430 BCA90600 LEA EAX,DWORD PTR DS:[EAX+ESI+6A9BC]
    0046AD24 01F3 ADD EBX,ESI
    0046AD26 50 PUSH EAX
    0046AD27 83C7 08 ADD EDI,8
    0046AD2A FF96 5CAA0600 CALL DWORD PTR DS:[ESI+6AA5C]

    0046AD30 95 XCHG EAX,EBP
    0046AD31 8A07 MOV AL,BYTE PTR DS:[EDI]
    0046AD33 47 INC EDI
    0046AD34 08C0 OR AL,AL
    0046AD36 ^ 74 DC JE SHORT ex1.0046AD14
    0046AD38 89F9 MOV ECX,EDI
    0046AD3A 57 PUSH EDI
    0046AD3B 48 DEC EAX
    0046AD3C F2:AE REPNE SCAS BYTE PTR ES:[EDI]
    0046AD3E 55 PUSH EBP
    0046AD3F FF96 60AA0600 CALL DWORD PTR DS:[ESI+6AA60]

    0046AD45 09C0 OR EAX,EAX
    0046AD47 74 07 JE SHORT ex1.0046AD50
    0046AD49 8903 MOV DWORD PTR DS:[EBX],EAX
    0046AD4B 83C3 04 ADD EBX,4
    0046AD4E ^ EB E1 JMP SHORT ex1.0046AD31 //往回跳。
    0046AD50 FF96 64AA0600 CALL DWORD PTR DS:[ESI+6AA64]
    0046AD56 61 POPAD //关键点,入口就在附近。 和PUSHAD对应。在这里点一下,F4到这里。
    0046AD57 ^ E9 98CBFEFF JMP ex1.004578F4 //跳到入口。程序跨段跳跃。继续F8

    .................................................

    程序加壳段地址一直在0046XXXX突然跳转到0045XXXX段,跨段跳跃时,一般都是在内存中脱壳完毕,准备运行程序,手动脱壳就是要在入口将程序Dump出来。转到入口时一般都有Popad语句和开始的PUSHAD对应。
    .................................................

    跳到下面这个

    004578F4 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。

    在这块右键点击—用ollydump 脱壳调试进程



    然后点击脱壳,另存一下

    用Peid 查一下你刚刚存的文件. 为Borland Delphi 4.0 - 5.0

    恭喜你 完成了你的第一次手动脱壳.






    Tags:脱壳  
    责任编辑:
  • 上一篇:没有了
  • 下一篇:没有了
  • 记一次手动脱壳经历
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数:4 [ 查看全部 ] 网友评论