x32dbg/x64dbg逆向之反汇编do-while分析
2026/9/9 15:31:33 网站建设 项目流程

x32dbg/x64dbg逆向之反汇编do-while分析
1)反汇编do-while分析
do-while语句在开发中同样十分常见,它和while区别主要先执行循环体,再判断条件是否继续循环的场景。相比while,do-while至少会先执行一次循环体,因此在一些特定逻辑处理中非常实用。编译后映射到汇编代码里具体是什么样子,咱们也通过x32dbg/x64dbg一步步调试也看下哦!


2)C语言案例代码,单个do-while
咱们在学习逆向分析的同时,同步梳理C和C++基础知识点,一正一反(正向开发,逆向分析)为后续深耕底层技术打好基础哦。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
int n;
int i = 1;
int sum = 0;

printf("Please input an number: ");
scanf("%d", &n);

do
{
sum = sum + i;
i = i + 1;
} while (i <= n);

printf("Sum from 1 to %d = %d\n", n, sum);
return 0;
}

4)C语言案例代码,多个do-while
咱们在学习逆向分析的同时,同步梳理C和C++基础知识点,一正一反(正向开发,逆向分析)为后续深耕底层技术打好基础哦。
#include <stdio.h>

int main()
{
int x = 1;

// Single do-while
do
{
printf("%d ", x);
x++;
} while (x <= 5);

printf("\n");
printf("\n");
x = 0;

// First do-while layer
do
{
int y = 1;
printf("| ");
// Second do-while layer
do
{
int z = 1;
// Third do-while layer
do
{
printf("* ");
z++;
} while (z <= 3);
printf("| ");
y++;
} while (y <= 2);
printf("\n");
x++;
} while (x <= 2);

return 0;
}


5)反向分析指针单个do-while
之前咱们把单个while和多个while分析外以后再来看,会发现底层几乎一样,但是一旦嵌套多了咱们会发现不同的地方哦,所以咱们以后尽量从最底层入手这样理解任何东西就相当easy哈哈哈
x64Debug版本
00007FF60D851930 | 40:55 | push rbp | FileName.cpp:5
00007FF60D851932 | 57 | push rdi |
00007FF60D851933 | 48:81EC 48010000 | sub rsp,148 |
00007FF60D85193A | 48:8D6C24 20 | lea rbp,qword ptr ss:[rsp+20] |
00007FF60D85193F | 48:8D7C24 20 | lea rdi,qword ptr ss:[rsp+20] |
00007FF60D851944 | B9 1A000000 | mov ecx,1A |
00007FF60D851949 | B8 CCCCCCCC | mov eax,CCCCCCCC |
00007FF60D85194E | F3:AB | rep stosd |
00007FF60D851950 | 48:8B05 E9B60000 | mov rax,qword ptr ds:[<__security_cooki | rax:__enc$textbss$end+5A
00007FF60D851957 | 48:33C5 | xor rax,rbp | rax:__enc$textbss$end+5A
00007FF60D85195A | 48:8985 18010000 | mov qword ptr ss:[rbp+118],rax | rax:__enc$textbss$end+5A
00007FF60D851961 | 48:8D0D A0060100 | lea rcx,qword ptr ds:[<__14F49BB1_FileN | FileName.cpp:15732480
00007FF60D851968 | E8 3FFAFFFF | call project1.7FF60D8513AC |
00007FF60D85196D | 90 | nop | 上面全是debug特有的就不多少了,
00007FF60D85196E | C745 24 01000000 | mov dword ptr ss:[rbp+24],1 | FileName.cpp:7,开始赋值变量,int i = 1;
00007FF60D851975 | C745 44 00000000 | mov dword ptr ss:[rbp+44],0 | FileName.cpp:8,int sum = 0;
00007FF60D85197C | 48:8D0D A5930000 | lea rcx,qword ptr ds:[<"Please input an | FileName.cpp:10, 00007FF60D85AD28:"Please input an number: ",print参数
00007FF60D851983 | E8 D0F8FFFF | call project1.7FF60D851258 | printf
00007FF60D851988 | 90 | nop |
00007FF60D851989 | 48:8D55 04 | lea rdx,qword ptr ss:[rbp+4] | FileName.cpp:11, rdx:__enc$textbss$end+5A,int n,作为scanf存储数字的变量地址(第二个参数rdx)
00007FF60D85198D | 48:8D0D B4930000 | lea rcx,qword ptr ds:[<"%d"...>] | 00007FF60D85AD48:"%d",第一个参数
00007FF60D851994 | E8 D3F8FFFF | call project1.7FF60D85126C | scanf
00007FF60D851999 | 90 | nop |
00007FF60D85199A | 8B45 24 | mov eax,dword ptr ss:[rbp+24] | FileName.cpp:15,获取局部变量i
00007FF60D85199D | 8B4D 44 | mov ecx,dword ptr ss:[rbp+44] | 获取局部变量sum
00007FF60D8519A0 | 03C8 | add ecx,eax | sum = sum + i;
00007FF60D8519A2 | 8BC1 | mov eax,ecx |
00007FF60D8519A4 | 8945 44 | mov dword ptr ss:[rbp+44],eax | 把结果赋值给sum
00007FF60D8519A7 | 8B45 24 | mov eax,dword ptr ss:[rbp+24] | FileName.cpp:16,同理,获取局部变量i
00007FF60D8519AA | FFC0 | inc eax | i = i + 1;
00007FF60D8519AC | 8945 24 | mov dword ptr ss:[rbp+24],eax | 把结果赋值给i
00007FF60D8519AF | 8B45 04 | mov eax,dword ptr ss:[rbp+4] | FileName.cpp:17,获取局部变量i进行比较
00007FF60D8519B2 | 3945 24 | cmp dword ptr ss:[rbp+24],eax | while (i <= n);
00007FF60D8519B5 | 7E E3 | jle project1.7FF60D85199A | 如果小于等于继续执行循环语句内容
00007FF60D8519B7 | 44:8B45 44 | mov r8d,dword ptr ss:[rbp+44] | FileName.cpp:19获取sum
00007FF60D8519BB | 8B55 04 | mov edx,dword ptr ss:[rbp+4] | 获取n
00007FF60D8519BE | 48:8D0D 8B930000 | lea rcx,qword ptr ds:[<"Sum from 1 to % | 00007FF60D85AD50:"Sum from 1 to %d = %d\n"
00007FF60D8519C5 | E8 8EF8FFFF | call project1.7FF60D851258 | printf
00007FF60D8519CA | 90 | nop |
00007FF60D8519CB | 33C0 | xor eax,eax | FileName.cpp:20
00007FF60D8519CD | 8BF8 | mov edi,eax | FileName.cpp:21
00007FF60D8519CF | 48:8D4D E0 | lea rcx,qword ptr ss:[rbp-20] |
00007FF60D8519D3 | 48:8D15 26930000 | lea rdx,qword ptr ds:[7FF60D85AD00] | rdx:__enc$textbss$end+5A
00007FF60D8519DA | E8 8AF6FFFF | call project1.7FF60D851069 |
00007FF60D8519DF | 8BC7 | mov eax,edi |
00007FF60D8519E1 | 48:8B8D 18010000 | mov rcx,qword ptr ss:[rbp+118] |

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询