Nisy 发表于 2010-4-25 12:32:08

Uedit32_16.0.0.1032 中文版背后的故事

自己先搞了一下 然后又看了一下网上的爆破方法

先说一下网络上流传的爆破方法: OD载入后 Ctrl+S 搜索 PUSH 6E6D 这个是弹出过期的资源对话框的ID

我们通过启动时判断是否注册来定位程序的验证点。用工具eXeScope 查看 ueres.dll



这个方法很快 我用的是另一种方法 点程序关于的时候 根据对话框文字内容不同 在内存下硬件读取断点来定位

最终效果都是相同的 定位到算法CALL的关键跳:

Cr(1032版):
00806282   /EB 02         JMP SHORT Uedit32.00806286               ;修改为JMP
00806284|. |8AC3          MOV AL,BL

如果只是这样的话 是不是很爽的 我查看了一下老外的版本 发现也是这样搞的

0046333B    E8 A078FFFF   CALL Uedit32.0045ABE0
00463340    8B2D 201CB500   MOV EBP,DWORD PTR DS:[<&USER32.SendMessa>; user32.SendMessageA
00463346    83C4 14         ADD ESP,14
00463349    84C0            TEST AL,AL
0046334B    0F84 1D030000   JE Uedit32.0046366E                      ; 16.0.0.1038 就是把这里NOP掉就OK了
00463351    391D E478D900   CMP DWORD PTR DS:,EBX
00463357    0F85 11030000   JNZ Uedit32.0046366E
0046335D    395C24 14       CMP DWORD PTR SS:,EBX
00463361    74 28         JE SHORT Uedit32.0046338B
00463363    8B4C24 24       MOV ECX,DWORD PTR SS:
00463367    8B5424 28       MOV EDX,DWORD PTR SS:
0046336B    83EC 10         SUB ESP,10
0046336E    8BC4            MOV EAX,ESP
00463370    8908            MOV DWORD PTR DS:,ECX
00463372    8B4C24 3C       MOV ECX,DWORD PTR SS:
00463376    8950 04         MOV DWORD PTR DS:,EDX
00463379    8B5424 40       MOV EDX,DWORD PTR SS:
0046337D    8948 08         MOV DWORD PTR DS:,ECX
00463380    8950 0C         MOV DWORD PTR DS:,EDX
00463383    E8 680CFFFF   CALL Uedit32.00453FF0                  ; 该CALL中调用 6E6D 资源

而中文版则不然,英文版程序大小为 9.66M 而中文版大小为12M



英文版下载链接(1038版):http://www.ultraedit.com/files/ue_english.zip
中文版下载链接(1032版):http://www.ultraedit.com/files/ue_chinese.zip

   那多出来的代码是什么呢 ? 通过调试得中文版的UE做了很多BT的事情,OD调试的时候首先是无法下INT3断点的。程序在启动时会效检代码段数据是否被修改过,所以我们下 BP ReadProcessMemory 函数或者对我们下INT3断点的数据下内存读写断点(我喜欢后者)。然后还没有结束,程序会用效检数值解密代码并将数据填充到代码段某几段数据,说的俗点就是SMC解码代码段的几段数据。

    我调试的是1032的版本,笔记比较乱,我详细说思路和方法,所以简单贴上关键点,对于读取代码段数据进行效检部分的代码就不贴了,留给有心人去自己调试吧,这里只贴出程序SMC填写那三段数据的函数:

00C21D7F    8B4D 08         MOV ECX,DWORD PTR SS:
00C21D82    51            PUSH ECX                                 ; ECX 是长度
00C21D83    8B55 C8         MOV EDX,DWORD PTR SS:
00C21D86    52            PUSH EDX                                 ; EDX 是源代码段
00C21D87    8B45 0C         MOV EAX,DWORD PTR SS:
00C21D8A    50            PUSH EAX                                 ; EAX 是要目的代码段
00C21D8B    E8 6040DFFF   CALL Uedit32_.00A15DF0                   ; 该CALL实现SMC写入

    这样一共SMC动态填充程序的三段数据。问题就来了:该函数的第二个参数(EDX的源数据)是如何解密的来的呢? 这里有兴趣的朋友可以继续内存断点来分析。我是这样想的,如果是动态效检的结果再去计算得到的源数据,而调用的函数都是同一个,与其处理效检值,不若直接把这个COPY函数NOP掉,手动把正确的代码Patch回去,然后把这个函数NOP掉好了。这个是破解壳的时候对付SMC的常见手法哈。还好啦,就三段,不然会死人啦 ……

    程序跑起来之后基本上就没啥了,但是BT的UE又开始效检,又把我们自己Patch进去的三段代码给乱码写回去,真够猥琐的。于是乎把那里也咔嚓掉。看来UE对中文用户特别关照了,这3M真不白给哈。有兴趣的朋友可以一起分析一下UE中文版本的效检。就到这吧,有有时间再来灌水 ~~

wuhanqi 发表于 2010-5-11 21:16:28

/:good 膜拜,学习

月之精灵 发表于 2010-4-25 13:33:06

欢迎您下次来灌水

hflywolf 发表于 2010-4-25 14:29:08

欢迎您下次继续来灌水

菜儿 发表于 2010-4-25 22:52:39

牛X。来个教程学习/:good

yayazhi 发表于 2010-4-25 22:56:21

经典。/:09

兔小样 发表于 2010-4-26 14:51:59

来支持下,辛苦了!/:018

GGLHY 发表于 2010-4-27 13:44:01

恩,学习下。膜拜下.....

老万 发表于 2010-4-27 21:43:50

学习一下校长的思路

2005ljb 发表于 2010-4-28 22:38:30

难得看到校长啊。没想到同一个软件英文版何中文版相差这么大。。。。
页: [1]
查看完整版本: Uedit32_16.0.0.1032 中文版背后的故事