- 注册时间
- 2006-2-13
- 最后登录
- 1970-1-1
|
[face=楷体_GB2312]此文献给乖的媛儿~~~
祝她情人节快乐!!!![/face]
lava程序是编译出来的lava字节指令码的集合 和非解释语言编译出来的代码一样,它也可以被反汇编,不同的是,其指令码是虚拟CPU的指令码(LAVA(起码一代)并非严格意义上的虚拟机``说是虚拟CPU``还很勉强 嘿嘿``)。从而被破解或是得到源代码。由于LAVA指令字节码已被sippey等人公布,所以反汇编lava程序成为一件很简单的事``从而LAVA的安全性几乎不存在了```
以下用动态指令修改的方法来保护lava的代码````
由于lava是将lava字节码逐句载入到内存的缓冲来执行 所以直接修改比较复杂 这里用修改跳转表的方法来修改
lava1.0的代码和解释器存在与同一内存空间中
因此可以使用*语句来对解释器代码里的跳转表来进行修改
保证可以在lava20k的机器上用
8K的就不知道了``
void main()
{
int i;
int tp1,tp2;
int tbl1;
tp1=0;
tp2=0;
for (i=32768;tp1!=0xAA || tp2!=0xBD;i++);
{
tp1=*i;
tp2=*(i+1);
}
tbl1=*(i+2)+*(i+3)*256;
//invert "printf" code
//"printf" code=82h
*(tbl1+0x81*2)=*(tbl1+0x81*2);
*(tbl1+0x81*2+1)=*(tbl1+0x81*2+1);
//modify jump address
printf ("Alv");
}
编译完后用WINHEX对指令码进行查看``找到如下指令码
hex:8240
查指令表可知这里是
printf("Alv")编译出来的
那么改
82为81
则为8140
保存
这段代码仍然正常运行~
不过以后的getchar()指令将不能正常工作
若要正常工作,定义变量sa,sb,并在modify前加入:
sa==*(tbl1+0x81*2);
sb==*(tbl1+0x81*2+1);
printf后加入
*(tbl1+0x81*2)==sa;
*(tbl1+0x81*2+1)==sb;
即可
这样 反向工程时查看代码会误以为这里是getchar,而不是printf了
当在代码中大量使用此技术时,可使代码几不可读``达到反反向工程的目的
``````
|
|