有没有办法通过修改内存,伪装机器码,从而降低程序被破解的几率

首先,可以这么做,很多加壳工具就是这么做的。然后解释一下具体怎么做到的:以intel x86汇编指令作为举例(其它汇编也有对应的模型):任何反编译工具都是参照了intel给出的汇编建议的模型,比如(e)bp+偏移地址代表局部变量,(e)ax,(e)bx,(e)cx,(e)dx的修改不用考虑保护,(e)ax是返回值(的前四个字节),然后入栈规则有几个标准的模型,以VC给出的名字举例:有cdecl方式,参数从右到左入栈,还有stdcall方式,参数从左到右入栈,还有fastcall方式,参数通过寄存器传递,等等。标准模型里,是调用者准备栈还是非调用者准备栈都有要求。所以,如果你的程序不按照这个规则进行,那么别人就很难破解了。可是,程序都是有编译器生成的,而编译器又是必须遵守规则的,而代码如果规模非常大,编译后几百K,那么手打汇编恐怕太困难了。加壳工具是根据这个原理做的,但毕竟加壳工具也是有自己的规则的,如果自己设计一套规则,那么任何人都无法破解。好吧,来设计一个:别的编译器都用(e)sp来传参,我的汇编用(e)di+偏移地址传参,用(e)si+偏移地址保存局部变量,别人用栈传参,我偏偏用物理地址保存参数。别人用(e)ax做返回值,我用(e)sp做返回值,把所有的call全变成jmp far,我相信这么改了以后,反汇编工具就很难搞清楚你的程序在做什么了,至于堆栈,堆栈指针是返回值,肯定指向无效数据。当然,要是真搞出来就很牛了,前提要精通汇编语言,还要精通编译原理,并且开发时间会很长。如果你有兴趣,可以试试看~
■网友
是存在的。到达同一种效果有n种方法。但前提是你得搞清楚od是如何获取堆栈的。这很重要。


    推荐阅读