【转载】去水印方法

Eddy 发布于2009-11-21 22:21:7 分类: 加密解密 已浏览loading 网友评论0条 我要评论

作者:ty1921

在引导小组学习到现在,接触了几款水印保护的软件,知道资料难找,在这写下一些总结,希望对新手朋友们能有好的帮助,同时大牛些有资料的话请补充哈。
传统意义上的水印是指半透明的文字或图片叠加在背景上,下面是一段常见的图片水印的VB编程过程:  

代码:
'1.建立单色mask DC
    maskDC = CreateCompatibleDC(0)  
    maskBitmap = CreateBitmap(S_Width, S_Height, 1, 1, 0)
    SelectObject maskDC, maskBitmap
'2.把前景图的背景色设为透明色   
    SetBkColor foreDC, TransColor  
'3.copy前景图到单色DC得到mask
    BitBlt maskDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCCOPY  
'4.把前景图与mask图作与运算
    SetBkColor foreDC, RGB(0, 0, 0)  
    SetTextColor foreDC, RGB(255, 255, 255)
    BitBlt foreDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
'5.把背景图与mask图作与运算     
    SetBkColor backDC, RGB(255, 255, 255)  
    SetTextColor backDC, RGB(0, 0, 0)
    BitBlt backDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
'6.把前景图和背景图作或运算
    BitBlt backDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCPAINT
    BitBlt T_DC, T_X, T_Y, S_Width, S_Height, backDC, 0, 0, SRCCOPY

'-->关于水印编程,更详尽的VC资料见 hi.baidu.com/ming_shi/blog/item/5bd9df3f1ba302cb7d1e71f6.html

个人觉得,如果你不会相应的编程,那么破起来就会很难,无论是手机软件还是更高深的外G之类,都建立在对PE的异常熟悉和对API的掌握基础上。
要逆就先要正,所以这篇总结前面是从如何实现水印入手的,如果有更好的资料,请放出来呵 ^_^

1,如果水印图片是以资源形式保存在EXE中的,建议用ResHacker查找下,下断 FindResourceA 或 LoadResourseA 等加载资源文件的API,从这方面入手,需要了解WIN32 对资源文件的阐述和详细的编程方法,相关资料如下:

引用:
Windows资源操作函数
函数                含义
---------------   ------------
LoadAccelerators  加载快捷键资源
LoadBitmap        加载位图资源
LoadCursor        加载光标资源
LoadIcon          加载图标资源
LoadMenu          加载菜单资源
LoadString        加载字符串资源
函数              含义
---------------   ------------
FindResource      从指定模块中加载指定名称、类型的资源
SizeofResource    获取资源数据的长度
LoadResource      加载指定的资源至内存
LockResource      锁定指定的资源,并返回指向资源数据的指针
FreeResource      释放指定的资源

还有一种资源也很常见,就是二进制形式,程序也许会利用这些数据生成图片并调用,这不会影响多少效率,不过只要他调用资源,我们就必然能断下来。
我们通常加载某个资源的步骤如下所示:

引用:
1),使用LoadLibrary()加载模块,或者获取当前应用程序的模块。
2),调用FindResource()从指定模块中查找指定的资源,返回该资源的句柄。
3),调用SizeofResource ()获取资源数据的长度。
4),调用LoadResource()将资源加载至内存。
5),调用LockResource()锁定资源,并返回指向资源数据的指针。
6),通过数据指针操作数据。
7),使用完毕,调用FreeResource()释放指定的资源。

需要说明的是,在某些CrackMe和软件中,注册成功后的提示信息也不是字符串而是图片,那么此时就可以根据上面的资料进行分析和破解。

2,GDI的API获取方法: 下载C或者C++编译工具,在其安装目录下搜索WINGDI.H,如果有易语言环境也可用API伴侣或者WIN32API手册

个人觉得还是依靠网络最好,一则如果前人做过可以有相应的资料,二来可以扩展知识面,便于更好的总结,以点带线,以线带面。

3,视频中的水印:
生成AVI和FLASH,每一桢都加入水印最后合成为视频,猜想我们在视频处理的时候都很占CPU资源,是不是由于这个原因,该方式已经在CSDN上已经得到验证。这其实就是图片水印的N个循环。

水印链接的实现:
关于水印链接:开始猜测是在图片中加入链接,后来一想这不可能单纯在bmp或jpg中实现,那么得出结论:
1),确定相对位置
2),将水印插入每一帧的该位置上
3),生成相应链接。问题是AVI中生成相应链接的实现根本不清楚,在查了大量资料未果后无奈放弃

4,常规下断BitBlt,SetBkColor,TextOut,SetBkMode,SetTextColor,CreateFontIndirect(位图操作API)等,要么根本不断,要么频频断下,条件断点会起到很好的判断作用。
条件断点的知识请谷歌...

5,关于画线的水印等:
GdiPlus.GdipGetImageWidth,画线肯定要送入线的长度,或者画线的颜色是红色,那么从push颜色入手是否可行,或者画线要先确定窗口位置,窗口大小....

6,水印大多数情况下都是在最后才加上去的,所以下断GdiPlus.GdipDeletePen或许是个好的思路,这就和破解自效验程序时可以下断退出进程的API的道理是一样的。在释放资源或者退出之前,你必然会完成水印的加载和融合工作。

7,其他资料:
看雪.书呆彭:
因为GDI的函数基本上都是被程序频繁地调用,下断点也不容易断到想要找的代码处。
如果水印图片是以资源方式存储,可以先用资源编辑工具看一下资源的ID,然后下断点LoadResource()或LoadBitmap()之类的函数,运行程序,它加载资源时就会被断下,记下返回的资源句柄,如果我没记错的话这个句柄好像就是个指针,尝试下内存断点试试。
如果不行,再试试CreateDIBBitmap函数,或者BitBlt,不过这些函数可能会不停地发生中断,所以可能需要设一下条件断点,比如BitBlt可以以坐标为断点等,自己发挥吧,我也没弄过水印的东西,不知道应该怎么弄。
以上如果碰巧有效,那是运气。如果无效,也在意料之中。

数字水印过程就是向被保护的数字对象(如图像、视频和音频等)嵌入某些能证明版权归属或跟踪侵权行为的信息,可以是作者的序列号、公司标志、有意义的文本等等。
由于数字水印是不可见的,在音像保护和软件保护上的应用可能会越来越广,但只要程序验证其合法性,总会露出马脚,除非水印被破坏后会自动提交报警信息,并采集我们的私人数据以便诉控。

8,菜鸟总结,若有失误请告知,若有资料请补充以便修改汇总。
万分感谢您的支持。

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/decryption/128.html     欢迎订阅Eddy Blog

关于 去水印  方法  的相关文章

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言