2026/4/2 4:04:36
网站建设
项目流程
网站搭建教程零基础,网站建设的流程视频,菲律宾,凡科网站制作教程文章目录一、对应的 C 代码与关键汇编二、while 循环的典型逆向特征1. 控制流模式#xff1a;前测试循环#xff08;pre-test loop#xff09;2. 循环变量的使用特征3. 与 for 循环的区别特征#xff08;和你前一个示例对比#xff09;三、结合本例的一句话总结一、对应的…文章目录一、对应的 C 代码与关键汇编二、while 循环的典型逆向特征1. 控制流模式前测试循环pre-test loop2. 循环变量的使用特征3. 与 for 循环的区别特征和你前一个示例对比三、结合本例的一句话总结一、对应的 C 代码与关键汇编C 代码voidfunc2(){intindex0;while(index10){printf(%d,index);index;}return;}与while (index 10)直接对应的汇编核心部分是; 变量初始化 00071B86 mov dword ptr [index],0 ; 条件判断index 10 ? 00071B8D cmp dword ptr [index],0Ah 00071B91 jge __$EncStackInitStart43h (071BAFh) ; index 10 跳出循环 ; 循环体printf(%d, index); 00071B93 mov eax,dword ptr [index] 00071B96 push eax 00071B97 push offset string %d (07AC04h) 00071B9C call _printf (071541h) 00071BA1 add esp,8 ; index; 00071BA4 mov eax,dword ptr [index] 00071BA7 add eax,1 00071BAA mov dword ptr [index],eax ; 跳回条件判断 00071BAD jmp __$EncStackInitStart21h (071B8Dh)二、while 循环的典型逆向特征结合这段代码可以概括while (条件)在 MSVC Debug 未优化下的典型汇编特征。1. 控制流模式前测试循环pre-test loop结构非常标准index 0; ; 初始化 cond: if (index 10) goto end; ; 条件判断不满足条件就退出 ... 循环体 ... index; ; 在循环体内部更新 goto cond; ; 回到条件处重新判断 end: ... 循环后代码 ...在汇编中对应为初始化在前、紧接着就是条件判断mov [index], 0 ; 初始化 cmp [index], 0Ah ; 与 10 比较 jge end ; index 10 跳出特征初始化之后没有先jmp到别处而是直接cmp 条件跳转说明第一次进入循环前就做判断——这是典型的while/for“前测试型”循环而不是do...while那种后测试。条件跳转直接是“跳出循环”的出口cmp [index], 0Ah jge end ; 满足退出条件时直接跳出到循环后jge大于等于配合前面的cmp逻辑上就是index 10时才进入循环体。在逆向时看到条件跳转目标在循环之后而“顺序执行”落到循环体内就是 while / for 常见模式。循环体内修改循环变量体尾有回跳到条件判断; 循环体... printf(...); ; index mov eax, [index] add eax, 1 mov [index], eax ; 回到条件判断 jmp cond核心特征更新循环变量自增、自减等在循环体内。循环体最后一个有效控制流指令是jmp cond跳回条件检查的cmp那里。2. 循环变量的使用特征以index为例这里编译器把它放在栈上的某个[ebp-偏移]你这份反汇编被符号化成[index]初始化mov dword ptr [index], 0参与比较条件判断cmp dword ptr [index], 0Ah在循环体里作为函数参数使用mov eax, dword ptr [index] push eax ; 传给 printf在循环体里被线性更新自增mov eax, dword ptr [index] add eax, 1 mov dword ptr [index], eax在逆向时如果看到一个栈变量某个固定偏移具有以下模式先被赋一个初值紧接着用来和某个常量比较以决定是否跳出某段重复执行的代码在这段重复执行的代码内部被简单线性修改加减 1、加减常数代码尾部有跳转回比较位置那么这个变量就是典型的循环计数器这段结构就是一个循环。3. 与 for 循环的区别特征和你前一个示例对比你前一个示例是for (int index 0; index 10; index)其 Debug 版汇编大致是init: index 0 jmp cond inc: index cond: cmp index, 10 jge end body: ... jmp inc而现在的while (index 10) { ... index; }的形态是init: index 0 cond: cmp index, 10 jge end body: ... index jmp cond对比要点特征点for 循环上一个例子while 循环本例初始化后是否立刻 jmp是jmp cond否初始化后直接落到cmp条件判断递增代码位置单独一个inc块循环体之后跳回这里在循环体内部、条件判断之后最后一个回跳目标回到inc再走到cond直接回到cond常见 C 形式for (init; cond; inc) { body }init; while (cond) { body; inc; }因此在逆向时看到init 之后立刻一个无条件跳到后面某处再看到那处后上方有更新变量的块则更像for看到init 后直接 cmp / jcc 做条件判断更新变量在循环体内部体尾直接 jmp 回 cmp则更像while或for写成 while 形式。三、结合本例的一句话总结这段while (index 10)在汇编中的逆向特征可以一句话概括为使用栈上的局部变量[index]作为计数器先mov [index],0初始化然后紧接着在同一条执行路径上用cmp [index],0Ah / jge end做前置条件判断若未跳出则执行循环体中的printf和index最后通过jmp返回到条件判断位置如此形成init → cond(cmpjcc) → body(含 index ) → jmp cond的典型前测试 while 循环控制流结构。这种“初始化后直接条件判断、循环体结尾跳回条件、循环变量在体内更新”的组合就是识别 while 循环的主要逆向特征。