破解思路总结
预备: 双击程序,看看能不能正常运行,和看看一些基本信息
1.基本都是马上用 OD 打开(PEID 基本废了),一看有壳,无视,
SHIFT+F9 看看能不能跑起
不能,精神来了,先看看它的 anti 是如何实现的
2. 如果上面运气好,能跑起来,万能断点看看能不能断,不能就对各有
可能的 API 下段(OD 插件全选,菜啊,就是不给他们漏掉),这样的
坏处是如果作者把API头部偷掉,将要死掉,当然那还是有办法的
(和拼下面的 :如果怀疑有这种可能性被偷掉的,用插件选上有可能的 API ,然后就可以在 断点窗口见到
这些 API 的地址,用 UE 编辑一下,写个脚本在 每个断点 +6 (这个数字你自己定义),这样一跑
基本就可以 F 掉,偷代码的小动作,当然这是其中的一种方法。对于有大量 SEH 等垃圾的程序,
还有一些有效的方法对付。。。 先 买个关子。。。
3. 不管什么,F8 一直走,首先看看各个CALL 的反应,关注一些F8过后,
寄存器或数据窗口,堆栈中显示有问题
的CALL,先记录一下,千万不要看 CALL 就进去,累死你Y的
4. 关键的是看看能不能爆破,能! 就直接看爆破点的要求是什么 ,知道了条件
后,然后反追上面给出条件的地方
5. 这里说说稍微高级一点的爆破 。 譬如一个壳有NAG,但它没有自检验的情况下
(有也好办,把它也干了,全世界清净了)
就譬如今天流出的 Enigma 1.65 ,我加了个壳,发现有 NAG ,于是就想去了它
一看,本想去断尾 SMC 的,(这里如何追那个启动NAG的就不说了,很简单)
但我忘了这个壳是多重解出断尾,但不重要。追进去一看,原来分了三段解出
_________________________________________________________________
0108E811 B8 A4E70800 MOV EAX,8E7A4
0108E816 03C5 ADD EAX,EBP
0108E818 81C0 93000000 ADD EAX,93
0108E81E B9 48060000 MOV ECX,648
0108E823 BA F646FB51 MOV EDX,51FB46F6
0108E828 3010 XOR BYTE PTR DS:[EAX],DL DL 作为解码 KEY,这里是 0xF6
0108E82A 40 INC EAX
0108E82B 49 DEC ECX
0108E82C ^ 0F85 F6FFFFFF JNZ 0108E828
0108E832 E9 04000000 JMP 0108E83B
_________________________________________________________________
0108EB1C 0800 OR BYTE PTR DS:[EAX],AL
0108EB1E 03C5 ADD EAX,EBP
0108EB20 81C0 9B030000 ADD EAX,39B
0108EB26 B9 40030000 MOV ECX,340
0108EB2B BA B7F506C8 MOV EDX,C806F5B7
0108EB30 3010 XOR BYTE PTR DS:[EAX],DL key is 0xB7
0108EB32 40 INC EAX
0108EB33 49 DEC ECX
0108EB34 ^ 0F85 F6FFFFFF JNZ 0108EB30
0108EB3A E9 04000000 JMP 0108EB43
__________________________________________________________________
0108EC1F B8 A4E70800 MOV EAX,8E7A4
0108EC24 03C5 ADD EAX,EBP
0108EC26 81C0 A1040000 ADD EAX,4A1
0108EC2C B9 3A020000 MOV ECX,23A ; 解码长度,这里垃圾啊,作者要检讨了
0108EC31 BA 4C88F1DA MOV EDX,DAF1884C ; EDX 作为解码 key is 0x4C
0108EC36 3010 XOR BYTE PTR DS:[EAX],DL
0108EC38 40 INC EAX
0108EC39 49 DEC ECX
0108EC3A ^ 0F85 F6FFFFFF JNZ 0108EC36
0108EC40 E9 04000000 JMP 0108EC49
__________________________________________________________________
OK 走完这里就解除了 断尾的 RETN
断尾原代码
0108ED42 CE INTO 这个 0xCE 就是没经 3 重解码的原样
0108ED43 59 POP ECX
0108ED44 65:68 2D486364 PUSH 6463482D
0108ED4A 6A 60 PUSH 60
0108ED4C 6C INS BYTE PTR ES:[EDI],DX
0108ED4D 2D 5D7F6279 SUB EAX,79627F5D
0108ED52 68 6E79627F PUSH 7F62796E
0108ED57 2D 7B687F7E SUB EAX,7E7F687B
——————————————————————————————————
现在我们知道了断尾处经过 3 重解码
而我们要实现一句 MOV BYTE PTR[1151208],0C3 // smc
对应的 16 进码 C6 05 08 12 15 01 C3 当然我们还要它返回到实际地方,后面还要一个 c3
那就是 C6 05 08 12 15 01 C3 C3 了
好由于我测试过 108EC24 处的代码没用,于是我就借它的宝地一用
但我们要给他们实现3重解码后,变成我们要实现的代码,那还需要把 C6 05 08 12 15 01 C3 C3 逆推出需要的代码
就写一个 C 程序
#include <iostream>
int main()
{
int smc[]={0xc6,0x5,0x8,0x12,0x15,0x1,0xc3,0xc3};
int i,j,s,temp;
for(i=0;i<8;i++)
{
temp=smc[i];
temp^=0x4C;
temp^=0xB7;
temp^=0xF6;
if(temp<0x10)
cout<<"0"; // 由于 16 进制粘贴,需要一个 0 ,譬如 05 这样才不会出现错误
cout<<hex<<temp<<" ";
}
cout<<endl;
return 0;
}
这样就可以得到对应的 CB 08 05 1F 18 0C CE CE 了,下一步如何做,
当然是 直接在断尾 0108ED42 开始二进制粘贴啦,保存一下,你在双击,就不见了 NAG 直接启动程序了
6. 成功高兴一下,DEL。
有创意的记录一下后,DEL。
解不开,收起来,过段时间还是DEL。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)