目前,如果能够熟练地编写汇编程序的人担心自己会被当作怪胎(我以前的公司曾使用汇编程序),那么即使是那些研究逆向工程的人也只能说他们能理解汇编。
很少有人敢说他精通汇编。
如果是为了开发,我也认为汇编实际上是没有用的。
“简单性”指的是“简单性”。
不仅是编译的优点,也是缺点。
这是因为它确实太“简单”,因此需要大量代码来实现非常简单的功能。
有时候我在看大部分汇编代码时会感到头疼,但是由于业务需要,我不得不在底层研究一波高级语言的实现,所以我写了这样的文章。
让我们从一个简单的C ++++小程序开始:该程序的功能非常简单,即输入一个整数,然后判断它是否等于123456,如果相等,则输出正确,如果错误,输出youarewrong。
然后使用反汇编工具将生成的exe文件还原为汇编语言。
上图是程序的开始。
这张照片是结尾部分。
如您所见,该程序的起始地址为00FA1000,结束地址为00FA2FF。
换句话说,要实现如此小的功能,需要几千行汇编代码。
如果每个人都以这种方式发展,恐怕我会精疲力尽,我将无法写任何东西。
但是,内部的大多数代码都是由编译器为我们生成的,而实际执行判断操作的代码可能仅是以下几行。
我首先在命令行中键入123,在00FA1082处设置一个断点,然后按Enter,程序被中断。
关键判断操作为cmpdwordptrss:[ebp-0x8],0x1E240此操作意味着将数字0x1E240与内存中地址[ebp-0x8]上的数据进行比较。
0x1E240转换为十进制时,您会看到它是123456,这是触发您正确的整数。
在右侧的寄存器窗口中,您可以看到寄存器ebp的值为00CFFB48,然后[ebp-0x8] = 00CFFB40在数据窗口中,您可以看到00CFFB40的值为7B。
转换为十进制只是123,这是我刚刚输入的数字。
如果两者相等,则zf标志将设置为1,如果它们不相等,则zf位将设置为0。
现在您可以从右侧的寄存器窗口看到zf位为0,然后jnz跳转已建立,因此您可以跳过右击并执行youarewrong。
最后,00FA10AE处的指令是jmpshortProject1.00FA1060。
jmp是无条件的跳转指令。
该指令的执行将跳回到要求用户在开始时输入整数的操作,这等效于实现while函数。
现在假设该程序是付费软件,需要用户输入密钥来解锁该软件。
如果我使此条件始终成立,那么我可以在不知道密钥的情况下使用该软件。
在反汇编窗口中,只需将所有jnzshortProject1.00FA10A1替换为nop,就可以直接忽略cmpdwordptrss:[ebp-0x8],0x1E240对zf位的影响,并直接执行即可。
换句话说,如果我随机输入一个值,程序将把您正确返回给我。
实际上,不仅C ++,而且大多数高级语言都在底部执行这样的判断。
因此,为了防止徒劳地使用编写软件,重要的是研究如何从最底层执行判断语句。
防止白人卖淫的最简单方法是增加炮弹。
特别是在这种键跳中,必须使用打包工具对其进行保护,以防止其他人轻松定位键跳。
第二种是添加花的说明。
此方法的本质是构造常量跳转并添加一些无用的跳转,这不会影响程序本身,但也会干扰其他程序。
关键跳跃的判断。
最无敌的方法是使用网络身份验证。
尽管这不能保证不会造成百分之一百的妓女,但这确实是一种非常有效和相对容易的方法。
但是其缺点是,如果服务器崩溃,软件将无法运行,这对于用户而言是不可接受的。
技术对抗永远是最根本的,没有尽头。
现实往往是力量高大,魔力高,而在矛与盾之间的攻守竞赛中,技术可以不断发展并为客户提供更安全,更可靠和便捷的服务。
????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????? ????????????????????????????????????????