StarForce、Execryptor 等猛壳强大的奥妙在哪里?就是运用虚拟机技术使
分析工作很困难。研究破解难免遇到 VB 写的 Pcode 程序,如果没有 WKT 的调
试器肯定会腾云驾雾吧……

    “他不爱胡闹,……又不喜嬲着女同学讲恋爱。”——茅盾《蚀》

    你上小学的时候老师教你识字,指着上面的一个字说这个字是嬲字,是戏弄
的意思,于是你再见到这个字就知道了这个嬲字念做 niao3,是戏弄的意思。

    在 CPU 里,制作芯片的工程师就扮演老师,而 CPU 就充当你,以前用继电
器现在用集成电路,通过一些组合(如果你也想装个玩具芯片,可以看《CODE》
这本书)能够识别出数据并执行相应的功能,就像你能够根据汉字的形状联想到
它的读音和意义。

    学破解的时候教程上都说,这个就是关键一跳(或者飞向光明之巅,摘自 
《fly 语录》),把它 NOP 掉。你一定已经知道了就是把这条指令都改成 90,
为什么是 90 而不是 88 或者 66?这个问题真的很难解释,因为这是 Intel 定
的,就像嬲念 niao3 而不念做 cao4 不是……的意思一样。

    我们的 CPU 都只按照 Intel 标准识别代码。反汇编器按照相反的规则把二
进制代码变回我们认识的助记符号,把硬盘上的 50 变成 push eax,当然好理解
多了。

    你应该已经意识到,如果代码定义被我们颠覆了,反编译器就什么都做不了
啦,哈哈,不能放过每一个邪恶的念头,让我们来试试吧。

    当然我们不能去改造 CPU,因为用户装你的软件不会包路费让你过来给他改
CPU,再说你改了 CPU Windows 都不能运行了,所以我们要借助模拟执行。

    又一个新名词,我讨厌新名词。如果你不是外籍华裔,而又学过英语的话,想
象一下刚开始学的时候,我们学到 shit 这个词的时候得用汉语想一下这个词就是
汉语狗屎的意思,我们的汉语已经成为思维的基础,就像 CPU 执行 Intel 指令一
样,而中间 shit - 狗屎的关系则是后来学习得到的,我们的思维过程是:看见 
shit,翻译成中文狗屎,联想狗屎这个意象或者别的什么东西-_-!

    这就是模拟执行。我们仿照这个过程写个程序,读出我们安排好的新代码,执
行对应的过程就行了。我用伪语言描述一个:

要执行的代码 mycode = {"shit", "kiss", "kick", "die"}
指令解析器:
  for(i=0 ; i<=4 ; i++)
  {
    switch(mycode[i])
    case  "shit":
      Put_a_shit();
    case  "kiss":
      Kiss_it();
    case  "kick":
      Be_kicked_by_it();
    case  "die":
      Its_time_to_die();
  }
模拟器:
  Put_a_shit()
  {
    Shit = TRUE;  
  }
  Kiss_it()
  {
    ...怎么kiss自己想吧,我想不出来...
  }
  Be_kicked_by_it()
  {
    ExitProcess(-12345678);
  }
  Its_time_to_die()
  {
    ExitWindows(...);
  }

    是不是有点体会了?这就是最简单的虚拟机,像 VMare 之类的虚拟机还要模拟
出硬件,处理中断反映给真实机器,那就复杂了我们也用不到。

    打字很累就这样吧。

forgot/iPB
2006.1.26
  



btw:code inject老见你飘论坛怎么qq不转了?