一、基本信息
1.1运行情况
当输入错误时,程序退出。
1.2可以看出是汇编程序,并且没有加壳
二、OD打开分析
2.1查看字符串
2.2双击跟进正确字符串,在函数头(一般是push ebp)下断点
2.3首先F9运行到断点位置,然后F8去分析汇编算法
这里我们输入123456方便与程序内部字符串区分
三、破解方法
3.1直接修改JCC指令
目的使跳转执行
1、将cmp eax,0x0 改为cmp eax,0x1
2、将je 改为 jne或者jmp
3、修改标准寄存器将Z 0 改为 Z 1
3.2把输入改成最后比较的部分
L2C-5781Ykpfows-SSD4562-ABEX
四、编写脚本
#include<stdio.h>
#include<windows.h>
//系统内部字符串---》L2C-5781
//系统内部字符串---》4562-ABEX
int main()
{
char szVolumeNameBuf[MAX_PATH] = { 0 };
DWORD dwVolumeSerialNum;
DWORD dwMaxComponentLength;
DWORD dwSysFlags;
char szFileSystemBuf[MAX_PATH] = { 0 };
DWORD dwFileSystemBuf = MAX_PATH;
BOOL bGet = GetVolumeInformationA("C:\\",//这个写调试文件所在的盘
szVolumeNameBuf,
MAX_PATH,
&dwVolumeSerialNum,
&dwMaxComponentLength,
&dwSysFlags,
szFileSystemBuf,
MAX_PATH);
for (int i = 0; i < 4; i++)
{
szVolumeNameBuf[i] += 2;
}
printf("L2C-5781%s4562-ABEX", szVolumeNameBuf);
return 0;
}
五、总结
BOOL GetVolumeInformation(
[IN] LPCTSTR lpRootPathName, // root directory 卷所在的根目录,如:"C:\\", 如果为NULL,表示当前目录
[OUT] LPTSTR lpVolumeNameBuffer, // volume name buffer ,输出参数,存放卷名缓冲区
[IN] DWORD nVolumeNameSize, // length of name buffer,卷名缓冲区长度
[OUT] LPDWORD lpVolumeSerialNumber, // volume serial number, 卷序列号
[OUT] LPDWORD lpMaximumComponentLength, // maximum file name length,最大文件文件名组件长度,随文件系而变化
[OUT] LPDWORD lpFileSystemFlags, // file system options ,文件系统的一些属性,通常为一些宏的组合
[OUT] LPTSTR lpFileSystemNameBuffer, // file system name buffer,说明何种文件系统,例如NTFS, FAT等
[IN] DWORD nFileSystemNameSize // length of file system name buffer,文件系统缓冲区长度
);
lstrcatA 字符串拼接
lstrcmpiA 字符串比较
je 结果为零则跳转(相等时跳转) 标志寄存器ZF=1
六、最重要的
**欢迎大佬批评交流**