能力值:
( LV2,RANK:10 )
|
-
-
2 楼
需要老大鉴定下贴子质量,呵
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
@@:
inc eax
cmp dword pr [eax],12345678h
jne @B
这叫什么循环
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
VC++的反汇编
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
[QUOTE=fixfix;627937]@@:
inc eax
cmp dword pr [eax],12345678h
jne @B
这叫什么循环[/QUOTE]
这是一个空循环,在一些程序中用来进行简单的“延时”;
unsigned i = 0;
while( i++ != 0x12345678 ); // 空循环
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
学习,谢谢!!!!!!!!!!!!!!!1
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我不赞同你的 延时 说法
我用来搜索特征码的
就叫他做 调试后的极端循环吧
你写的 while(i<0x12345678)
也不是我写的代码while写法
.while (dword ptr [eax]!=12345678h)
inc eax
.endw
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
为了知识的完整性,这里补充一下C语言里的分支语句
二、分支语句
1、if-else 语句
为了观察其汇编语句,下面是一个简单的if判断结构:
if(a>0 && a<10)
{
printf("a>0");
}
else if( a>10 && a<100)
{
printf("a>10 && a<100");
}
else
{
printf("a>10 && a<100");
}
if 判断都是使用cmp再加上条件跳转指令。对于if( A && B)的情况,一般都是使用否决法。如果A不成立,立刻跳下一个分支。依次,如果 B 不成立,同样跳下一分支。
cmp 条件
jle 下一个分支
所以开始部分的反汇编为:
if(a>0 && a<10)
00411A66 cmp dword ptr [c],0
00411A6A jle 411A81h ; 跳下一个else if的判断点
00411A6C cmp dword ptr [c],0Ah
00411A70 jge 411A81h ; 跳下一个else if的判断点
{
printf("a>0");
00411A72 push offset string "a>0" (4240DCh)
00411A77 call @ILT+1300(_printf) (411519h)
00411A7C add esp,4
}
else if 的和 else 的特点是,开始都有一条无条件跳转到判断结束处,阻止前面的分支执行结束后,直接进入这个分支。这个分支能执行到的唯一途径只是,前面的判断条件不满足。
else 则在jmp之后直接执行操作。而else if则开始重复if之后的操作,用cmp比较,然后用条件跳转指令时行跳转。
else if( a>10 && a<100)
00411A7F jmp 411AA9h ;直接跳到判断块外
00411A81 cmp dword ptr [c],0Ah ;比较+条件跳转,目标为下一个分支处
00411A85 jle 411A9Ch
00411A87 cmp dword ptr [c],64h
00411A8B jge 411A9Ch
{
printf("a>10 && a<100");
00411A8D push offset string "a>10 && a<100" (424288h)
00411A92 call @ILT+1300(_printf) (411519h)
00411A97 add esp,4
}
else
00411A9A jmp 411AA9h ;这里是else,所以只有简单的一条跳转。
{
printf("a>10 && a<100");
00411A9C push offset string "a>10 && a<100" (424288h)
00411AA1 call @ILT+1300(_printf) (411519h)
00411AA6 add esp,4
}
return c;
2、switch-case 语句
switch 的特点是有多个判断。因为 swtich 显然不用判断大于小于,所以都是je(因此,C语言中switch语句不支持float类型的变量),分别跳到每个case处。最后一个是无条件跳转,直接跳到default处。以下的代码:
switch(a)
{
case 0:
printf("a>0");
case 1:
{
printf("a>10 && a<100");
break;
}
default:
printf("a>10 && a<100");
}
反汇编的switch(a)
00411A66 mov eax,dword ptr [a]
00411A69 mov dword ptr [ebp-0E8h],eax
00411A6F cmp dword ptr [ebp-0E8h],0 // case 0:
00411A76 je 411A83h
00411A78 cmp dword ptr [ebp-0E8h],1 // case 1:
00411A7F je 411A90h
00411A81 jmp 411A9Fh // default:
{
…
显然是比较a 是否是0、1这两个数字。汇编指令先把a移动到[ebp-0E8h]这个地址,然后再比较,这是调试版本编译的特点。可能是为了防止直接操作堆栈而导致堆栈破坏?最后一条直接跳转到default处。当然,如果没有default,就会跳到swtich{}之外。
从这里我们可以发现:switch语句里,完成“比较判断”的指令会与“case”指令的两部分,在汇编中,不是按照C语句逐句翻译的,而是分开为两个指令模块来实现的!
case 0:
printf("a>0");
00411A83 push offset string "a>0" (4240DCh)
00411A88 call @ILT+1300(_printf) (411519h)
00411A8D add esp,4
case 1:
{
printf("a>10 && a<100");
00411A90 push offset string "a>10 && a<100" (424288h)
00411A95 call @ILT+1300(_printf) (411519h)
00411A9A add esp,4
break;
00411A9D jmp myfunction+8Ch (411AACh)
}
default:
printf("a>10 && a<100");
00411A9F push offset string "a>10 && c<100" (424288h)
00411AA4 call @ILT+1300(_printf) (411519h)
00411AA9 add esp,4
}
至于case 和 default分支中,如果有break,则会增加一个无条件跳转汇编指令。若没有break,则就没有任何循环控制代码。
小结:如果在反汇编代码中发现连续多个“比较cmp”和“相等跳转je”就会让人联想到“switch”语句了!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
学习了 比较容易看懂 (*^__^*) 嘻嘻……
|
能力值:
(RANK:570 )
|
-
-
10 楼
支持一下,不过已经有不少人做过这样的工作了,当然我不是不鼓励这样的文章,而是希望能以不同的视角或者不同的方式表达,方便不同性格的人学习才是重要的
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我来看看笨笨.....
支持一下笨笨的逆向分析教程
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
貌似在某本书上看到过
|
能力值:
( LV9,RANK:250 )
|
-
-
13 楼
这篇文章我喜欢 简约而又不简单 希望楼主今后多发几篇这样的分析
|
能力值:
( LV9,RANK:250 )
|
-
-
14 楼
有了这个原理 就可以IDA 的 F5了 O(∩_∩)O~
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
很踏实的学习
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
学习了,受教
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
谢谢楼主发布分享
TC
|
能力值:
( LV3,RANK:20 )
|
-
-
18 楼
@@:
inc eax
cmp dword pr [eax],12345678h
jne @B
很简单啊
for(;i!=0x12345678;i++)
差不多就是这一句
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
while (dword ptr [eax]!=12345678h)
inc eax
.endw
masm的高级语法
|
能力值:
( LV3,RANK:20 )
|
-
-
20 楼
invoke == push push..... +call
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
太基础了没啥好夸的 我太菜了
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
不错,我也来学习了啊
|
能力值:
( LV3,RANK:20 )
|
-
-
23 楼
汇编语言艺术里面有类似的分析。呵呵
|
能力值:
( LV13,RANK:530 )
|
-
-
24 楼
人肉F5诞生了。
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
收藏一下今天太晚了,明天再看
|
|
|