俺发现这里有很多人不懂汇编,居然也在学破解。
俺认为,不懂汇编的人永远只能是菜鸟!
也许你认为不懂汇编也能够从寄存器或堆栈中找到注册码,可是用
注册码 = f(用户名或机器码) 算法的软件肯定会越来越少,而用
F(注册码,用户名或机器码) 算法会成为主流,应用程序本身将不
再含注册机功能,真正的注册码也永远不会在寄存器或内存中出现,
你上哪找去?
也许你认为找不到注册码还可以爆破,但是你找到爆破点的依据不
是靠理解了程序的算法,而是根据程序在完成注册子过程中提供的
各种操作提示信息,但是程序可以在完成注册子过程之外任意可能
的地方重新验证注册码而且不做任何提示就取消注册标志,你将连
这些重新验证的地方都找不到?怎么爆破?事实上程序可以有无数
种方法让得不到真正注册码的爆破者失去注册资格,这样爆破最终
还是死路一条!
所以,破解学习的正道还是要研究算法,要能够读懂汇编代码,最
终要能够自主制作注册机。
俺学破解也只有一个星期的时间,俺也不懂汇编,但是俺懂C++,
了解编程的原理,所以能够很快大致地理解汇编,仅仅知道汇编指
令的含义是不够的,这里将我对汇编的一些理解罗列如下:
1、关于函数调用,在分析汇编代码时总是要遇到无数的Call,对
于这些Call,尽量要根据Call之前传递的参数和Call的返回值
来判断Call的功能,特别当调用的是系统函数时,不要见Call
就跟,在Call之前所做的所有PUSH动作以及对寄存器的操作都
可能是在给函数传递参数,而函数的返回值十有八九在 EAX里
面,因为程序绝大多数都使用高级语言开发,而几乎所有的高
级语言编译器都默认将函数的返回值存放到EAX。
2、关于堆栈,善于使用 ESP会收到事半功倍的效果,在一个算法
中,任何可能使用的常量、变量和函数地址都必然在当前 ESP
中留下蛛丝马迹,由于变量是以地址的形势进行存储的,所以
建议经常使用dd ESP指令来观察堆栈内容,注意在汇编代码中
凡是[ESP+XXXXXXXX]都代表着堆栈中的第XXXXXXXX个房间住的
那个房客。
3、关于变量的赋值,能否了解到对变量的赋值过程在算法研究中
是非常重要的。由于变量是用地址访问的,,因此对形如
MOV [AAA],BBB
的代码要高度关注,它通常是修改变量(地址为AAA,或AAA为
寄存器时地址为AAA的值)的值为BBB(BBB为寄存器时取BBB的
值)。
4、另外,汇编中会有很多特定的结构与高级语言中的语句相对应,
如最简单的
001 CMP AAA,BBB
002 JNZ 00N
003 ...
...
00N ...
相当于
if(AAA==BBB){003...00M}
001 MOV ESI 00000000
002 MOV EBX 0000000A
003 ...
00K INC ESICMP ESI EBX
00L CMP ESI EBX
00M JL 003
00N ...
相当于
for(int i=0;i<10;i++){003...00J}
001 MOV EDI 00000004
002 AND EAX 00000003
003 JMP [EAX+EDI]
004 ...
005 ...
006 ...
007 ...
相当于
switch(EAX%4)
{
case 0:004;
case 1:005;
case 2:006;
case 3:007;
}
等等,这些结构都必须熟悉。
说到底,俺自己也是菜鸟一个,遇到了麻烦,在这里等高手解答,闲来无
事,就灌一篇激励各位菜鸟朋友上进吧!