从4个点坐标入手,暴力去水印
本帖最后由 冥界3大法王 于 2019-4-13 17:40 编辑这是这个贴子的由来:https://www.52pojie.cn/thread-922660-1-1.html
https://attach.52pojie.cn/forum/201904/07/101832hdnd6ggzrla73ftx.gif
本人最近使用了Delphi 10.3.1注册版,网上这个天价RichViewEdit只有最新的版本才兼容
很无奈,网上只能找到demo版本,而老的PJ版本却无法正常的使用,没办法,请来老魔的OD开始动手术吧。
由于以前分析过,所以知道使用了下面的这个函数
00549473 .0FB705 7A507D>movzx eax, word ptr ds: ; |
0054947A .50 push eax ; |Property = 1
0054947B .8B83 88020000 mov eax, dword ptr ds: ; |
00549481 .50 push eax ; |hWnd = 00000001
00549482 .E8 6DD9ECFF call <jmp.&user32.SetPropW> ; \SetPropW
00549487 .56 push esi ; /hData = NULL
00549488 .0FB705 78507D>movzx eax, word ptr ds: ; |
0054948F .50 push eax ; |Property = 1
00549490 .8B83 88020000 mov eax, dword ptr ds: ; |
00549496 .50 push eax ; |hWnd = 00000001
00549497 .E8 58D9ECFF call <jmp.&user32.SetPropW> ; \SetPropW
005F27A6|.E8 65ACF5FF call Project1.0054D410
005F27AB|.81E6 FFFFF7FF and esi, FFF7FFFF
005F27B1|.56 push esi ; /NewValue = 10000
005F27B2|.6A EC push -14 ; |Index = GWL_EXSTYLE
005F27B4|.50 push eax ; |hWnd = 0329A020
005F27B5|.E8 8A49E2FF call <jmp.&user32.SetWindowLongW> ; \SetWindowLongW
005F27BA|.68 85040000 push 485
005F27BF|.6A 00 push 0
005F27C1|.6A 00 push 0
005F27C3|.8BC3 mov eax, ebx
005F27C5|.E8 46ACF5FF call Project1.0054D410
005F27CA|.50 push eax ; |hWnd = 0329A020
005F27CB|.E8 3C45E2FF call <jmp.&user32.RedrawWindow> ; \RedrawWindow
005EFE78|.E8 176BE2FF call <jmp.&user32.FillRect> ; \FillRect
0019F68C 38012961|hDC = 38012961
0019F690 0019F698|pRect = 0019F698 {0.,0.,160.,17.}
0019F694 CA1029A6\hBrush = CA1029A6
先在使用了RichViewEdit 17.6的Delphi 10.3.1里编译输出 EXE文件
然后WinHEX中打开它,搜索richview.com这个网址(千万别搜索TRichView unregistered)
我们会发现 unregistered 这个字符的顺序很有意思,因为后面这个字符串是打乱顺序的加密的
https://attach.52pojie.cn/forum/201904/12/174545s70ynvxewvo2l0x8.jpg
如果从工程文件下手,网上说注册版才有源码,而网上的PJ版本对N多的文件打过了补丁(实在是太多了,上千个)
也就是说一个一个控件文件来打补丁很麻烦,且不好定位到。
所以我们从左 顶 宽 高 四个坐标 入手 , 搜索字符串常量 A0(十进制的:160),搜索 17的16进制(改成0一样能把水印压扁)
通过EmEditor 几轮过滤
最后发现符合条件的 只有下面两个:
0070E104 push 0A0
007C0963 push 0A0
007C07BC/.55 push ebp
007C07BD|.8BEC mov ebp, esp
007C07BF|.83C4 F0 add esp, -10
007C07C2|.832D 7C567D00>sub dword ptr ds:, 1
007C07C9|.73 6C jnb short Project1.007C0837
007C07CB|.B2 01 mov dl, 1
007C07CD|.A1 F4FE6200 mov eax, dword ptr ds:
007C07D2|.E8 F507E7FF call Project1.00630FCC
007C07D7|.A3 78567D00 mov dword ptr ds:, eax
007C07DC|.8B15 D88A6100 mov edx, dword ptr ds: ;Project1.00618B30
007C07E2|.A1 78567D00 mov eax, dword ptr ds:
007C07E7|.E8 B808E7FF call Project1.006310A4
007C07EC|.A1 70315100 mov eax, dword ptr ds:
007C07F1|.8945 F4 mov , eax
007C07F4|.A1 443B5100 mov eax, dword ptr ds:
007C07F9|.8945 F8 mov , eax
007C07FC|.A1 C4285100 mov eax, dword ptr ds:
007C0801|.8945 FC mov , eax
007C0804|.8D45 F4 lea eax,
007C0807|.BA 02000000 mov edx, 2
007C080C|.E8 E7EBC9FF call Project1.0045F3F8
007C0811|.A1 24415100 mov eax, dword ptr ds:
007C0816|.E8 69EBC9FF call Project1.0045F384
007C081B|.A1 A8366000 mov eax, dword ptr ds:
007C0820|.8945 F0 mov , eax
007C0823|.8D45 F0 lea eax,
007C0826|.33D2 xor edx, edx
007C0828|.E8 CBEBC9FF call Project1.0045F3F8
007C082D|.A1 D88A6100 mov eax, dword ptr ds:
007C0832|.E8 4DEBC9FF call Project1.0045F384
007C0837|>8BE5 mov esp, ebp
007C0839|.5D pop ebp ;Project1.005F7AAA
007C083A\.C3 retn
007C083B 90 nop
007C083C .832D 80567D00>sub dword ptr ds:, 1
007C0843 .C3 retn
007C0844 .832D 88567D00>sub dword ptr ds:, 1
007C084B .73 11 jnb short Project1.007C085E
007C084D .B2 01 mov dl, 1
007C084F .A1 88A46300 mov eax, dword ptr ds:
007C0854 .E8 37AFE7FF call Project1.0063B790
007C0859 .A3 84567D00 mov dword ptr ds:, eax
007C085E >C3 retn
007C085F 90 nop
007C0860 .832D 8C567D00>sub dword ptr ds:, 1
007C0867 .C3 retn
007C0868 .832D 90567D00>sub dword ptr ds:, 1
007C086F .C3 retn
007C0870 .832D 94567D00>sub dword ptr ds:, 1
007C0877 .73 20 jnb short Project1.007C0899
007C0879 .8B15 84396800 mov edx, dword ptr ds: ;Project1.006839DC
007C087F .B8 32FFFFFF mov eax, -0CE
007C0884 .E8 D371F6FF call Project1.00727A5C
007C0889 .8B15 BC436800 mov edx, dword ptr ds: ;Project1.00684414
007C088F .B8 31FFFFFF mov eax, -0CF
007C0894 .E8 C371F6FF call Project1.00727A5C
007C0899 >C3 retn
007C089A 8BC0 mov eax, eax
007C089C .832D 98567D00>sub dword ptr ds:, 1
007C08A3 .73 10 jnb short Project1.007C08B5
007C08A5 .8B15 A4FB6800 mov edx, dword ptr ds: ;Project1.0068FBFC
007C08AB .B8 C4FFFFFF mov eax, -3C
007C08B0 .E8 A771F6FF call Project1.00727A5C
007C08B5 >C3 retn
007C08B6 8BC0 mov eax, eax
007C08B8 .832D 9C567D00>sub dword ptr ds:, 1
007C08BF .73 20 jnb short Project1.007C08E1
007C08C1 .8B15 E0F36B00 mov edx, dword ptr ds: ;Project1.006BF438
007C08C7 .B8 30FFFFFF mov eax, -0D0
007C08CC .E8 8B71F6FF call Project1.00727A5C
007C08D1 .8B15 48F96B00 mov edx, dword ptr ds: ;Project1.006BF9A0
007C08D7 .B8 2FFFFFFF mov eax, -0D1
007C08DC .E8 7B71F6FF call Project1.00727A5C
007C08E1 >C3 retn
007C08E2 8BC0 mov eax, eax
007C08E4 .832D A0567D00>sub dword ptr ds:, 1
007C08EB .73 30 jnb short Project1.007C091D
007C08ED .8B15 E0956E00 mov edx, dword ptr ds: ;Project1.006E9638
007C08F3 .B8 34FFFFFF mov eax, -0CC
007C08F8 .E8 5F71F6FF call Project1.00727A5C
007C08FD .8B15 B8996E00 mov edx, dword ptr ds: ;Project1.006E9A10
007C0903 .B8 35FFFFFF mov eax, -0CB
007C0908 .E8 4F71F6FF call Project1.00727A5C
007C090D .8B15 389F6E00 mov edx, dword ptr ds: ;Project1.006E9F90
007C0913 .B8 33FFFFFF mov eax, -0CD
007C0918 .E8 3F71F6FF call Project1.00727A5C
007C091D >C3 retn
007C091E 8BC0 mov eax, eax
007C0920 .53 push ebx
007C0921 .56 push esi ;Project1.<ModuleEntryPoint>
007C0922 .57 push edi ;Project1.<ModuleEntryPoint>
007C0923 .BE AC567D00 mov esi, Project1.007D56AC
007C0928 .832D A8567D00>sub dword ptr ds:, 1
007C092F .0F83 97000000 jnb Project1.007C09CC
007C0935 .A1 4C206600 mov eax, dword ptr ds:
007C093A .A3 A4567D00 mov dword ptr ds:, eax
007C093F .33DB xor ebx, ebx
007C0941 .33C9 xor ecx, ecx
007C0943 .B2 01 mov dl, 1
007C0945 .A1 08355E00 mov eax, dword ptr ds:
007C094A .E8 09ADE2FF call Project1.005EB658
007C094F .8906 mov dword ptr ds:, eax
007C0951 .33D2 xor edx, edx
007C0953 .8B06 mov eax, dword ptr ds:
007C0955 .E8 22D1E2FF call Project1.005EDA7C
007C095A .B2 03 mov dl, 3
007C095C .8B06 mov eax, dword ptr ds:
007C095E .E8 35D5E2FF call Project1.005EDE98
007C0963 .68 A0000000 push 0A0 ;这个A0正好是160,我们改成 68 00000000
007C0968 .6A 11 push 11 ;这个11正是 17,经过测试,并不是!希望楼下同学能找到传入11的地方。。。
007C096A .B9 03000000 mov ecx, 3
007C096F .BA 03000000 mov edx, 3
007C0974 .8B06 mov eax, dword ptr ds:
007C0976 .8B38 mov edi, dword ptr ds:
007C0978 .FF97 C8000000 call dword ptr ds:
007C097E .66:BA 6500 mov dx, 65
007C0982 .8B06 mov eax, dword ptr ds:
007C0984 .E8 C739D8FF call Project1.00544350
007C0989 .8B06 mov eax, dword ptr ds:
007C098B .8998 64030000 mov dword ptr ds:, ebx
007C0991 .C780 60030000>mov dword ptr ds:, Project1.007>
007C099B .8B06 mov eax, dword ptr ds:
007C099D .8998 24010000 mov dword ptr ds:, ebx
007C09A3 .C780 20010000>mov dword ptr ds:, Project1.007>
007C09AD .8B06 mov eax, dword ptr ds:
007C09AF .E8 1014E3FF call Project1.005F1DC4
007C09B4 .8B06 mov eax, dword ptr ds:
007C09B6 .E8 713DD8FF call Project1.0054472C
007C09BB .68 2C010000 push 12C ; /Timeout = 300. ms
007C09C0 .E8 DFE4C6FF call <jmp.&kernel32.Sleep> ; \Sleep
007C09C5 .8B06 mov eax, dword ptr ds:
007C09C7 .E8 F013E3FF call Project1.005F1DBC
007C09CC >5F pop edi ;Project1.005F7AAA
007C09CD .5E pop esi ;Project1.005F7AAA
007C09CE .5B pop ebx ;Project1.005F7AAA
007C09CF .C3 retn
经过测试,
007C0963 68 A0000000 push 0 ;修改这个的A0为00 即可解决
断下不远处,便是 0054B235 /EB 25 jmp short Project1.0054B25C至此水印就简单的去掉了。
当然,我们也可以修改的更宽些,查看学习效果。
比如把这句改成:007C0963 68 96080000 push 896
我们记住特征码,方便对生成的EXE打补丁就好了。(地址和方法)
另外,我们可以模仿来画个水印玩玩。
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Width:=10;
Canvas.Pen.Style:=psDash;
Canvas.Pen.Color:=clred;
Canvas.MoveTo(200,100);
Canvas.lineto(300, 200);
Canvas.Pen.Width:=100;
Canvas.Rectangle(50,210,100,100);
end;
实现后的效果,基本与上面的类似。
======================================================================================
另外有意思的是:bp FillRect这个函数,Delphi 7版本中得到的是下面的信息
0019F784 00450EB5/CALL to FillRect from 信手拈来.00450EB0
0019F788 0D012A59|hDC = 0D012A59
0019F78C 0019F794|pRect = 0019F794 {0.,0.,125.,17.}可能所用的版本不相同,产生的水印大小不同吧。(竟然是125: 7D)
0019F790 491025B1\hBrush = 491025B1
我们同样上面的操作方式:
0052B064 push 7D
00531871 push 7D
找到两处修改后,水印也成功去除了。
=============================================
最后最后,为了更方便的给虚拟机中编译输出的EXE打补丁,我们使用命令行hextool 工具来搞个批处理一键式完成。
D:\全自动汇编修改\HexTool.exe 信手拈来按键帮你来.exe 1248369 2 6A00
另外还可以从刷子的颜色函数入手进行修改:
0051621C .50 push eax ; /pLogbrush = 033285D0
0051621D .E8 9A01F0FF call <jmp.&gdi32.CreateBrushIndirect> ; \CreateBrushIndirect
CreateBrushIndirect,可以创建具有指定风格、颜色和模式的逻辑刷子。
中文名CreateBrushIndirect 速 查Windows NT 3.1、Windows 95以上 参 数lplb 函数功能创建指定风格颜色模式逻辑刷子
函数原型:HBRUSH CreateBrushlndirect(CONST LOGBRUSH *lplb);
参数:
lplb:指向LOGBRUSH结构的指针,该结构包含与刷子有关的信息。
返回值:如果函数执行成功,那么返回值标识一个逻辑刷子;如果函数执行失败,则返回值为NULL。
Windows NT:若想获得更多错误信息,请调用GetLastError函数。
备注:刷子就是系统用来对要填充图形的内部进行绘制的位图。
00514E49|.50 push eax ; /Index = COLOR_SCROLLBAR
00514E4A|.E8 F51CF0FF call <jmp.&user32.GetSysColor> ; \GetSysColor
掌握的方法越多也就不会黔驴技穷。
本帖最后由 xyxiong007 于 2019-4-13 08:58 编辑
冥界3大法王 发表于 2019-4-12 17:46
测试一下。
好了吗?
好了,图片已经看到了。感谢分享。楼主技术了得。 叼真叼真 牛皮 感谢楼主分享经验 大佬牛逼啊 学习学习!!!!!!!!!
测试一下。
好了吗? 厉害,学习学习 学习学习,就是不能出成品啊~ 学习学习!!!!!!!!!