转自UnPack.Cn:http://www.unpack.cn/thread-11192-1-1.html
我的这个小程序是在98下 Kol+Delphi 做的(简单测试通过),不知兼容性如何(应该不存在平台问题吧)? 说说修复原理吧,为什么说可以正确还原CC呢?修复CC的难点是判断真CC,所以目前穿山甲之所以没有人做CC修复的程序(模拟的除外,说白了它就是真假都模拟),想跟踪脱壳程序方便些,一般都只好无奈地进行手工修复和遇错再修复。那为什么我说能正确还原呢?网上的文章不是已提出有假CC吗,你是怎样来正确排除它?是的,我们不防自己做个程序,加入 Nanomites 所需的标签macro,加壳成功后,你调试一下它,你会发现你来到的第一个CC必定是无论是否跳转,都是五字节的距离,聪明的你应该找到答案了吧,这个就是加壳器为 标签macro 设定的判断,目前版本来说是独一无二的,也就是说这里生成的CC是没有做假的,如果做假了,想还原,哈哈,就很麻烦了。 标签macro 是一对的,也就说只要我们能够找到这一对的开始和结束的位置,它里面的真假CC就有不攻自破的方法,在此范围内利用反汇编指令长度的配合,你是绝对不会修错里面的CC的!所以关键是找到 标签macro ,我都说过了,它是独一无二的,聪明的你应该想到了吧!我的小程序就是这样做的,A.逐字节扫描含CC的Section,先找出第一个 标签macro (都用90修复或EB03或E900000000修复,下一次找到的就重复A.),向下进行反汇编指令扫描,发现CC指令的就是要修复的CC了!一直循环到修复结束! 主要的做法和观点都讲了,具体的细节操作我用编程交给了修复器去做,当中的修复涉及到汇编引擎、反汇编引擎、编译引擎、查找引擎,衔接代码引擎,为了拯救手工修复,没什么好说的了,只好埋头努力把修复器做出来! 另外,我的模板里L023: cmp esi,edi jnb L396 call L402 xchg ebx,eax cmp dword ptr ds:[ebx+30],0 // 这时是 标签macro 开关 je L055 // 请改为 je L051 //这样会比较准,修复时间会长一点更新:在XP修正98下不会Cash的Bug,原因已经知道(已经屏蔽),但先确定修复功能是否稳定,再更新。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)