先说明下,我是初学逆向,几乎没有编程经验那种,言语不对望各位高手谅解。
失修的医疗软件地址:
http://115.com/file/c29y01d7
问题来源如下:
已有软件注册机,问题是注册机需要插入USB加密狗才能算注册码,怕哪天机器狗挂了,就算不了注册码了。而这软件已经很老了,机器狗坏掉后不知道在哪里还能买到这老旧的软件。所以想把软件破解掉,以免后患。
软件主程序为cimg.exe,包含了软件注册的所有代码,用delphi编写的。
运行后弹出提示框要求注册,绑定机器码的那种。如果点击取消或者输入了错误的注册码,会提示“非法用户”,然后自动关机,所以在逆向时需要用某些工具阻止自动关机。
第一个思路,查找注册成功跟失败的跳转地方。
由于对逆向了解不多,所以特意在论坛逛了一圈,知道大概用dede和od等软件破解。于是先用dede载入cimg.exe,通过一些窗体文字介绍,大概了解了注册按钮对应的代码。用od载入软件,转到注册按钮对应的代码,然后一步步运行调试,可惜啊,由于各方面经验不足,跳来跳去N久头晕了,没找到(或看不出)明显的注册成功或失败跳转的地方,连注册失败的窗口N久都没跳出来,直接运行倒是很快跳出来了。失败。
第二个思路,已知一组机器码(记为机器码A)和对应的注册码,尝试把未知的机器码固定为机器码A。
方向一,找到计算机器码的代码,对其进行修改,让计算结果为机器码A。
方向二,找到比较注册码的代码,修改让其读取出的机器码为机器码A。
从这两个方向出发,忙了半天,大概找到了一些读取机器码的地方,也看到了内存中的机器码,改了很多次都没成功实现目的。唉,要不是对反编译出来的汇编代码的理解不到一点,也不用翻了那么久也没找到相应代码,可惜不知道该去哪里补充这类知识。
又完美的失败了。
第三个思路,已知程序里面有两串字符用于计算注册码的。
尝试对这两串字符的访问下断,找到了一些读取这两段字符的代码,问题是依然看不出是不是比较注册码的。失败。
尝试把字符串清0,结果发现,注册码没有像想象中变成固定值。失败。
第四个思路,来源于思路二,直接对软件运行时的内存进行修改,修改机器码为机器码A(已知注册码的)。
运行软件,打开winhex,打开程序的全部内存,查找机器码,修改为机器码A,重复直到所有机器码修改完。回到软件,发现机器码已变成机器码A,输入机器码A对应的注册码,成功运行。
问题是,重新运行软件,又提示要注册。根据以往经验,知道有内存补丁这回事,于是找到了机器码在内存中的存放地址,成功了制作了内存补丁。通过内存补丁,软件正常使用。
问题是,机器码存放在内存的地址可能会变化的,机器码也可能会变化的,而现有的内存补丁制作工具不能适应这种变化。
于是我想自己制作一个工具,有一个输入框可以获取机器码的(包括自动读取或用户自己输入),然后根据获取的机器码打开软件,在软件内存中查找替换机器码为机器码A,这样根据已知机器码A的注册码就可以正常使用软件了。
问题是,对读取修改内存这方面的编程知识我几乎没了解过。只能以失败告终。
关于本事件的介绍如上,恳请各位高手给予指点。
补充:
一组机器码和对应注册码
000000000000000000(机器码) 0NDGVUP4O9W200(注册码)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!