环境:
Win7 32位虚拟机
Visual C++ 6.0
工具:
IDA Pro32
OllyDbg
LordPE
UltraEdit
实验步骤:
编写C程序:
#include <stdio.h>
#include <string.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
authenticated=strcmp(password,PASSWORD);
return authenticated;
}
main()
{
int valid_flag=0;
char password[1024];
while(1){
printf("please inpute password: ");
scanf("%s",password);
valid_flag=verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("congratulations!! You have passed the varification!");
break;
}
}
}
程序主要实现功能为:输入“1234567”显示密码正确,输入其他显示密码错误
编译并生成.exe文档
IDA调试
将.exe文件拖入IDA查看,查看函数流程图,找到跳转分支处
鼠标点击程序分支点,空格切换到汇编指令界面
可以看到这条指令位于PE文件的.text节,并且IDA已经自动将该指令的地址换算成运行时的内存地址VA:0x004010D5
OllyDbg调试
Ctrl+G跳转到之前的虚拟地址:0x004010D5
F2下断点,F9运行程序,提示输入密码时输入一个错误密码,可以看到下方预执行区提示:“Jump os not taken”
密码验证函数的返回值存储在[lacal.1]中,if()语句通过以下代码实现
将指令中的je修改位jne,程序逻辑就会变成:输入错误密码被确认
双击je指令修改为jne,点击“Assemble”按钮写入,此时下方预执行变为taken
执行结果变为正确
LordPE查看节点信息
打开LordPE后点击PE编辑器,查看区段
前面已知VA=0x004010D5
换算文件偏移地址=虚拟内存地址(VA)-装载地址-节偏移=0x004010D5-0x00400000-(0x00001000-0x00001000)=0x000010D5。也就是说,这条指令在PE文件中位于距离文件开始出10D5字节的地方
UltraEdit修改可执行文件
安装UltraEdit
网址:看雪搜索即可
破解方法参考:http://www.downxia.com/downinfo/258802.html
使用UltraEdit打开.exe文件,ctrl+G直接跳转到10D5处,将74修改为75,如下
保存后运行,此时输入“1234567”显示密码错误,输入其他显示密码正确
实验完成
😃
总结
主要学习了几个基本软件的使用方法,更深刻理解了虚拟内存地址和文件偏移地址的差别。
好像大半天都在下镜像,装虚拟机,配环境下软件。不过终于搞出来了,感觉自己棒棒,加油!后面的实验也要好好完成!
😐