- UID
- 27556
注册时间2007-2-18
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
Od设置不忽略INT3中断,其余异常全部忽略。隐藏!
OD载入
004AC000 N> 60 pushad //记下004AC000,这个后面要用到的!
004AC001 4E dec esi
004AC002 D3D6 rcl esi,cl
004AC004 4E dec esi
004AC005 66:D3E8 shr ax,cl
F9运行。
004BAB23 90 NOP //第一次也是最后一次INT3异常。
004BAB24 64:67:8F06 0000 POP DWORD PTR FS:[0]
004BAB2A 83C4 04 ADD ESP,4
004BAB2D 60 PUSHAD
004BAB2E E8 00000000 CALL NetClean.004BAB33
004BAB33 5E POP ESI
004BAB34 83EE 06 SUB ESI,6
004BAB37 B9 5B000000 MOV ECX,5B
004BAB3C 29CE SUB ESI,ECX
004BAB3E BA 09E5B87E MOV EDX,7EB8E509
004BAB43 C1E9 02 SHR ECX,2
004BAB46 83E9 02 SUB ECX,2
004BAB49 83F9 00 CMP ECX,0
004BAB4C 7C 1A JL SHORT NetClean.004BAB68
.................................................
堆栈内容
0012FF58 0012FFE0 指针到下一个 SEH 记录
0012FF5C 004BAAF0 SE 句柄 //右键对004BAAF0转存中跟随,下内存访问断点,Shift+F9!
0012FF60 F9E1E5CE
004BAAF0 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] //下断点Shift+F9中断1
004BAAF4 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
004BAAF8 FF81 B8000000 INC DWORD PTR DS:[ECX+B8]
004BAAFE 8B00 MOV EAX,DWORD PTR DS:[EAX]
004BAB00 2D 03000080 SUB EAX,80000003
004BAB05 75 12 JNZ SHORT NetClean.004BAB19
004BAB07 90 NOP
004BAB08 90 NOP
004BAB09 90 NOP
004BAB0A 90 NOP
004BAB0B 33C0 XOR EAX,EAX
004BAB0D 8941 04 MOV DWORD PTR DS:[ECX+4],EAX
004BAB10 8941 08 MOV DWORD PTR DS:[ECX+8],EAX
004BAB13 8941 0C MOV DWORD PTR DS:[ECX+C],EAX
004BAB16 8941 10 MOV DWORD PTR DS:[ECX+10],EAX
004BAB19 C3 RETN
.................................................
004BAB4E 8B048E MOV EAX,DWORD PTR DS:[ESI+ECX*4] //下断点Shift+F9中断2,清除内存断点
004BAB51 8B5C8E 04 MOV EBX,DWORD PTR DS:[ESI+ECX*4+4]
004BAB55 03C3 ADD EAX,EBX
004BAB57 C1C8 0E ROR EAX,0E
004BAB5A 2BC2 SUB EAX,EDX
004BAB5C 81EA D41CF55C SUB EDX,5CF51CD4
004BAB62 89048E MOV DWORD PTR DS:[ESI+ECX*4],EAX
004BAB65 49 DEC ECX
004BAB66 ^ EB E1 JMP SHORT NetClean.004BAB49
004BAB68 61 POPAD
004BAB69 61 POPAD
004BAB6A C3 RETN //F4直接下来,这时是寻找Stolen Code时候了。
.................................................
再次点它的死穴。
命令行 d 12ffc0。
右键下硬件访问dword断点!
004C9B31 55 PUSH EBP //Stolen Code
004C9B32 8BEC MOV EBP,ESP //Stolen Code
004C9B34 6A FF PUSH -1 //Stolen Code
004C9B36 90 NOP
004C9B37 60 PUSHAD
004C9B38 60 PUSHAD
这个程序抽了5个字节。
........................................................................
ALT+M 打开内存镜像断点,对准它的第二个死穴点。
内存镜像, 项目 12
地址=00401000 //Code段下内存访问断点
大小=00047000 (290816.)
Owner=NetClean 00400000
区段=.text
Contains=code
类型=Imag 01001002
访问=R
初始访问=RWE
F9运行
004431F9 68 D8B24400 PUSH NetClean.0044B2D8 //临时Oep,滚动条向上看,如何判断抽掉多少字节,用滚动条是代码会混乱,右键分析代码,如我现在调整的样式,标签1
004431FE 68 B4334400 PUSH NetClean.004433B4 ; JMP to MSVCRT._except_handler3
00443203 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00443209 50 PUSH EAX
0044320A 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00443211 83EC 68 SUB ESP,68
00443214 53 PUSH EBX
00443215 56 PUSH ESI
00443216 57 PUSH EDI
.............................................................................
标签1
004431F4 8C DB 8C //真Oep
004431F5 . C3 RETN
004431F6 49 DB 49 ; CHAR 'I'
004431F7 2E DB 2E ; CHAR '.'
004431F8 79 DB 79 ; CHAR 'y'
004431F9 . 68 D8B24400 PUSH NetClean.0044B2D8
004431FE . 68 B4334400 PUSH NetClean.004433B4 ; JMP to MSVCRT._except_handler3; SE handler installation
00443203 . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00443209 . 50 PUSH EAX
0044320A . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00443211 . 83EC 68 SUB ESP,68
00443214 . 53 PUSH EBX
00443215 . 56 PUSH ESI
00443216 . 57 PUSH EDI
00443217 . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0044321A . 33DB XOR EBX,EBX
0044321C . 895D FC MOV DWORD PTR SS:[EBP-4],EBX
0044321F . 6A 02 PUSH 2
00443221 . FF15 70874400 CALL DWORD PTR DS:[448770] ; MSVCRT.__set_app_type
.............................................................................
还原代码!
55 8B EC 6A FF
004431F4 55 PUSH EBP //用Od插件修正入口为431F4直接脱壳吧,重建输入表的勾去掉
004431F5 8BEC MOV EBP,ESP
004431F7 6A FF PUSH -1
004431F9 . 68 D8B24400 PUSH NetClean.0044B2D8
004431FE . 68 B4334400 PUSH NetClean.004433B4 ; JMP to MSVCRT._except_handler3; SE handler installation
00443203 . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00443209 . 50 PUSH EAX
0044320A . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00443211 . 83EC 68 SUB ESP,68
00443214 . 53 PUSH EBX
00443215 . 56 PUSH ESI
00443216 . 57 PUSH EDI
00443217 . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0044321A . 33DB XOR EBX,EBX
0044321C . 895D FC MOV DWORD PTR SS:[EBP-4],EBX
0044321F . 6A 02 PUSH 2
00443221 . FF15 70874400 CALL DWORD PTR DS:[448770] ; MSVCRT.__set_app_type
........................................................................
修复IAT必须关闭OD单独开加壳程序修复,不然ImportREC停止响应,最后用ImportREC Oep填431F4,跟踪等级三轻松修复,有10个指针提示无法修复,你可以验证一下,经过验证全部是垃圾指针,通常ImportREC可全部修复指针,如有没有一般都是垃圾,拿剪刀全部Cut掉,修复后无法运行。
寻找出错原因。
004431C4 |. 68 00404500 PUSH 2_.00454000
004431C9 |. E8 DC000000 CALL <JMP.&msvcrt._initterm> //这个Call可能是新版Acprotect的解码技术,进这个Call里面,循环解码,没解完程序就崩溃。
004431CE |. 83C4 24 ADD ESP,24 //这里类似代码,我没有再次跟踪。
其实本版本Acprotect嵌有Oep处代码检验程序,发现Oep处代码被替换,立即拒绝解码,你失去了关键的代码当然程序无法运行,还要承认N次错误确定按钮。
004C9B31 55 PUSH EBP //Stolen Code
004C9B32 8BEC MOV EBP,ESP //Stolen Code
004C9B34 6A FF PUSH -1 //Stolen Code
我们已经掌握。
004431F9 . 68 D8B24400 PUSH NetClean.0044B2D8 //临时Oep也知道。
现在做什么,让程序认为你没有脱壳,将perplex段里面有用的内容全部解码。
方法
PUSH EBP //Stolen Code
MOV EBP,ESP //Stolen Code
PUSH -1 //Stolen Code
jmp 004431F9
Od载入脱壳修复后的程序,Ctrl+G 004AC000,右键清除分析。
004AC000 60 PUSHAD //4AC000是原来壳的入口点,将Oep入口代码复制到这里。
004AC001 4E DEC ESI
004AC002 D3D6 RCL ESI,CL
004AC004 4E DEC ESI
004AC005 66:D3E8 SHR AX,CL
004AC008 4E DEC ESI
004AC009 8BC3 MOV EAX,EBX
004AC00B 48 DEC EAX
004AC00C 7A 03 JPE SHORT Unpack_.004AC011
004AC00E 7B 01 JPO SHORT Unpack_.004AC011
004AC010 7A C1 JPE SHORT Unpack_.004ABFD3
004AC012 EF OUT DX,EAX ; I/O 命令
004AC013 F0:50 LOCK PUSH EAX ; 锁定前缀是不允许的
004AC015 E8 01000000 CALL Unpack_.004AC01B
.........................................................
55 8B EC 6A FF
jmp 004431F9
004AC000 55 push ebp
004AC001 8BEC mov ebp,esp
004AC003 6A FF push -1
004AC005 - E9 EF71F9FF jmp dump1_.004431F9
004AC00A C3 retn
004AC00B 48 dec eax
004AC00C 7A 03 jpe short dump1_.004AC011
004AC00E 7B 01 jpo short dump1_.004AC011
004AC010 7A C1 jpe short dump1_.004ABFD3
004AC012 EF out dx,eax
004AC013 F0:50 lock push eax ; 不允许锁定前缀
保存文件,OK~!
...........................................................
最后用LordPE修正入口为AC000,就可以正常运行了!
一位高手的文章,我看过了,跟着做了一次,的确是强啊,以前不会处理Stolen Code,今天刚学会,把文章拿上来和大家分享/:014 |
|