冥界3大法王 发表于 2019-4-12 16:34

从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-12 17:50

本帖最后由 xyxiong007 于 2019-4-13 08:58 编辑

冥界3大法王 发表于 2019-4-12 17:46
测试一下。
好了吗?
好了,图片已经看到了。感谢分享。楼主技术了得。

zyc183369 发表于 2019-4-12 16:53

叼真叼真   牛皮

lzqtzs 发表于 2019-4-12 17:02

感谢楼主分享经验

KPKP 发表于 2019-4-12 17:09

大佬牛逼啊

iso 发表于 2019-4-12 17:35

学习学习!!!!!!!!!

冥界3大法王 发表于 2019-4-12 17:46


测试一下。
好了吗?

jaqq 发表于 2019-4-12 18:07

厉害,学习学习

hxd97244 发表于 2019-4-12 19:57

学习学习,就是不能出成品啊~

zjk414 发表于 2019-4-12 20:08

学习学习!!!!!!!!!
页: [1] 2 3 4 5
查看完整版本: 从4个点坐标入手,暴力去水印