这种方法只适用于你有了一组正确的KEY。
目标程序是一个PB写的软件。很奇怪,关键的解密部分没法反编译到源码,于是就有了本文-patch机器码。
跟踪程序发现机器码获取是通过dll文件的一个导出函数实现的,于是在这个函数段首下段,分析得知:
02773754 8BD8 MOV EBX,EAX
02773756 85DB TEST EBX,EBX
02773758 74 23 JE SHORT 0277377D
在02773754这个地址patch最好。找一块空地写代码,我找的是02776780这个地址:
02776780 > \8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]---取机器码保存的地址
02776784 . 60 PUSHAD---保护
02776785 . 8BFB MOV EDI,EBX
02776787 . E8 10000000 CALL 0277679C---此处用到了代码的自定位,因为是在dll中,需要考虑重定位问题
0277678C . 3131 XOR DWORD PTR DS:[ECX],ESI
0277678E . 3331 XOR ESI,DWORD PTR DS:[ECX]
02776790 . 34 35 XOR AL,35
02776792 . 3230 XOR DH,BYTE PTR DS:[EAX]
02776794 . 42 INC EDX
02776795 . 59 POP ECX
02776796 . 45 INC EBP
02776797 . 44 INC ESP
02776798 . 44 INC ESP
02776799 . 59 POP ECX
0277679A 00 DB 00
0277679B 90 NOP
0277679C . 5E POP ESI---得到源字符串地址0277678C
0277679D . B9 0F000000 MOV ECX,0F
027767A2 . F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]----复制字符串
027767A4 . 61 POPAD
027767A5 . 8BD8 MOV EBX,EAX
027767A7 . 85DB TEST EBX,EBX
027767A9 .^ 0F84 F3CFFFFF JE 027737A2
027767AF .^ E9 A6CFFFFF JMP 0277375A---跳回原流程
然后将02773754代码改为:
02773754 . /E9 27300000 JMP 02776780
02773759 |90 NOP
最后保存该dll文件。测试成功^_
[课程]Android-CTF解题方法汇总!