ORD PTR DS:[EAX],1 //这里给关键
地址赋值,并且赋值后没有发生变化,这就是关键点,我们把1改成一个非1、2、3、4的任何数据都行。
修改后第一个问题就解决了。
再看第二个ESI值的问题
004ADFC2 |. 8BF1 MOV ESI,ECX //这里看到是ECX给关键的ESI赋值,且前面ecx的值没有变。所以到段首查看。
局部调用来自 004B5CD6, 004B75ED, 004B7ED1, 004B7EEE, 004B8B7D,这个段有这些调用。
第一处
004B5CCF . 33C9 XOR ECX,ECX //这里ecx清零了最后值为0,非1、2、3、4,不用动
004B5CD1 . BA 01000000 MOV EDX,1
004B5CD6 . E8 D982FFFF CALL PepSky.004ADFB4 //这里调用,
第二处
004B75E8 . BA 01000000 MOV EDX,1
004B75ED . E8 C269FFFF CALL PepSky.004ADFB4 //与第一处相同
第三处
004B7ECD |. 33C9 XOR ECX,ECX //这里ecx清零了最后值为0,非1、2、3、4,不用动
004B7ECF |. 33D2 XOR EDX,EDX
004B7ED1 |. E8 DE60FFFF CALL PepSky.004ADFB4
第四处
004B7EE7 |. 33C9 XOR ECX,ECX
004B7EE9 |. BA 01000000 MOV EDX,1
004B7EEE |. E8 C160FFFF CALL PepSky.004ADFB4
第五处
004B8B76 . 33C9 XOR ECX,ECX
004B8B78 . BA 01000000 MOV EDX,1
004B8B7D . E8 3254FFFF CALL PepSky.004ADFB4
也就是说ESI的值在主程序没起作用。修改第一个关键
地址的值后就OK了。
各个分程序的爆破
该
软件对七个子程序加了密,并有校验不让单独运行。
①CDDVDCopy
OD载入运行后发展直接退出。我们单步运行发现,
004C7DD0 >/$ 55 PUSH EBP
004C7DD1 |. 8BEC MOV EBP,ESP
004C7DD3 |. 83C4 E8 ADD ESP,-18
004C7DD6 |. 53 PUSH EBX
004C7DD7 |. 33C0 XOR EAX,EAX
004C7DD9 |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
004C7DDC |. 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
004C7DDF |. B8 845E4C00 MOV EAX,CDDVDCop.004C5E84
004C7DE4 |. E8 A3F1F3FF CALL CDDVDCop.00406F8C
004C7DE9 |. 8B1D 18B24C00 MOV EBX,DWORD PTR DS:[4CB218] ; CDDVDCop.004CF5B8
004C7DEF |. 33C0 XOR EAX,EAX
004C7DF1 |. 55 PUSH EBP
004C7DF2 |. 68 047F4C00 PUSH CDDVDCop.004C7F04
004C7DF7 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004C7DFA |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004C7DFD |. A1 08B14C00 MOV EAX,DWORD PTR DS:[4CB108]
004C7E02 |. C700 FFFFFFFF MOV DWORD PTR DS:[EAX],-1
004C7E08 |. A1 D8B34C00 MOV EAX,DWORD PTR DS:[4CB3D8]
004C7E0D |. BA 1C7F4C00 MOV EDX,CDDVDCop.004C7F1C ; ASCII "cn"
004C7E12 |. E8 11CDF3FF CALL CDDVDCop.00404B28
004C7E17 |. A1 C8B04C00 MOV EAX,DWORD PTR DS:[4CB0C8]
004C7E1C |. C700 01