再次学习C++,先从一个非常大空的方向来谈(后面会有小小干货):
学习编程,应该先从汇编、C语言这些比较底层的语言入门,还是从Java,Python(甚至是易语言)这些高级语言入门? 坦白说,高级语言和底层语言各有优缺点,以至于不管选择哪个方向入门,只要在踏实地学着,总有自己的一技之长。总好过一直在门口徘徊着,犹豫好久代码没写几行。
这时候,就要打极端:如果一辈子只能用一种语言,你是学汇编、C,还是Java、Python、易语言?
选汇编,面对的是subcmp retn je jnz这些半生不熟的英文,地址是0040D110,数据是16进制的,这些,初次学起来是要花大力气的,不过,你看到的是更全面、更大的世界。毕竟,当你看到i++,++i,a++b,a+b++,感到十分疑惑时,用汇编反编译一下,就能看到编译器隐藏了一些东西,也就容易理解多了。
选C,经常面对的是黑白框框的cmd,排个序都要自己冒泡、插入一些,不是参加ACM的很难有成就感,话说ACM打击更大。可是,C是极少封装的,C可以做的事太多了,学好了它,内力起码是不错的。
选Java,Python,易语言?大堆大堆的函数,长串长串的命名,功能很多,烟花缭乱,像在海边拾着贝壳,很难知道里面什么样。好处多多:容易有成就感,Java写APP,Python架后台,易语言写外挂。
其实呢,学哪种语言,都锻炼了逻辑,至于哪个好,都挺好。再次学C++,那C++是一门怎样的语言? 不客气地说,C++集中了上述语言的各种缺点,优点有待体会。
C++上手相对慢,重载,虚函数,抛出异常等等,初学者写出有意思的东西很难,一般还是黑白框框。按理说,这样的语言应该容易看到底层的东西。还不是,它为了安全,各种封装。C++14更是各种语法糖,错综复杂,迷雾弹多多。
坦白讲,我是不认为C++应该作为入门语言,甚至入门以后都不应该深入学习C++。大家看看下图:
单就重载中参数的用const,加指针还是引用都分六种不同的情况, 8种使用方法有6种效果。
所以,即便我看了侯捷老师的书,知道他编码的风格,我也不会使用inline和const,因为即便在不久的将来,追求这种细致都是不必要的,能够在大的框架下学会C++,会使用C++大多语法,多训练,就挺好了。如果能以C++写一个具体的东西为目标,将会更有成就感和动力。
下面来一张重载的反汇编截图:
一般我们用软件会出现序列号注册之类的,怎么破?
比如这样:
这时候,用OllyDbg打开:
一般windows软件是 从窗口GeTMessage,然后DispatchMessage。
GeTMessage有两个函数: GetDlgItemText(A\W)da, GetWindowText(A\W),
其中A指 ASCLL, W指双字节编码,
加载运行:
Ctrl+G快速定位:
F2设置断点,
F8往下走:
看到这停:
不确定可以在这里: esp+0x4C是栈的位置,
此时:
EDX存放用户名,EBX存放字符数:
EAX存密码
Push EAX EDX EBX,进入00401340函数:
不管这个验证函数,不进入,看它返回值,
test, eax存放它的返回值,
je作为标志位,如果返回为1,则说明eax返回为0,密码错误:
改:
或者该je的值为NOP,
因为je跳转意味着密码错误, 让它不跳转,改为NOP,
搞定: