吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1360|回复: 11
收起左侧

[求助] 求助:去除软件升级引发的一系列问题

[复制链接]
朱朱你堕落了 发表于 2023-9-30 10:22
800吾爱币
本帖最后由 朱朱你堕落了 于 2023-9-30 18:30 编辑

在悬赏区看到一个贴子:https://www.52pojie.cn/thread-1839400-1-1.html
我想着去掉更新,感觉就改个跳转或段首ret的简单事,看了之后,发现自己被打脸了。

因为升级时有对话框提示,所以分析如下:

下MessageBoxA断点,能断下提示升级的对话框,看地址信息,这明显不在常规的区段内,
猜测应该是使用了VirtualAlloc或VirtualAllocEx申请的内存。经测试软件使用的是
VirtualAlloc这个函数,这就使得每次分配的地址是变化的,不太好调试,所以为了方便
我写了个HOOK VirtualAlloc,把分配空间地址固定在0x50000000,那么只要在弹升级对话框
所在的段首ret掉,应该就可以干掉升级了。

遇到几个问题,



看截图如示,当VirtualAlloc申请空间0x50000000成功后,我在段首0x5002CBB2使用x32dbg
下硬件执行断点,OK,断下来了。我是想用OD来实现断在0x5002CBB2的,但是OD下硬件执行
断点,运行后根本就断不下来,最后我试着x32dbg断下来了,只能说有运气的成分在。

问题:
1
如果我非要使用OD调试的话(用习惯了看着舒服),问如何操作使OD能在0x5002CBB2处断下。

2
如上图所示,从分配内存开始,它是一个PE文件,而且貌似加了UPX的文件。它是单独的一个文件吗?
如何dump出来?不知道dump出来后能不能运行。

3
申请内存空间的基址+偏移0x2CBB2就是段首,段首ret,那么写补丁时,这个判断时机是什么,如何判断呢?
如要HOOK哪个函数,正好空间已经分配,而且分配空间内已经填充了代码。如果是只是分配了空间,但是
内部还没有填充代码的话,这时写补丁,之后补丁会被填充的代码覆盖,肯定不对的。

4
此软件无壳,PE查壳如下:
Microsoft Visual C++ v.14.0 - 2015 (E8)
按一般正向编程思路来说,判断升级,肯定写在MFC程序的初始化函数里,但是现在这个升级
却不在初始化函数里,作者到底是如何实现的?怎么插入这个upx的单独的EXE的?如果作者自己
在MFC程序里写VirtualAlloc,里面写代码,感觉不可能的,难度不亚于写shellcode。

5
除了段首ret破解方法,是否其他破解方法,基于软件这种思路或特性。

6
我想把补丁写成劫持补丁,经测试,msimg32.dll,version.dll,winmm.dll这三个常用劫持DLL均不加载,
请问还有其他DLL可以劫持吗?
软件:https://www.123pan.com/s/YL29-CS6Oh.html
(软件有随机基址,为了方便调试,请先去掉随机基址好些,我这上传的原版,没有去除。)

哈哈,问题较多,求助各位大佬解惑。

最佳答案

查看完整内容

[md]dump 出来,魔改,然后重新写个 DLL 加载器就好。 或者直接做成引导启动,引导后把联网的相关 API 干掉。 之前研究过这个软件,可惜帖子被黑幕了。 加载器的源码在下面: https://pan.baidu.com/s/1_vwxkFXt30WekuzMGgUu4Q?pwd=8svb 使用的是 `22.0.0.3 (2022.07.19)` 版本,原版也在里面。 下面是我之前的分析部分: > 作者将整个程序编译为 DLL,使用 UPX 压缩后内嵌至 EXE 文件。 > 主程序启动时,将 ...

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
leedun + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-9-30 10:22
本帖最后由 爱飞的猫 于 2023-9-30 19:41 编辑

dump 出来,魔改,然后重新写个 DLL 加载器就好。

或者直接做成引导启动,引导后把联网的相关 API 干掉。

之前研究过这个软件,可惜帖子被黑幕了。

加载器的源码在下面:

https://pan.baidu.com/s/1_vwxkFXt30WekuzMGgUu4Q?pwd=8svb

使用的是 22.0.0.3 (2022.07.19) 版本,原版也在里面。

下面是我之前的分析部分:

作者将整个程序编译为 DLL,使用 UPX 压缩后内嵌至 EXE 文件。
主程序启动时,将该文件通过内存加载的方式启动。

我把它脱壳后写了个简单的引导程序来启动,这样就不需要回写到原来的 EXE 文件了。
启动器顺便加了个简单的屏蔽联网小功能,请注意这个没有破解功能,只是加了个引导器。

...

软件会检查是否联网并上报当前机器以及版本信息,因此启动器顺便剔除了联网相关代码;启动器的源码也在压缩包内,有兴趣可以继续加功能进去。

功能 DLL 提取、脱壳过程

首先下 VirtualAllocVirtualProtect 断点,然后正常运行;

依次查看函数的返回地址,其中有一个返回后是这样:

009718BB | 56           | push esi              |
009718BC | 68 20F09A00  | push bosskey_.9AF020  |
009718C1 | E8 60FDFFFF  | call bosskey_.971626  |
009718C6 | 8BF0         | mov esi,eax           |

9AF020 开始的内存处就是 DLL 文件内容,直接转存这块内存区域即可;提取到这块内存区域结束即可。

注:971626 处的函数就是初始化内存加载 DLL

...

得到的这个 DLL 文件是使用 UPX 加壳的文件,但没有进行魔改。直接执行「upx -d bosskey22.0.0.3_dump.dll」即可得到脱壳后的文件。

然后就是修改 DllMain 入口点。因为一些原因,使用 LoadLibrary 加载的 DLL 入口执行时调用 CreateThread 启动线程会产生一些奇怪的问题,因此需要手动调用这个初始化函数。

首先使用 PE-Bear 或类似的 PE 编辑器将入口点修改为 mov eax, 1; ret 04h 的地址:

...

然后就是手动执行 DLL 基址 + 0x5CA20 处的函数进行初始化即可(参见启动器代码)。


问题:

1 如果我非要使用OD调试的话(用习惯了看着舒服),问如何操作使OD能在0x5002CBB2处断下。

硬件执行断点应该可行?

2 如上图所示,从分配内存开始,它是一个PE文件,而且貌似加了UPX的文件。它是单独的一个文件吗?
如何dump出来?不知道dump出来后能不能运行。

直接转存内存即可。

转存出来的 DLL 需要特殊处理,但你可以看我以前研究过的内容。

3 申请内存空间的基址+偏移0x2CBB2就是段首,段首ret,那么写补丁时,这个判断时机是什么,如何判断呢?
如要HOOK哪个函数,正好空间已经分配,而且分配空间内已经填充了代码。如果是只是分配了空间,但是
内部还没有填充代码的话,这时写补丁,之后补丁会被填充的代码覆盖,肯定不对的。

你可以 Hook 代码内初始化 DLL 的函数下方,例如 22.0.0.3 (2022.07.19) 版的 971626 函数。调用原函数后会得到 DLL 装载后的内存地址。

4 此软件无壳,PE查壳如下:
Microsoft Visual C++ v.14.0 - 2015 (E8)
按一般正向编程思路来说,判断升级,肯定写在MFC程序的初始化函数里,但是现在这个升级
却不在初始化函数里,作者到底是如何实现的?怎么插入这个upx的单独的EXE的?如果作者自己
在MFC程序里写VirtualAlloc,里面写代码,感觉不可能的,难度不亚于写shellcode。

可能在新的线程里。DLL 加载时有调用 CreateThread 的痕迹(如果我之前的分析没有错的话)。

5 除了段首ret破解方法,是否其他破解方法,基于软件这种思路或特性。

屏蔽联网。

6 我想把补丁写成劫持补丁,经测试,msimg32.dll,version.dll,winmm.dll这三个常用劫持DLL均不加载,
请问还有其他DLL可以劫持吗?

XP 下有 lpk.dll,这个程序的话不清楚。

不过你也可以手动更改它的导入表让它加载你的 DLL。

点评

还得请教大佬, 1 请问到底怎么分析出来作者把程序编译成DLL,之后弄了个启动器启动的?依据是什么? 2 提取DLL这个步骤麻烦做下视频演示一下吧,我搞不出来了,哈哈。 就是: 首先下 VirtualAlloc 与 Virtu  详情 回复 发表于 2023-10-1 08:53
干货满满,果断收藏  发表于 2023-9-30 21:15

免费评分

参与人数 3吾爱币 +6 热心值 +3 收起 理由
610100 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
gksj + 2 + 1 大神出手,果然名不虚传
朱朱你堕落了 + 3 + 1 大哥威武霸气!膜拜一波儿...

查看全部评分

bester 发表于 2023-9-30 13:05
它似乎 模拟了windows的装载过程,dump要考虑的东西太多了,要修复很多东西,不如smc
董督秀 发表于 2023-9-30 14:21
个人感觉,固定申请空间的基址,不如考虑通过代码实现动态获取该基址,之后加偏移定位。很多一键加的网络验证就是这种动态申请的基址……
 楼主| 朱朱你堕落了 发表于 2023-10-1 08:53
爱飞的猫 发表于 2023-9-30 10:22
[md]dump 出来,魔改,然后重新写个 DLL 加载器就好。

或者直接做成引导启动,引导后把联网的相关 API  ...

还得请教大佬,
1
请问到底怎么分析出来作者把程序编译成DLL,之后弄了个启动器启动的?依据是什么?

2
提取DLL这个步骤麻烦做下视频演示一下吧,我搞不出来了,哈哈。
就是:
首先下 VirtualAlloc 与 VirtualProtect 断点,然后正常运行;

转存这块内存区域即可;提取到这块内存区域结束即可。
bester 发表于 2023-10-2 01:15
爱飞的猫 发表于 2023-9-30 10:22
[md]dump 出来,魔改,然后重新写个 DLL 加载器就好。

或者直接做成引导启动,引导后把联网的相关 API  ...

我比较好奇的是 他怎么把这个dll给放进去的,似乎用reshacker也扫不出来,可能reloc区段?然后dll的重定位那么多,他启动器修复不复杂么,话说是否git有见过相应的方法,我想学习一下他的写法,太强了这个写法,完全实现了dll不落地,我印象里面只有反射注入有类似的办法,但是他源码太复杂了 我看不懂
爱飞的猫 发表于 2023-10-2 02:35
本帖最后由 爱飞的猫 于 2023-10-2 02:58 编辑

@朱朱你堕落了

1 请问到底怎么分析出来作者把程序编译成DLL,之后弄了个启动器启动的?依据是什么?

我猜的

2 提取DLL这个步骤麻烦做下视频演示一下吧,我搞不出来了,哈哈。

下载链接: https://pan.baidu.com/s/1kENpFWGxRiFBq8UGFGKsog?pwd=r855
解压密码 ang9boiyeVe1ef

里面有视频、原版附件、更新后的引导代码。


@bester

我比较好奇的是 他怎么把这个dll给放进去的

.data 区段,应该是做了个简单的加密,转换成 C 代码然后内嵌到数据区段。

下面是在内存时的 dump,以及在文件时的 dump:

data区段.png

这个解密过程我就没跟进了。

简单看了下:

001C1950 | B8 20F01F00         | mov eax,bosskey_19.9.0.3.1FF020     |
001C1955 | B9 20290000         | mov ecx,2920                        |
001C195A | 0F1000              | movups xmm0,xmmword ptr ds:[eax]    |
001C195D | 66:0FF805 B0081F00  | psubb xmm0,xmmword ptr ds:[1F08B0]  | - 0x05
001C1965 | 66:0FEF05 C0081F00  | pxor xmm0,xmmword ptr ds:[1F08C0]   | xor 0x4E
001C196D | 0F1100              | movups xmmword ptr ds:[eax],xmm0    |
001C1970 | 8D40 10             | lea eax,dword ptr ds:[eax+10]       |
001C1973 | 83E9 01             | sub ecx,1                           |
001C1976 | 75 E2               | jne bosskey_19.9.0.3.1C195A         |

恩… 很简单的加密。

枚举每个字节,然后 b = (b - 0x05) ^ 0x4E 即可。

然后dll的重定位那么多,他启动器修复不复杂么

照着 .reloc 表(重定向数据)修就好。

.reloc 节说明:https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#the-reloc-section-image-only

完全实现了dll不落地

很常见的技术,随便搜了个:https://github.com/fancycode/MemoryModule

你也可以参考 React OS / Wine 的实现。

基本原理就是自己实现 LoadLibrary 过程。

大概流程是解析 PE 文件,然后每个节都申请内存 + 对应的权限,处理好导入表和重定向,然后手动调用一下 DllEntry 函数初始化。

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
610100 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
bester + 3 + 1 我很赞同!
朱朱你堕落了 + 2 + 1 技术好厉害,大佬威武!

查看全部评分

leedun 发表于 2023-10-3 13:45
大神,我的求助帖在win7好像不行,还是期待你的成果
董督秀 发表于 2023-10-4 17:32
本帖最后由 董督秀 于 2023-10-4 20:52 编辑

@leedun 针对bosskey22.0.0.3 这个版本编译了份补丁。
这个22.0.0.3是从这里下载的 -> https://www.52pojie.cn/forum.php ... 00&pid=48132918
对应的补丁下载地址 -> https://t.wss.ink/f/cca99m216s3


2023-10-04_172502.jpg

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
leedun + 1 + 1 谢谢@Thanks!

查看全部评分

leedun 发表于 2023-10-4 22:07
董督秀 发表于 2023-10-4 17:32
@leedun 针对bosskey22.0.0.3 这个版本编译了份补丁。
这个22.0.0.3是从这里下载的 -> https://www.52poji ...

这个win7能用吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 07:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表