❝
以下是不同类型的C语言程序,每个程序都包含破解后的确认机制。请注意,这些程序仅用于学习和研究目的,请勿用于非法用途。通过反汇编这些程序,可以练习如何识别和破解不同类型的验证逻辑。
❞
为方便练习可使用生成便于反汇编的C语言程序的配置,但工作项目不推荐以下设置:
Visual Studio配置:
-
创建新的C++项目:
-
打开Visual Studio,选择“创建新项目”。
-
选择“控制台应用程序”模板,点击“下一步”。
-
输入项目名称和位置,点击“创建”。
配置项目属性:
-
右键点击项目名称,选择“属性”。
-
在“配置属性”下,选择“C/C++” > “优化”,将“优化”设置为“禁用(/Od)”。
-
在“配置属性”下,选择“C/C++” > “代码生成”,将“运行时库”设置为“多线程调试(/MTd)”。
-
在“配置属性”下,选择“链接器” > “调试”,将“生成调试信息”设置为“否”。
-
在“配置属性”下,选择“链接器” > “高级”,将“映像基址”设置为“默认”。
-
在“配置属性”下,选择“链接器” > “系统”,将“子系统”设置为“控制台(/SUBSYSTEM:CONSOLE)”。
-
关闭所有安全编译选项: 在项目属性中,找到 "C/C++" -> "代码生成",将其设置为“禁用安全检查(/GS-)”。
生成可执行文件:
-
确保配置完成后,点击“生成”菜单,选择“生成解决方案”来生成可执行文件。
Linux配置要求:
-
安装必要的工具:
-
确保你已经安装了GCC(GNU Compiler Collection)和GDB(GNU Debugger)。
-
在终端中运行以下命令来安装:
bash
sudo apt-get update
sudo apt-get install build-essential gdb
编译选项:
-
使用g选项生成调试信息。
-
使用O0选项禁用优化。
-
示例编译命令:
bash
gcc -g -O0 -o my_program my_program.c
几款常用的反汇编工具:
1. IDA Pro (Interactive Disassembler Professional):
-
功能强大: 业界领先的反汇编和调试工具,支持多种处理器架构和文件格式,拥有强大的分析功能,包括函数识别、代码交叉引用、数据流分析等。
-
插件丰富: 拥有庞大的插件生态系统,可以扩展其功能,例如支持新的处理器架构、文件格式、分析算法等。
-
收费软件: 价格昂贵,但功能强大,适合专业逆向工程师使用。
2. Ghidra:
-
免费开源: 由美国国家安全局 (NSA) 开发并开源,功能强大且完全免费。
-
支持多种架构: 支持多种处理器架构和文件格式,并提供类似 IDA Pro 的分析功能。
-
活跃的社区: 拥有活跃的社区支持,不断有新的功能和插件被开发出来。
3. Binary Ninja:
-
易用性强: 界面友好,操作直观,易于上手。
-
分析能力出色: 提供高质量的反汇编代码、控制流图、数据流分析等功能。
-
插件支持: 支持 Python 插件,可以扩展其功能。
-
收费软件: 价格相对 IDA Pro 便宜,适合个人开发者和安全研究人员使用。
4. Radare2:
-
命令行工具: 功能强大的命令行工具集,适合熟悉命令行操作的用户。
-
高度可定制: 可以通过配置文件和插件进行高度定制,满足各种需求。
-
开源免费: 完全开源免费,适合预算有限的用户。
5. hopper:
-
macOS 平台: 专为 macOS 平台设计的反汇编工具,界面美观,操作便捷。
-
功能全面: 支持多种处理器架构和文件格式,提供反汇编、调试、分析等功能。
-
收费软件: 价格适中,适合 macOS 平台的开发者和安全研究人员使用。
学习反汇编的资源推荐
书籍
-
《Reverse Engineering for Beginners》 by Dennis Yurichev: 这本免费的在线书籍是学习反汇编的绝佳入门资源。它涵盖了广泛的主题,从基础知识到高级技术,并包含许多示例和练习。(https://beginners.re/)
-
《Practical Reverse Engineering》 by Bruce Dang, Alexandre Gazet, Elias Bachaalany: 这本书深入探讨了反向工程的艺术,涵盖了反汇编、调试和代码分析技术。
-
《The IDA Pro Book》 by Chris Eagle: 这本书是使用 IDA Pro(一种流行的反汇编程序)的全面指南,涵盖了从基本用法到高级脚本的所有内容。
-
《Reversing: Secrets of Reverse Engineering》 by Eldad Eilam: 这本书涵盖了广泛的反向工程主题,包括反汇编、调试和代码分析。
网站
-
Lena's Tutorials: Lena's Tutorials 提供了一系列关于各种逆向工程主题的优秀教程,包括反汇编、调试和漏洞利用开发。(https://www.youtube.com/channel/UCdqh8ZdG_2Fle-m2Vgmthnw)
-
OpenSecurityTraining2: OpenSecurityTraining2 提供了关于各种安全主题的免费高质量培训课程,包括逆向工程和漏洞利用开发。(https://www.opensecuritytraining.info/)
在线反汇编网站
-
Godbolt Compiler Explorer: Godbolt Compiler Explorer 是一个在线工具,允许您查看 C/C++ 代码的汇编输出。它支持各种编译器和架构,是学习汇编语言和理解编译器如何生成代码的绝佳资源。(https://godbolt.org/)
-
Online Disassembler: Online Disassembler 是一个免费的在线工具,允许您反汇编各种文件格式,包括 Windows 可执行文件、Linux ELF 文件和 Java 类文件。(https://onlinedisassembler.com/)
建议
-
从基础开始: 在深入研究反汇编之前,务必掌握汇编语言的基础知识。
-
练习,练习,再练习: 反汇编是一项需要大量实践才能掌握的技能。尝试反汇编不同的程序,并了解它们的代码是如何工作的。
-
虚心完成 ,合法模拟过程,总结经验,寻找关键跳和关键词
💡以下程序在vs2022社区版中经过测试,Linux中没有测试,如有问题请及时私信,不胜感激!
主要模拟破解思路和过程,请忽略明文问题。 💩
1. 简单的密码验证程序
题目:要求用户输入密码,如果密码正确则显示“密码正确,访问授予”,否则显示“密码错误,访问拒绝”。
#include <stdio.h>
#include <string.h>
#include <iostream>
int main() {
char password[30];
printf("Enter password: ");
scanf_s("%s", password,sizeof(password));
if (strcmp(password, "hackerchi.top-secret123") == 0) {
printf("Password correct, access granted.\n");
}
else {
printf("Password incorrect, access denied.\n");
}
std::cin.get(); // 暂停程序执行
return 0;
}
2. 基于时间的验证码
题目:要求用户输入当前时间的验证码(格式HHMM),如果正确则显示“验证码正确,访问授予”,否则显示“验证码错误,访问拒绝”。
示例:
-
上午 10:30 用 "HHMM" 格式表示为 "1030"
-
下午 2:05 用 "HHMM" 格式表示为 "1405"
-
晚上 8:45 用 "HHMM" 格式表示为 "2045"
#include <stdio.h>
#include <string.h>
#include <ctime>
#include <iostream>
int main() {
time_t t;
struct tm tm_info; // 不再是指针
char buffer[7]; // 增加缓冲区大小
time(&t);
localtime_s(&tm_info, &t); // 使用 localtime_s
strftime(buffer, sizeof(buffer), "%H%M", &tm_info); // 使用 sizeof 获取缓冲区大小
printf("Enter current time code (format HHMM): ");
char input[7]; // 增加缓冲区大小
scanf_s("%s", input, sizeof(input));
if (strcmp(buffer, input) == 0) {
printf("Code correct, access granted.n");
}
else {
printf("Code incorrect, access denied.n");
}
std::cin.get(); // 暂停程序执行
return 0;
}
3. 用户名和密码验证
题目:要求用户输入用户名和密码,如果用户名和密码正确则显示“登录成功,访问授予”,否则显示“用户名或密码错误,访问拒绝”。
#include <stdio.h>
#include <string.h>
#include <iostream>
int main() {
char username[30];
char password[30];
printf("Enter username: ");
scanf_s("%s", username, sizeof(username));
printf("Enter password: ");
scanf_s("%s", password, sizeof(password));
if (strcmp(username, "admin") == 0 && strcmp(password, "hackerchi.top_admin123") == 0) {
printf("Login successful, access granted.\n");
}
else {
printf("Username or password incorrect, access denied.\n");
}
std::cin.get(); // 暂停程序执行
return 0;
}
4. 简单的数学题验证
题目:要求用户计算3 + 4的结果,如果答案正确则显示“答案正确,访问授予”,否则显示“答案错误,访问拒绝”。
#include <stdio.h>
#include <iostream>
int main() {
int answer;
printf("Calculate 3 + 4: ");
scanf_s("%d", answer,sizeof(answer));
if (answer == 7) {
printf("Answer correct, access granted.\n");
}
else {
printf("Answer incorrect, access denied.\n");
}
std::cin.get(); // 暂停程序执行
return 0;
}
5. 基于文件内容的验证
题目:要求用户输入一个文件名,读取文件内容并验证,如果文件内容正确则显示“文件内容正确,访问授予”,否则显示“文件内容错误,访问拒绝”。
#include <stdio.h>
#include <string.h>
#include <iostream>
int main() {
FILE* file;
errno_t err; // 用于检查 fopen_s 返回值
char content[100];
err = fopen_s(&file, "key.txt", "r");
if (err != 0) {
printf("Unable to open file.n");
return 1;
}
fgets(content, 100, file);
fclose(file);
if (strcmp(content, "valid_keyn") == 0) {
printf("File content correct, access granted.n");
}
else {
printf("File content incorrect, access denied.n");
}
std::cin.get(); // 暂停程序执行
return 0;
}
6. 简单加密验证
题目:要求用户输入加密后的密码,如果密码正确则显示“密码正确,访问授予”,否则显示“密码错误,访问拒绝”。
#include <stdio.h>
#include <string.h>
void encrypt(char *str) {
while (*str) {
*str = *str + 1;
str++;
}
}
int main() {
char input[20];
printf("Enter encrypted password: ");
scanf_s("%s", input, sizeof(input));
encrypt(input);
if (strcmp(input, "hackerchi-tfdsfu124") == 0) {
printf("Password correct, access granted.\n");
} else {
printf("Password incorrect, access denied.\n");
}
return 0;
}
原文始发于微信公众号(黑客驰):【逆向 - 从入门到放弃01】- 前言与破解程序练习7个
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论