首页
社区
课程
招聘
[旧帖] 一个软件窗口标题引发的思考。这些字符是怎么加的? 0.00雪花
发表于: 2011-4-26 02:16 8744

[旧帖] 一个软件窗口标题引发的思考。这些字符是怎么加的? 0.00雪花

2011-4-26 02:16
8744
软件下载地址:http://u.115.com/file/f0d7b50fd

我从论坛下了这个软件,自己搜索想删除对话框上面的标题,结果怎么样都找不到相关字符。这是通过什么实现的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
用 spy++
看看
2011-4-26 07:36
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢提示,不过还是找不到,无法去除。
2011-4-26 13:38
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
尝试了几种编码格式,找了半天,也没有找到,期待有人来解!
2011-4-26 15:50
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢楼上朋友帮顶
2011-4-26 16:14
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在顶顶...
2011-4-27 14:06
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
首先,目标程序是delphi 写的程序,它的标题也就是Form2.caption我看了一下是“授权”,他的Form2.show过程中改写了它的标题,我试过,把Form2.show过程咔嚓掉标题就不会变了,显示“授权”,但是文本估计是存入那个INI文件中的,所以搜不到,show 过程就是它的判断过程,标题写入授权或软件什么的服务的。
2011-4-27 18:05
0
雪    币: 222
活跃值: (488)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
8
唔,这个是它自己的窗口库。从MessageBox就可以看出来,不过不确定,也许是delphi的一个库。它的MessageBox很有意思,创建了窗口会没有新建线程来作为消息循环,直接像model对话框那样在主线程中进行消息循环处理。所以还可以很简单的跟回去。
这几个检测虚拟机的地方,都需要返回0
004D7072   . E8 E5EFFFFF    CALL play.004D605C

004D7091   > E8 76F0FFFF    CALL play.004D610C

004D709A   . E8 1DF0FFFF    CALL play.004D60BC

软件运行后,在alt+M内存页面里,直接ctrl+B搜索"提供加密"的二进制,提供加密应该写在ascii里,这个是OD的bug,处理不好unicode的汉字。

00F7E088  CC E1 B9 A9 BC D3 C3 DC C8                       提供加密软件服务

考虑到在同样的进程里,同样的系统环境里,相同的代码执行过去,往往申请到的内存片都是同一片,直接在这个地址上下写入断点。在之前被使用了很多很多次,一路F9直到出现

00F7E088  CC E1 B9 A9 00 00                                提供....
发现了给这儿写入字符串的地方了。向上几层函数,到达:
004D5F4C   E8 07F8F2FF       CALL play2.00405758
004D5F51   43                INC EBX
004D5F52   81E3 07000080     AND EBX,80000007

在这个循环里观察,发现esi==要解码的字符串长度。而解码后的字符保存在dl中:
004D5F36   0FB683 64144E00   MOVZX EAX,BYTE PTR DS:[EBX+4E1464]
004D5F3D   32D0              XOR DL,AL
处理方法是,把要处理的字符串每2bytes转化成一个字节大小的16进制数,处理完整个数字字符串后,把16进制串和4E1464处的16进制数组挨个异或就得到目标字符串了。

那这个用字符写成的16进制字符串怎么来的,再往往循环开始的地方看,可以发现处理前的这个字符串保存的地方是:
00F0EF58  37 44 45 33 31 41 46 44 32 38 42 30 34 31 39 44   7DE31AFD28B0419D
00F0EF68  37 39 45 46 31 46 41 41 32 33 39 44 34 43 42 30   79EF1FAA239D4CB0
也是在堆中,继续上面那样下写入断点追,虽然混淆的地方很多,F9了很多下后还是找到了产生这个字符串的关键函数:
004D6981   E8 42180000       CALL play2.004D81C8

不过追了这么远的结论是,delphi太难了。我改不了这个乱糟糟的字符串 /:^|
索性就在
004D5EF7   83D6 00          ADC ESI,0
004D5EFA   85F6             TEST ESI,ESI
004D5EFC   7E 67            JLE SHORT play2.004D5F65
这个判断要处理出来的字符串的程度地方修改,判断当要处理的字符串, 指针==[esp-4](第一个参数),内容是"7DE31AFD28B0419D"时,就设置要解码的长度esi==0,然后直接跳到字符串长度==0时的地址04D5F65。
然后它就剩下个授权了,哈哈

希望有帮助 /:^)
再提供一些信息,根据shoooo大牛提供的经验,delphi中突然出现不操作寄存器直接压栈接着操作函数的地方,都是引用到外部的可能是其他语言的库了。这儿就是这样的情况。
一般碰到这种窗口上的消息,除非内存中有字符串的明码,都得是跟踪着窗口消息循环,找到创建窗口的位置,如果是自定义的UI就会很麻烦的。今天的运气好了撞翻了耗子。
2011-4-27 18:37
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
多谢楼上帮助解答
2011-4-28 12:15
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢这么用心的帮我看问题,谢谢。这个应该不是自定义的UI。其实这个可能属于破解者的二次加密,感觉真有点深度。

谁还有更明确的答案和解决办法?
2011-4-28 12:19
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
继续顶顶,大家帮看看
2011-4-29 02:59
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
12
像这样  ?
上传的附件:
2011-4-29 07:03
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
哇 楼上大牛确实厉害。这个是怎么弄的?原软件实际没有这个功能啊。这个看来关联算法了,这种DIY我是学不会了,只求怎么还原成软件本来的标题。
2011-4-29 09:58
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
改人家的东西是不好的
所以只能告诉你 exe 里有编码'解码函数
自己加油了
2011-4-29 10:17
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个应该不算是改别人的东西,原软件标题不是这个的,这是被破解人添加的。还原标题应该不算是侵犯他人吧。再次感谢楼上大牛
2011-4-29 10:25
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
B505F4319215D227B079F3329765AD27B578F4449212D522B07288469717D653

找到这个就能改了。可惜水平不够。。。大牛提示的已经够多了。谢谢
2011-4-29 11:10
0
雪    币: 222
活跃值: (488)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
17
学习,s大牛可以介绍一些分析处理delphi程序的基础吗?教教想学习的小菜鸟。 /:^]
2011-4-29 17:08
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
这个实在是很难讲也没个通式
但对于调试的语言若你能略懂写些小程序的话能有帮助
例如里头的
004D69BF   .  8B45 F0        mov     eax, [ebp-10]
004D69C2   .  8B10           mov     edx, [eax]
004D69C4   .  FF52 14        call    [edx+14]
004D69C7   .  83F8 28        cmp     eax, 28
004D69CA   .  0F85 F3050000  jnz     004D6FC3

配合他下面的代码(我没列出来)
大致能猜到是 if TStringList.Count == 28h

另外 Delphi 有很明显的位址空间范围
基本上你若看到 Call 40xxxx 之类的较低位址函数都是Delphi自己的函数
而不是User写的函数, 基本上这种的不值得跟入.
同理..大致上心里可以有个层次出来
2011-4-29 17:26
0
雪    币: 222
活跃值: (488)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
19
学习,s大讲的这个非常有帮助,是分析过很多程序才能凭感觉总结出来的。

"基本上你若看到 Call 40xxxx 之类的较低位址函数都是Delphi自己的函数
而不是User写的函数, 基本上这种的不值得跟入."

我碰到了delphi的程序,其实实实在在只有个位数的几个 :P,就挂dede,还有ida对delphi的sig,看不到符号名的,就迷糊得跟进去,又因为delphi的库程序实现的层次一般很深,就很迷糊,比碰到VB还迷糊,起码VB的现有文档搜集了很多。遵循S大教导,我下载delphi再写些crackme自己摸索摸索,习惯了delphi应该可以长进一些。
再次谢谢S大的经验 /:^]
2011-4-29 21:47
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
E16EC22D.ini 这里的编码怎么生成的呢。有什么依据吗?
2011-5-5 23:51
0
雪    币: 189
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
通过其他人搞定了,标题是藏在注册码里面的。换了注册码那组文字就没了。
2011-5-7 09:57
0
游客
登录 | 注册 方可回帖
返回
//