本帖最后由 十二 于 2012-3-12 13:58 编辑
- 勾选除转换 OEP 到虚拟机和高级输入表重定向(我WIN7勾选这个程序报错跑不起来),还有密码保护以外的所有保护选项。
- Ollydbg - F3 载入 被加壳的程序代码如下:
- 00401000 > [ DISCUZ_CODE_813 ]nbsp; 57 PUSH EDI
- 00401001 . C7C7 72AFB4DF MOV EDI,DFB4AF72
- 00401007 . 8D3D 5FBA581A LEA EDI,DWORD PTR DS:[1A58BA5F]
- 0040100D . FFCF DEC EDI
- 0040100F . 0FACF7 F2 SHRD EDI,ESI,0F2 ; 移位常量超出 1..31 的范围
- 。。。。。。。
- 。。。。。。。
- 往下翻能找到一个远跳; F4此处,004011EA .- E9 15680A00 JMP RLPack.004A7A04。
- F8步过得到如下代码:
复制代码- 004A7A04 60 PUSHAD
- 004A7A05 E8 00000000 CALL RLPack.004A7A0A
- 004A7A0A 83C4 04 ADD ESP,4
- 004A7A0D 8B6C24 FC MOV EBP,DWORD PTR SS:[ESP-4]
- 004A7A11 E8 8B020000 CALL RLPack.004A7CA1 -----------------申请内存,解压代码,更新004A9E8F代码段
- 004A7A16 E8 74240000 CALL RLPack.004A9E8F -----------------得到kernel32和user32的基址
- 004A7A1B E8 88430000 CALL RLPack.004ABDA8 -----------------保存VirtualFree的地址
复制代码- 004A7A20 837C24 28 01 CMP DWORD PTR SS:[ESP+28],1
- 004A7A25 75 0C JNZ SHORT RLPack.004A7A33
- 004A7A27 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24]
- 004A7A2B 8985 7E470000 MOV DWORD PTR SS:[EBP+477E],EAX kernel32.BaseThreadInitThunk
- 004A7A31 EB 0C JMP SHORT RLPack.004A7A3F
- 004A7A33 8B85 7A470000 MOV EAX,DWORD PTR SS:[EBP+477A]
- 004A7A39 8985 7E470000 MOV DWORD PTR SS:[EBP+477E],EAX kernel32.BaseThreadInitThunk
- 004A7A3F E8 100D0000 CALL RLPack.004A8754 -------------------------对PE头进行操作得到.packed的大小,入口点,等信息并保存。
- 004A7A44 E8 6F240000 CALL RLPack.004A9EB8 -----------------------得到kernel32的基址遍历导出表得到Openmutex和CreateMutex完成互斥操作。
- 004A7A49 E8 1F230000 CALL RLPack.004A9D6D -------------------------得到User32的基址得到MessageBoxA完成以后的校验报错的功能此函数内部拥有一个SEH检测,如果你的OD过不了可以手动NOP【004A9DDB 8700 XCHG DWORD PTR DS:[EAX],EAX】此句。
- 004A7A4E 8DB5 75550000 LEA ESI,DWORD PTR SS:[EBP+5575]
- 004A7A54 8D9D 17030000 LEA EBX,DWORD PTR SS:[EBP+317]
- 004A7A5A 33FF XOR EDI,EDI
- 004A7A5C E8 3B3D0000 CALL RLPack.004AB79C-------------------------------得到之前保存的PE头信息,此函数对PE头做了一些奇怪又邪恶的事情(抹掉了PE头中区段的大小和RVA,使其无法被正常dump)
- 使其变正常的方法,F7进入CALL RLPack.004AB79C找到一下这段代码:
-
- {
- 004AB79C 60 PUSHAD
- 004AB79D E8 4D030000 CALL RLPack.004ABAEF---------------------得到镜像基址
- 004AB7A2 E8 FB020000 CALL RLPack.004ABAA2----------------------邪恶的抹区段大小和RVA
- 004AB7A7 E8 AC030000 CALL RLPack.004ABB58----------------------做一些不可告人的秘密,具体如下
- 得到一下函数地址:
- 004AC53B 77023EA8 kernel32.IsDebuggerPresent
- 004AC53F 77043F81 kernel32.CheckRemoteDebuggerPresent
- 004AC543 77033861 kernel32.GetVersionExA
- 004AC547 7702CEE8 kernel32.CreateFileA
- 004AC54B 7702CAC4 kernel32.GetCurrentProcessId
- }
- F7进入CALL RLPack.004ABAA2
- 找到如下代码,Nop掉JA就可以了
- {
- 004ABAE3 C60401 00 MOV BYTE PTR DS:[ECX+EAX],0
- 004ABAE7 49 DEC ECX
- 004ABAE8 83F9 00 CMP ECX,0
- 004ABAEB ^ 77 F6 JA SHORT RLPack.004ABAE3
- }
- 004A7A61 EB 03 JMP SHORT RLPack.004A7A66
复制代码- 004A7A66 /EB 1B JMP SHORT RLPack.004A7A83
- 004A7A68 |8B85 7E470000 MOV EAX,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7A6E |FF7437 04 PUSH DWORD PTR DS:[EDI+ESI+4]
- 004A7A72 |010424 ADD DWORD PTR SS:[ESP],EAX ; RLPack.00400000
- 004A7A75 |FF3437 PUSH DWORD PTR DS:[EDI+ESI]
- 004A7A78 |010424 ADD DWORD PTR SS:[ESP],EAX ; RLPack.00400000
- 004A7A7B |FFD3 CALL EBX ; RLPack.004A7D21---------------------------------------解压大量代码
- 004A7A7D |83C4 08 ADD ESP,8
- 004A7A80 |83C7 08 ADD EDI,8
- 004A7A83 \833C37 00 CMP DWORD PTR DS:[EDI+ESI],0
- 004A7A87 ^ 75 DF JNZ SHORT RLPack.004A7A68
- 004A7A89 83BD 55550000 0>CMP DWORD PTR SS:[EBP+5555],0
- 004A7A90 74 0E JE SHORT RLPack.004A7AA0
- 004A7A92 83BD 59550000 0>CMP DWORD PTR SS:[EBP+5559],0
- 004A7A99 74 05 JE SHORT RLPack.004A7AA0
- 004A7A9B E8 F30B0000 CALL RLPack.004A8693---------------------------------------对解压出.packed段的代码进行CALL的修正
- 004A7AA0 8D7437 04 LEA ESI,DWORD PTR DS:[EDI+ESI+4]
- 004A7AA4 E8 660B0000 CALL RLPack.004A860F
- 004A7AA9 8B85 D44D0000 MOV EAX,DWORD PTR SS:[EBP+4DD4]
- 004A7AAF 0BC0 OR EAX,EAX ; RLPack.00400000
- 004A7AB1 74 0B JE SHORT RLPack.004A7ABE
- 004A7AB3 0385 7E470000 ADD EAX,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7AB9 E8 C2030000 CALL RLPack.004A7E80----------------------------------------------------------抽取代码进行重定向
- 004A7ABE 83BD DA4F0000 0>CMP DWORD PTR SS:[EBP+4FDA],1
- 004A7AC5 75 13 JNZ SHORT RLPack.004A7ADA
- 004A7AC7 89B5 DE4F0000 MOV DWORD PTR SS:[EBP+4FDE],ESI ; RLPack.004ACF7F
- 004A7ACD EB 03 JMP SHORT RLPack.004A7AD2
- 004A7ACF 83C6 04 ADD ESI,4
- 004A7AD2 837E FC FF CMP DWORD PTR DS:[ESI-4],-1
- 004A7AD6 ^ 75 F7 JNZ SHORT RLPack.004A7ACF
- 004A7AD8 EB 03 JMP SHORT RLPack.004A7ADD
- 004A7ADA 83C6 08 ADD ESI,8
- 004A7ADD 8B06 MOV EAX,DWORD PTR DS:[ESI]
- 004A7ADF 8985 9E470000 MOV DWORD PTR SS:[EBP+479E],EAX ; RLPack.00400000
- 004A7AE5 83C6 04 ADD ESI,4
- 004A7AE8 E8 3A400000 CALL RLPack.004ABB27-----------------------------------对代码进行校验此CALL没过之前不能对004A7A04-004AD283内存段做任何修改否则进程退出。
- 004A7AED 83C6 04 ADD ESI,4
- 004A7AF0 53 PUSH EBX ; RLPack.004A7D21
- 004A7AF1 6A 40 PUSH 40
- 004A7AF3 68 00100000 PUSH 1000
- 004A7AF8 68 AC020000 PUSH 2AC
- 004A7AFD 6A 00 PUSH 0
- 004A7AFF FF95 FD030000 CALL DWORD PTR SS:[EBP+3FD] ; kernel32.VirtualAlloc
- 004A7B05 8985 71550000 MOV DWORD PTR SS:[EBP+5571],EAX ; RLPack.00400000
- 004A7B0B 5B POP EBX ; RLPack.004A7D21
- 004A7B0C FFB5 71550000 PUSH DWORD PTR SS:[EBP+5571] ; RLPack.004A7A0A
- 004A7B12 56 PUSH ESI ; RLPack.004ACF7F
- 004A7B13 FFD3 CALL EBX ; RLPack.004A7D21
- 004A7B15 83C4 08 ADD ESP,8
- 004A7B18 E8 D53E0000 CALL RLPack.004AB9F2---------------------------------NOP掉
- 004A7B1D E8 91340000 CALL RLPack.004AAFB3
- 004A7B22 83BD 83500000 0>CMP DWORD PTR SS:[EBP+5083],0
- 004A7B29 74 13 JE SHORT RLPack.004A7B3E
- 004A7B2B 83BD A34E0000 0>CMP DWORD PTR SS:[EBP+4EA3],0
- 004A7B32 74 0A JE SHORT RLPack.004A7B3E
- 004A7B34 E8 38330000 CALL RLPack.004AAE71
- 004A7B39 E8 4F2C0000 CALL RLPack.004AA78D
- 004A7B3E 8BB5 71550000 MOV ESI,DWORD PTR SS:[EBP+5571] ; RLPack.004A7A0A
- 004A7B44 8BC6 MOV EAX,ESI ; RLPack.004ACF7F
- 004A7B46 EB 01 JMP SHORT RLPack.004A7B49
- 004A7B48 40 INC EAX ; RLPack.00400000
- 004A7B49 8038 01 CMP BYTE PTR DS:[EAX],1
- 004A7B4C ^ 75 FA JNZ SHORT RLPack.004A7B48-----------------------------------得到原始的导出DLL名,准备处理IAT。
- 004A7B4E 40 INC EAX ; RLPack.00400000
- 004A7B4F 8B38 MOV EDI,DWORD PTR DS:[EAX]
- 004A7B51 8B8D 7A470000 MOV ECX,DWORD PTR SS:[EBP+477A] ; RLPack.00400000
- 004A7B57 3B8D 7E470000 CMP ECX,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7B5D 74 1A JE SHORT RLPack.004A7B79
- 004A7B5F 83BD E04D0000 0>CMP DWORD PTR SS:[EBP+4DE0],0
- 004A7B66 76 11 JBE SHORT RLPack.004A7B79
- 004A7B68 83BD F84D0000 0>CMP DWORD PTR SS:[EBP+4DF8],0
- 004A7B6F 75 08 JNZ SHORT RLPack.004A7B79
- 004A7B71 03F9 ADD EDI,ECX
- 004A7B73 2BBD 7E470000 SUB EDI,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7B79 03BD 7E470000 ADD EDI,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7B7F 83C0 04 ADD EAX,4
- 004A7B82 8985 6D550000 MOV DWORD PTR SS:[EBP+556D],EAX ; RLPack.00400000
- 004A7B88 E8 250C0000 CALL RLPack.004A87B2
- 004A7B8D E8 1B0D0000 CALL RLPack.004A88AD
- 004A7B92 E8 B3100000 CALL RLPack.004A8C4A
- 004A7B97 E8 DC390000 CALL RLPack.004AB578
- 004A7B9C E9 B1000000 JMP RLPack.004A7C52
- 004A7BA1 E8 71200000 CALL RLPack.004A9C17
- 004A7BA6 56 PUSH ESI ; RLPack.004ACF7F
- 004A7BA7 FF95 09040000 CALL DWORD PTR SS:[EBP+409] ; kernel32.GetModuleHandleA
- 004A7BAD 85C0 TEST EAX,EAX ; RLPack.00400000
- 004A7BAF 0F84 BF200000 JE RLPack.004A9C74
- 004A7BB5 8985 69550000 MOV DWORD PTR SS:[EBP+5569],EAX ; RLPack.00400000
- 004A7BBB 8BC6 MOV EAX,ESI ; RLPack.004ACF7F
- 004A7BBD EB 43 JMP SHORT RLPack.004A7C02
- 004A7BBF 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D] ; RLPack.004A9DDD
- 004A7BC5 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004A7BC7 E8 16360000 CALL RLPack.004AB1E2
- 004A7BCC 50 PUSH EAX ; RLPack.00400000
- 004A7BCD FFB5 69550000 PUSH DWORD PTR SS:[EBP+5569]
- 004A7BD3 E8 E9400000 CALL RLPack.004ABCC1
- 004A7BD8 85C0 TEST EAX,EAX ; RLPack.00400000
- 004A7BDA 0F84 5B200000 JE RLPack.004A9C3B
- 004A7BE0 E8 FF360000 CALL RLPack.004AB2E4
- 004A7BE5 E8 85350000 CALL RLPack.004AB16F
- 004A7BEA 83C7 04 ADD EDI,4
- 004A7BED 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D] ; RLPack.004A9DDD
- 004A7BF3 8938 MOV DWORD PTR DS:[EAX],EDI
- 004A7BF5 8385 6D550000 0>ADD DWORD PTR SS:[EBP+556D],4
- 004A7BFC 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D] ; RLPack.004A9DDD
- 004A7C02 8338 00 CMP DWORD PTR DS:[EAX],0
- 004A7C05 ^ 75 B8 JNZ SHORT RLPack.004A7BBF
- 004A7C07 EB 01 JMP SHORT RLPack.004A7C0A
- 004A7C09 46 INC ESI ; RLPack.004ACF7F
- 004A7C0A 803E 00 CMP BYTE PTR DS:[ESI],0
- 004A7C0D ^ 75 FA JNZ SHORT RLPack.004A7C09
- 004A7C0F 46 INC ESI ; RLPack.004ACF7F
- 004A7C10 83C0 04 ADD EAX,4
- 004A7C13 8B38 MOV EDI,DWORD PTR DS:[EAX]
- 004A7C15 8B8D 7A470000 MOV ECX,DWORD PTR SS:[EBP+477A] ; RLPack.00400000
- 004A7C1B 3B8D 7E470000 CMP ECX,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7C21 74 1A JE SHORT RLPack.004A7C3D
- 004A7C23 83BD E04D0000 0>CMP DWORD PTR SS:[EBP+4DE0],0
- 004A7C2A 76 11 JBE SHORT RLPack.004A7C3D
- 004A7C2C 83BD F84D0000 0>CMP DWORD PTR SS:[EBP+4DF8],0
- 004A7C33 75 08 JNZ SHORT RLPack.004A7C3D
- 004A7C35 03F9 ADD EDI,ECX
- 004A7C37 2BBD 7E470000 SUB EDI,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7C3D 03BD 7E470000 ADD EDI,DWORD PTR SS:[EBP+477E] ; RLPack.00400000
- 004A7C43 C700 FFFFFFFF MOV DWORD PTR DS:[EAX],-1
- 004A7C49 83C0 04 ADD EAX,4
- 004A7C4C 8985 6D550000 MOV DWORD PTR SS:[EBP+556D],EAX ; RLPack.00400000
- 004A7C52 803E 01 CMP BYTE PTR DS:[ESI],1
- 004A7C55 ^ 0F85 46FFFFFF JNZ RLPack.004A7BA1-------------------------------------处理IAT
- 004A7C5B E8 B0350000 CALL RLPack.004AB210
- 004A7C60 68 00400000 PUSH 4000
- 004A7C65 68 AC020000 PUSH 2AC
- 004A7C6A FFB5 71550000 PUSH DWORD PTR SS:[EBP+5571] ; RLPack.004A7A0A
- 004A7C70 FF95 05040000 CALL DWORD PTR SS:[EBP+405] ; RLPack.004ABDC3
- 004A7C76 E8 D0220000 CALL RLPack.004A9F4B
- 004A7C7B E8 CC340000 CALL RLPack.004AB14C
- 004A7C80 E8 DF0B0000 CALL RLPack.004A8864
- 004A7C85 E8 850A0000 CALL RLPack.004A870F
- 004A7C8A 83BD 0C4E0000 0>CMP DWORD PTR SS:[EBP+4E0C],0
- 004A7C91 74 07 JE SHORT RLPack.004A7C9A
- 004A7C93 E9 10100000 JMP RLPack.004A8CA8
- 004A7C98 EB 01 JMP SHORT RLPack.004A7C9B
- 004A7C9A 61 POPAD
- 004A7C9B - E9 0096F5FF JMP RLPack.004012A0---------------------------------入口点,下断点
- IA处理函数:
- 004A7BA1 E8 71200000 CALL RLPack.004A9C17---------------------得到模块名
- 004A7BA6 56 PUSH ESI
- 004A7BA7 FF95 09040000 CALL DWORD PTR SS:[EBP+409] ; kernel32.GetModuleHandleA
- 004A7BAD 85C0 TEST EAX,EAX
- 004A7BAF 0F84 BF200000 JE RLPack.004A9C74
- 004A7BB5 8985 69550000 MOV DWORD PTR SS:[EBP+5569],EAX
- 004A7BBB 8BC6 MOV EAX,ESI
- 004A7BBD EB 43 JMP SHORT RLPack.004A7C02
- 004A7BBF 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D]
- 004A7BC5 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004A7BC7 E8 16360000 CALL RLPack.004AB1E2-------------------------代码校验段
- 004AB1E2 60 PUSHAD
- 004AB1E3 8BF0 MOV ESI,EAX
- 004AB1E5 8D85 D8370000 LEA EAX,DWORD PTR SS:[EBP+37D8]
- 004AB1EB 8D8D 6E3B0000 LEA ECX,DWORD PTR SS:[EBP+3B6E]
- 004AB1F1 2BC8 SUB ECX,EAX
- 004AB1F3 33DB XOR EBX,EBX ; RLPack.004A7D21
- 004AB1F5 33D2 XOR EDX,EDX
- 004AB1F7 EB 0A JMP SHORT RLPack.004AB203
- 004AB1F9 FF30 PUSH DWORD PTR DS:[EAX]----------------------校验004AB1E2段校验大小00000396,这里的处理是个仁者人间智者见智的,你可以复制004AB1E2的代码到一块新内存中然后修改004AB1E5、004AB1EB、004AB1F1 EAX到你申请的内存中过校验。也可以call前修该xx然后校验的时候修改回来。
- 004AB1FB 5A POP EDX
- 004AB1FC 32DA XOR BL,DL
- 004AB1FE C1C3 07 ROL EBX,7
- 004AB201 40 INC EAX
- 004AB202 49 DEC ECX ; ntdll.77606570
- 004AB203 83F9 00 CMP ECX,0
- 004AB206 ^ 77 F1 JA SHORT RLPack.004AB1F9
- 004AB208 33F3 XOR ESI,EBX ; RLPack.004A7D21
- 004AB20A 897424 1C MOV DWORD PTR SS:[ESP+1C],ESI
- 004AB20E 61 POPAD
- 004AB20F C3 RETN
复制代码- 004A7BCC 50 PUSH EAX
- 004A7BCD FFB5 69550000 PUSH DWORD PTR SS:[EBP+5569] ; msvcrt.76C10000
- 004A7BD3 E8 E9400000 CALL RLPack.004ABCC1------------------------得到函数地址
- 004A7BD8 85C0 TEST EAX,EAX
- 004A7BDA 0F84 5B200000 JE RLPack.004A9C3B
- 004A7BE0 E8 FF360000 CALL RLPack.004AB2E4----------------------------填充IAT**
复制代码- 004AB2E4 60 PUSHAD
- 004AB2E5 83BD F44D0000 0>CMP DWORD PTR SS:[EBP+4DF4],0
- 004AB2EC 0F85 FA000000 JNZ RLPack.004AB3E
- 。。。。。。。。。
- 。。。。。。。。。
- {
- 004AB3EC 8BBD 69550000 MOV EDI,DWORD PTR SS:[EBP+5569]
- 004AB3F2 83BD F84D0000 0>CMP DWORD PTR SS:[EBP+4DF8],0
- 004AB3F9 74 14 JE SHORT RLPack.004AB40F
- 004AB3FB 3BBD A2470000 CMP EDI,DWORD PTR SS:[EBP+47A2]
- 004AB401 74 0C JE SHORT RLPack.004AB40F
- 004AB403 3BBD A6470000 CMP EDI,DWORD PTR SS:[EBP+47A6] ; user32.#2372
- };括号中的代码全部nop掉
- 004AB409 0F85 67010000 JNZ RLPack.004AB576 此句改成 JNZ 改成 JMP 表示处理全部IAT不进行加密。(**如上所说此地址范围是被校验的,过校验的方法上面也已经提到了,不要说这里一改就挂掉那一定是上面的校验没处理
复制代码- 004A7BE5 E8 85350000 CALL RLPack.004AB16F
- 004A7BEA 83C7 04 ADD EDI,4
- 004A7BED 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D]
- 004A7BF3 8938 MOV DWORD PTR DS:[EAX],EDI ; RLPack.00478314
- 004A7BF5 8385 6D550000 0>ADD DWORD PTR SS:[EBP+556D],4
- 004A7BFC 8B85 6D550000 MOV EAX,DWORD PTR SS:[EBP+556D]
- 004A7C02 8338 00 CMP DWORD PTR DS:[EAX],0
- 004A7C05 ^ 75 B8 JNZ SHORT RLPack.004A7BBF
- 004A7C07 EB 01 JMP SHORT RLPack.004A7C0A
- 004A7C09 46 INC ESI
- 004A7C0A 803E 00 CMP BYTE PTR DS:[ESI],0
- 004A7C0D ^ 75 FA JNZ SHORT RLPack.004A7C09
- 全部处理之后F9你就会断在004A7C9B - E9 0096F5FF JMP RLPack.004012A0 F8 飞向入口点。
- importRec修复IAT全部有效 dump 出来
- 不出意外程序无法运行 因为004A7AB9 E8 C2030000 CALL RLPack.004A7E80抽取了代码进行了重定
- 位可以看到dump出来的pe中有很多这种代码:
复制代码- 004012A0 . 55 PUSH EBP ; RLPack.004A7A0A
- 004012A1 . 89E5 MOV EBP,ESP
- 004012A3 . 83EC 08 SUB ESP,8
- 004012A6 . C70424 020000>MOV DWORD PTR SS:[ESP],2
- 004012AD . FF15 40834700 CALL DWORD PTR DS:[478340]
- 004012B3 .- E9 70F01301 JMP 01540328******
复制代码
- 处理这种状况可以根据01540328 内存段的大小 VirtualAlloc下断修改返回值到你申请的内存必须高于 0x00400000 然后dump 这段内存修改PE文件计算基址和内存段,在PE节表中添加dump出来的内存。
- 没了
复制代码
|