代码逆向工程
文章平均质量分 71
yangbostar
这个作者很懒,什么都没留下…
展开
-
代码逆向(一)——寻找main函数入口
<br />逆向的第一步是什么?这要问你学习C语言的第一步是什么,很自然的,逆向的第一步当然也是大名鼎鼎“HelloWorld!”了。但是也不要因此就误认为这一节会很简单,如果你是第一次接触逆向的话,那么这一节还是有些难度的。<br /><br /> 好的,让我们先写一个世界上最出名的程序:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> printf("Hello World!/r/n");<br /> ret转载 2010-08-12 09:23:00 · 13123 阅读 · 6 评论 -
代码逆向(二)——if-else分支的识别技巧
<br />if-else分支几乎是所有人学习C语言后第一个接触的知识点,那么我们学习逆向理所当然也应该从这里开始了。其实关于if-else分支我们在上一节已经接触过了,这一节我们将详细的探讨有关于if-else分支的识别与编译器可能使用的优化方案。<br /><br /> 在学习逆向的时候,我们要始终记住我们是在与编译器打交道,其次也要注重总结前辈们的经验,我个人大致将if-else分支的逆向分为4种状态,下面我将为大家一一讲解。<br /><br />1.3.1、以常量为判断条件的简单if-el转载 2010-08-12 09:50:00 · 2304 阅读 · 0 评论 -
代码逆向(三)——循环分支的识别技巧
<br />“嘿!为什么要先学这里,不应该是for循环吗?”<br /> 相信很多读者都会产生以上疑问,要的就是这种效果!就让我们带着这个疑问开始这一节的学习,先看源码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> int nNum = 26;<br /> printf("Mom! I can sing my ABC!/r/n");<br /><br /> // 听!小Baby开始唱ABC了……<br />转载 2010-08-12 10:11:00 · 1207 阅读 · 0 评论 -
代码逆向(四)——switch-case识别技巧初探
<br /><br /> 我们先看一段代码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> int nNum = 2;<br /> switch (nNum)<br /> {<br /> case 0:<br /> printf("nNum=0");<br /> break;<br /> case 1:<br /> printf("nNum=1");<br转载 2010-08-12 10:13:00 · 2098 阅读 · 0 评论 -
代码逆向(五)——switch-case识别技巧提高
<br />我们前面为各位读者分别介绍了转成if-esle与利用跳转表两种优化模式,但是在最后我隐含着提出了一个问题,既如果我们的switch-case分支两个数之差大于50甚至更多的时候,那么我们此时是否仍需要利用跳转表来解决问题呢?很显然我们不能这样做,假如我们遇到如下这段代码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> switch (argc)<br /> {<br /> case 0:<br />转载 2010-08-12 10:16:00 · 3580 阅读 · 0 评论 -
代码逆向(六)——加法与减法的识别与优化原理
<br />加法的优化相对来说比较简单,只有3种优化方案,下面我们就以一个简单的例子来说明这三个问题,先看源码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> int nNum, nA = 8;<br /> nNum = argc + nA; // 形式1<br /> printf("%d/r/n",nNum);<br /> nNum = argc + 9; // 形式2<br /> printf("转载 2010-08-12 10:18:00 · 1294 阅读 · 0 评论 -
代码逆向(七)——乘法的识别与优化原理
<br /> 那么如果让我们来做乘法的优化,我们会怎么做呢?很显然位移是必须要被利用的,但是除此之外微软的编译器还利用了lea指令,但是乘法的优化是非常多变的,本小节的目的是让各位读者再看见某一块指令时知道“哦!这是乘法...”就可以了。<br /> 我们先看看简单的位移优化,经过笔者的总结,当乘数为2的次方,且大于8时编译器才会使用此优化,让我们看看优化前与优化后的效果:<br />源码:<br /> int nNum = 16;<br /> printf("%p",nNum*argc)转载 2010-08-12 10:21:00 · 1495 阅读 · 0 评论 -
代码逆向(八)——除法与取模运算的识别与优化原理
<br />1.9.1、除法与倒数相乘<br /> 何为倒数相乘?很简单,编译器世界中倒数相乘的中心思想其实就是用乘法来代替除法运算。它的原理很简单,就是将被除数乘以除数的倒数,其公式为x/y = x*(1/y),我们拿10/2作为例子,我可以得出以下推论:<br /><br />由 公式x/y = x*(1/y) 可得 10/2 = 10*(1/2) = 10*0.5<br /><br /> 编译器也正是由这个公式才得以将除法转换为除法,但是编译器为什么要这样做呢?原因同样很简单,因为乘法的运转载 2010-09-07 12:53:00 · 5933 阅读 · 2 评论 -
复杂分支结构逆向
<br />一、 条件分支的逆向基础<br />(1)简单if-else<br />我们知道简单的if-else的跳转结构是这样的。<br />例如:<br />if(i1<x1)<br /> ……;<br />else<br /> ……;<br />在反汇编结果中我们会看到类似下面的结果<br /><br /><br />两点说明::<br />①jxx AAAAAAAA 这句由于false则跳转,因此还原为if代码时,要注意。<br />②jmp BBBBBBBB 这原创 2011-02-22 12:45:00 · 1373 阅读 · 1 评论