在(二)中我们得到了四张表 :
int3地址表 (实际地址+1)
跳转类型表
跳转量表
跳转命令长度表 (实际长度-1)
在OD中打开已脱壳程序,现在壳已经是垃圾了,我们就用用它的空间吧。把前面保存的连续的四个表拷贝到壳开始的空间,我这儿是9d1000。得到:
9d1000~9d5f00 int3地址表
9d5f00~9dae00 跳转类型表
9dae00~9dfd00 跳转量表
9dfd00~9e4c00 跳转命令长度表
随便找个地方写入下列代码:
009E4C04 XOR ECX, ECX
009E4C06 MOV EAX, DWORD PTR DS:[ECX*4+9D1000] //取出int3地址
009E4C0E CMP EAX, 0
009E4C11 JE SHORT dumped_.009E4C80
009E4C13 MOVZX EDX, BYTE PTR DS:[ECX+9D5F00] //跳转类型
009E4C1A MOV EBX, DWORD PTR DS:[ECX*4+9DAE00] //跳转量
009E4C22 MOVZX EDI, BYTE PTR DS:[ECX+9DFD00] //跳转命令长度
009E4C29 DEC EAX
009E4C2A INC ECX
009E4C2B CMP DWORD PTR DS:[EAX], EC8B55CC //进一步排除无效的int3
009E4C31 JE SHORT dumped_.009E4C06
009E4C33 CMP BYTE PTR DS:[EAX-1], 0CC
009E4C37 JE SHORT dumped_.009E4C06
009E4C39 CMP BYTE PTR DS:[EAX+1], 0CC
009E4C3D JE SHORT dumped_.009E4C06
009E4C3F NOP
009E4C40 CMP EDI, 1
009E4C43 JNZ SHORT dumped_.009E4C4E
009E4C45 MOV BYTE PTR DS:[EAX], DL
009E4C47 DEC BL
009E4C49 MOV BYTE PTR DS:[EAX+1], BL
009E4C4C NOP
009E4C4D NOP
009E4C4E CMP EDI, 5
009E4C51 JNZ SHORT dumped_.009E4C64
009E4C53 MOV BYTE PTR DS:[EAX], 0F
009E4C56 ADD DL, 10
009E4C59 MOV BYTE PTR DS:[EAX+1], DL
009E4C5C SUB EBX, 5
009E4C5F MOV DWORD PTR DS:[EAX+2], EBX
009E4C62 NOP
009E4C63 NOP
009E4C64 CMP EDI, 4
009E4C67 JNZ SHORT dumped_.009E4C79
009E4C69 CMP DL, 0EB
009E4C6C JNZ SHORT dumped_.009E4C79
009E4C6E MOV BYTE PTR DS:[EAX], 0E9
009E4C71 SUB EBX, 4
009E4C74 MOV DWORD PTR DS:[EAX+1], EBX
009E4C77 NOP
009E4C78 NOP
009E4C79 JMP dumped_.009E4BFA
009E4C7E NOP
009E4C7F NOP
009E4C80 NOP
在009E4C04处New origin here,在009E4C80下断,运行停住。修复了大部分int3。把修复好的程序另存为一文件。
现在工作结束了吗?答案是没有。你运行修复的文件看看,还出错。如下代码:
006539B4 85C9 TEST ECX, ECX
006539B6 CC INT3
006539B7 7A C7 JPE SHORT dumped_.00653980
006539B9 45 INC EBP
006539BA FC CLD
006539BB 2E:0000 ADD BYTE PTR CS:[EAX], AL
006539BE 00CC ADD AH, CL //这里的cc也是int3
006539C0 B7 8A MOV BH, 8A
006539C2 71 0A JNO SHORT dumped_.006539CE
把006539B6处的int3修复好以后,变成如下代码:
006539B4 85C9 TEST ECX, ECX
006539B6 75 12 JNZ SHORT dumped_1.006539CA
006539B8 C745 FC 2E000000 MOV DWORD PTR SS:[EBP-4], 2E
006539BF CC INT3
006539C0 B7 8A MOV BH, 8A
006539C2 71 0A JNO SHORT dumped_1.006539CE
这时在006539BF处的在OD才显示正确的int3。
怎么办?你得把修复的文件按照(二)(三)中的步骤再来一遍。麻烦吧。经过两次修复后,程序终于可以正常运行了,但有些功能不能用,还没破解。
(三)破解
破解我就不详细说了。vb程序,挺麻烦的。
1、功能破解:
从401000开始查找unicode码“DAYSLEFT”,在4876b0。在4876c8处有一unicode码“20",清0即可。
从401000开始查找unicode码“DAYSLEFT”,在4876b0。在4876c8处有一unicode码“20",改成0即可。
2、about菜单显示:
从401000开始查找unicode码“Registered to”,在49e904。然后查找命令“push 49e904”可以定位about菜单的代码。
00842120 PUSH dumped_c.0049E904 ; UNICODE "Registered To: "
00842125 PUSH EDX
00842126 MOV EBX, DWORD PTR DS:[ESI]
00842128 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCa>; msvbvm60.__vbaStrCat
修改:
00841F4F JE dumped_c.0084216F JE->JNE
00841FF2 JE BMP_crac.008420AE JE->JNE
pyzpyz
2004.4.22
