news 2026/4/18 13:55:54

do while语句逆向特征分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
do while语句逆向特征分析

文章目录

    • 一、先把与 `do…while` 直接相关的指令拎出来
    • 二、do-while 在汇编里的“控制流特征”
      • 1. 典型的后测试循环(post-test loop)
    • 三、与 for / while 的对比(帮助你区分三种循环)
      • 1. for 循环
      • 2. while 循环
      • 3. do-while 循环(本例)
    • 四、从逆向角度总结 do-while 的“识别特征”

一、先把与do…while直接相关的指令拎出来

voidfunc3(){intindex=0;do{printf("%d",index);index++;}while(index<10);return;}

忽略函数前后的调试/栈框架代码,与 C 代码中do { ... } while (index < 10);对应的关键汇编是:

; 变量初始化:int index = 0; 00A31C16 mov dword ptr [index],0 ; 循环体起始(do 块开始) 00A31C1D mov eax,dword ptr [index] 00A31C20 push eax 00A31C21 push offset string "%d" 00A31C26 call _printf 00A31C2B add esp,8 ; index++; 00A31C2E mov eax,dword ptr [index] 00A31C31 add eax,1 00A31C34 mov dword ptr [index],eax ; while (index < 10); 00A31C37 cmp dword ptr [index],0Ah 00A31C3B jl 0A31C1Dh ; 若 index < 10,跳回到循环体开头

对应的 C 结构就是:

intindex=0;do{printf("%d",index);index++;}while(index<10);

二、do-while 在汇编里的“控制流特征”

1. 典型的后测试循环(post-test loop)

do-while最大的特点:先执行一次循环体,再检查条件。在这段汇编里体现为:

  1. 初始化后,直接进入循环体

    mov [index],0 ; 初始化 ; 紧接着就是 printf 和 index++,没有任何 cmp/jcc/jmp
  2. 循环体执行完,才做条件判断

    ... printf ... ... index++ ... cmp [index], 0Ah ; 在体后面做比较 jl 0A31C1Dh ; 条件满足才跳回体开头
  3. 条件为真时跳回“体开头”
    jl 0A31C1Dh的目标正好是printf那条指令所在地址,也就是循环体第一条指令,说明这是:

    Body: ... Cond: cmp ... jl Body

    而不是 while/for 那种跳回“条件检查块”或“自增块”。

总结成控制流伪代码:

init: index = 0 body: ; 0A31C1D printf("%d", index); index++; cond: if (index < 10) goto body; end: return;

关键识别点

条件判断(cmp + 条件跳转)在循环体之后,条件跳转的目标是循环体开始位置,这就是标准的 do-while 控制流。


三、与 for / while 的对比(帮助你区分三种循环)

结合你前两个问题中给的 for 和 while 例子,可以这样对比三种典型模式(均为 MSVC Debug 未优化):

1. for 循环

大致结构(你之前的 func 示例):

init: index = 0 jmp cond inc: index++ cond: if (index >= 10) goto end body: ... goto inc

特征

  • 初始化后立刻有一个jmp cond
  • 循环体后跳到“inc 块”而不是直接到条件

2. while 循环

你给的while (index < 10)示例结构:

init: index = 0 cond: if (index >= 10) goto end body: ... index++; goto cond

特征

  • 初始化后马上就是cmp+ 条件跳转
  • 第一次执行前就检查条件,可能 0 次执行

3. do-while 循环(本例)

init: index = 0 body: ... ; printf ... ; index++; cond: if (index < 10) goto body end: return

特征

  • 初始化后直接掉进循环体,没有前置条件检查
  • 循环体至少执行一次
  • 条件判断在体尾,条件跳转回到体开头

四、从逆向角度总结 do-while 的“识别特征”

整理一下,今后你看到汇编时,如果符合下面这些点,就可以判断为 do-while:

  1. 初始化 → 直接进入一块明显可重复的代码块(循环体)

    • 初始化栈变量(如[ebp-?][index])之后,
      中间没有cmp/jcc/jmp型的条件判断,而是直接执行一串逻辑(往往包含函数调用、运算等)。
  2. 循环体末尾有条件比较和条件跳转

    • 在循环体尾部看到:
      cmp [某变量], 常量 jX label
    • 这个label指向前面那块“明显可重复”的代码块的开头。
  3. 条件跳转目标是“体开头”,不是“条件块”或“自增块”

    • 对比:
      • while:jmp通常回到cmp那里(条件块);
      • for:jmp通常回到“自增块”,然后再到条件块;
      • do-while:jX直接回到循环体开头
  4. 循环变量的使用模式

    • 某个变量(本例中的[index]):
      • 先被初始化;
      • 在循环体内被使用、修改(index++);
      • 在体末尾与常量比较,根据结果决定是否跳回体开头。

符合这几个特征,就可以很有把握地在逆向中判断:这是一个do { ... } while (cond);结构,而不是whilefor

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 9:20:02

零基础入门:30分钟用Vue-Pure-Admin搭建管理系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的Vue-Pure-Admin入门教程项目。要求&#xff1a;1.分步骤实现一个简单的文章管理系统 2.每个步骤提供详细说明和代码示例 3.包含常见问题解答 4.提供可视化操作指…

作者头像 李华
网站建设 2026/4/18 8:49:12

ResNet18模型体验省钱攻略:比买显卡省90%成本

ResNet18模型体验省钱攻略&#xff1a;比买显卡省90%成本 1. 为什么选择ResNet18&#xff1f; ResNet18是计算机视觉领域的经典轻量级模型&#xff0c;它在2015年由微软研究院提出&#xff0c;通过引入"残差连接"解决了深层网络训练难题。这个只有18层深的网络&…

作者头像 李华
网站建设 2026/4/18 12:59:23

如何用AI解决‘内容请求失败‘错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个工具&#xff0c;能够自动检测网页或API请求失败的原因&#xff0c;并提供修复建议。工具应支持常见的HTTP错误代码分析&#xff0c;如404、500等&#xff0c;并能根据错误…

作者头像 李华
网站建设 2026/4/18 8:56:03

ResNet18模型压缩前后对比:云端GPU快速AB测试,省时80%

ResNet18模型压缩前后对比&#xff1a;云端GPU快速AB测试&#xff0c;省时80% 引言 作为一名移动端开发工程师&#xff0c;你是否遇到过这样的困境&#xff1a;需要在服务器上对比原始ResNet18模型和量化后模型的精度损失&#xff0c;但公司内部服务器申请流程复杂耗时&#…

作者头像 李华
网站建设 2026/4/18 8:51:53

传统3小时 vs AI 3分钟:RabbitMQ安装效率革命

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建对比测试脚本&#xff1a;1. 传统分步安装手册 2. AI生成的自动化脚本 3. 包含时间统计和正确性验证逻辑。输出Markdown格式的对比报告&#xff0c;突出关键效率指标差异。点击…

作者头像 李华
网站建设 2026/4/18 8:37:40

传统vsAI:SYNAPTICS.EXE问题处理效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个SYNAPTICS.EXE处理效率对比工具&#xff0c;功能&#xff1a;1.模拟传统手动修复流程&#xff1b;2.展示AI自动化修复流程&#xff1b;3.生成时间/成功率对比报告&#xf…

作者头像 李华