008DE2A4 90 NOP 008DE2A5 90 NOP 008DE2A6 90 NOP 008DE2A7 90 NOP 008DE2A8 41 INC ECX ; // 不匹配, 下一个 008DE2A9 ^ EB E8 JMP SHORT cx2.008DE293 008DE2AB C7848D B3234000>MOV DWORD PTR SS:[EBP+ECX*4+4023B3],0 ; // 找到了, 清零, 第一次 ECX=15A 008DE2B6 8DB5 93524000 LEA ESI,DWORD PTR SS:[EBP+405293] ; // 8E1293 放加密后的代码 008DE2BC B8 0A000000 MOV EAX,0A ; // 加密代码 A 个字节一段 008DE2C1 F7E1 MUL ECX 008DE2C3 03F0 ADD ESI,EAX ; // 8E1293 + A*15A = 8E2017 008DE2C5 56 PUSH ESI ; // 第一次调用对应的加密代码 008DE2C6 51 PUSH ECX 008DE2C7 8A85 CD204000 MOV AL,BYTE PTR SS:[EBP+4020CD] ; // 解密字节保存处 008DE2CD 0AC0 OR AL,AL 008DE2CF 75 28 JNZ SHORT cx2.008DE2F9 ; // 已经计算过了,就跳过
008DE2D5 8B85 7BCF4000 MOV EAX,DWORD PTR SS:[EBP+40CF7B] ; // 文件头 VA 008DE2DB 8B70 3C MOV ESI,DWORD PTR DS:[EAX+3C] ; // PE头 RVA 008DE2DE 03B5 7BCF4000 ADD ESI,DWORD PTR SS:[EBP+40CF7B] ; // PE头 VA 008DE2E4 83C6 28 ADD ESI,28 ; // OEP VA 008DE2E7 AD LODS DWORD PTR DS:[ESI] ; // OEP 008DE2E8 8AD8 MOV BL,AL 008DE2EA 02DC ADD BL,AH 008DE2EC C1E8 10 SHR EAX,10 008DE2EF 02D8 ADD BL,AL 008DE2F1 02DC ADD BL,AH ; // OEP 四字节和 = 10 008DE2F3 889D CD204000 MOV BYTE PTR SS:[EBP+4020CD],BL ; // 解密用字节 . . . 008DE30E 61 POPAD 008DE30F 8BBD 7FCF4000 MOV EDI,DWORD PTR SS:[EBP+40CF7F] ; // 代码解密后放到 134708 开始的内存块 008DE315 B8 0A000000 MOV EAX,0A 008DE31A F7E1 MUL ECX 008DE31C 03F8 ADD EDI,EAX ; // 134708 + A*15A = 13548C 008DE31E B9 0A000000 MOV ECX,0A 008DE323 8A9D CD204000 MOV BL,BYTE PTR SS:[EBP+4020CD] 008DE329 EB 11 JMP SHORT cx2.008DE33C
008DE32E 61 POPAD 008DE32F 8BFE MOV EDI,ESI 008DE331 B9 0A000000 MOV ECX,0A 008DE336 8A9D CD204000 MOV BL,BYTE PTR SS:[EBP+4020CD] ; // 取出解密用字节 10 008DE33C AC LODS BYTE PTR DS:[ESI] ; // 密文 008DE33D 32C3 XOR AL,BL ; // 密文 Xor 10 008DE33F AA STOS BYTE PTR ES:[EDI] ; // 明文 008DE340 ^ E2 FA LOOPD SHORT cx2.008DE33C ; // 解密 A 个字节 008DE342 83EF 0A SUB EDI,0A 008DE345 57 PUSH EDI ; // 新的函数入口 13548C 008DE346 8B7424 24 MOV ESI,DWORD PTR SS:[ESP+24] ; // 返回地址 499EC5 008DE34A 83EE 04 SUB ESI,4 008DE34D AD LODS DWORD PTR DS:[ESI] 008DE34E 81EF DD204000 SUB EDI,cx2.004020DD 008DE354 2BFD SUB EDI,EBP 008DE356 03C7 ADD EAX,EDI ; // 地址转换成偏移量 008DE358 8946 FC MOV DWORD PTR DS:[ESI-4],EAX ; // 变成 CALL 13548C. . // 调整Stack // SMC . . 008DE3B0 61 POPAD 008DE3B1 61 POPAD 008DE3B2 C3 RETN ; // 返回到 13548C
// 从上述过程可以看到, 如果OEP变了, 那么加密代码解密出来就不对 // 所以我们恢复 OEP, 用LordPE 查脱壳前OEP= 4DD000, VA=8DD000 // 用 OD 修改 CX2.EXE 8DD000 处为 JMP 495FA8 // 用 LordPE 改 OEP= 4DD000, 得到CX3.EXE
// 用 OD 载入CX3.EXE还是出错, Trace into again, 错在 499EDA
//bp 499EDA, F9, 第一次中断 00499EDA CALL CX3.008DE0DD
// F8后变成 00499EDA CALL 00135496
00135496 8B43 10 MOV EAX,DWORD PTR DS:[EBX+10] 00135499 33E6 XOR ESP,ESI 0013549B 33E6 XOR ESP,ESI 0013549D 8B10 MOV EDX,DWORD PTR DS:[EAX] 0013549F C3 RETN
// 说明第一次解密正常 // F9, 第二次中断在00499EDA, F8, 出错 // 到 00135496 一看, 刚才解密的代码不见了 // 我跟过没脱壳原程序, 第二次时代码还在 // 可能是检测不到壳, 把那块内存清零了
上一页 1 2 3 4 下一页 |