这次练习的程序,功能也是非常简单。简单到不知道是干什么的! 没有注册码注册或破解,就学习下反汇编逆向下它的软件功能代码吧。同样我们打开 OllyDBG将要分析的软件拖入后,F9运行。点击调试器工具栏上的M按钮,找到程序的内存TEXT段,按下回车。字符串中有点击按钮出现的提示字符,双击进入反汇编窗口。向代码开头下断点(F2)。F9运行后断下来,F8走一遍了解下软件流程。看到有很多的盘符:C-P。一样的代码:00401219 57 push edi0040121A 68 9C304000 push Cosh_1.0040309C ; C:\0040121F 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]00401222 E8 79040000 call <jmp.&MFC42.#537>
这里调用的的API是序号调用的,也看不出什么东西。直接F7进入看看反汇编代码,就能知道它是把盘符读取下长度,然后复制一份保存起来。C-P都是一样的操作。直接在读取P的位置下断点,F9跳过。00401346 . FF75 E8 push dword ptr ss:[ebp-0x18] ; /RootPathName = "C:\"00401349 . FF15 04204000 call dword ptr ds:[<&KERNEL32.GetDriveTy>; \GetDriveTypeA
GetDriveTypeA:确定磁盘驱动器是可移动的、固定的、CD-ROM、RAM 磁盘还是网络驱动器。
可能的枚举值包括:
DRIVE_UNKNOWN(0,无法确定类型)
DRIVE_NO_ROOT_DIR(1,根路径无效)
DRIVE_REMOVABLE(2,可移动磁盘如U盘)
DRIVE_FIXED(3,固定磁盘如硬盘)
DRIVE_REMOTE(4,网络驱动器)
DRIVE_CDROM(5,光驱)
DRIVE_RAMDISK(6,RAM磁盘)
执行上面汇编后,EAX值为3
说明C盘是一个固定磁盘。这里在循环判断所有的盘符。
0040134F . 83F8 03 cmp eax,0x3
就是说得到的盘符只要不是3的就往下执行。
0040134F . 83F8 03 cmp eax,0x300401352 . 74 3E je short Cosh_1.0040139200401354 . 8D45 E8 lea eax,dword ptr ss:[ebp-0x18]00401357 . 68 58304000 push Cosh_1.00403058 ; CD_CHECK.DAT0040135C . 50 push eax0040135D . 8D45 E0 lea eax,dword ptr ss:[ebp-0x20]00401360 . 50 push eax00401361 . E8 22030000 call <jmp.&MFC42.#924>00401366 . 8B00 mov eax,dword ptr ds:[eax]00401368 . 53 push ebx ; /hTemplateFile = NULL00401369 . 53 push ebx ; |Attributes = 00040136A . 53 push ebx ; |Mode = 0x00040136B . 53 push ebx ; |pSecurity = NULL0040136C . 6A 01 push 0x1 ; |ShareMode = FILE_SHARE_READ0040136E . 68 00000080 push 0x80000000 ; |Access = GENERIC_READ00401373 . 50 push eax ; |FileName = "E:\CD_CHECK.DAT"00401374 . FF15 00204000 call dword ptr ds:[<&KERNEL32.CreateFile>; \CreateFileA
这段代码是获取盘符拼接路径如:E:\CD_CHECK.DAT
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
CreateFileA以读的方式打开这个文件。只要打开成功,就说明文件存在直接完成注册。
软件就是搜索C-P所有的盘符,只要不是固定盘(3),它就会去读一个文件CD_CHECK.DAT,正确读取后完成注册。就是判断文件存不存!
这里我分析遇到个问题,可能自己才疏学浅,除了改执行流程外,按正常流程一直也没注册成功。问题主要是CreateFileA打开失败。反汇编中它的第5个参数传入了个0,不知道什么意思。通过函数介绍传的值只有下面几个:
#define CREATE_NEW 1
#define CREATE_ALWAYS 2
#define OPEN_EXISTING 3
#define OPEN_ALWAYS 4
#define TRUNCATE_EXISTING 5
并没看到0的值。所以我电脑一直没调用成功!还是我系统原因?也可能是我分析的不够透吧。有错的地方欢迎大家留言指出,共同学习。
阅读原文:原文链接
该文章在 2025/12/15 9:48:26 编辑过