朱朱你堕落了 发表于 2023-9-30 10:22

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

本帖最后由 朱朱你堕落了 于 2023-9-30 18:30 编辑

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

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

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

遇到几个问题,

https://im.gurl.eu.org/file/ecb73d729287106117eec.png

看截图如示,当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
(软件有随机基址,为了方便调试,请先去掉随机基址好些,我这上传的原版,没有去除。)

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

爱飞的猫 发表于 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 提取、脱壳过程
>
> 首先下 `VirtualAlloc` 与 `VirtualProtect` 断点,然后正常运行;
>
> 依次查看函数的返回地址,其中有一个返回后是这样:
>
> ```x86asm
> 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。

bester 发表于 2023-9-30 13:05

它似乎 模拟了windows的装载过程,dump要考虑的东西太多了,要修复很多东西,不如smc

董督秀 发表于 2023-9-30 14:21

个人感觉,固定申请空间的基址,不如考虑通过代码实现动态获取该基址,之后加偏移定位。很多一键加的网络验证就是这种动态申请的基址……

朱朱你堕落了 发表于 2023-10-1 08:53

爱飞的猫 发表于 2023-9-30 10:22
dump 出来,魔改,然后重新写个 DLL 加载器就好。

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

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

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

转存这块内存区域即可;提取到这块内存区域结束即可。

bester 发表于 2023-10-2 01:15

爱飞的猫 发表于 2023-9-30 10:22
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:



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

简单看了下:

```x86asm
001C1950 | B8 20F01F00         | mov eax,bosskey_19.9.0.3.1FF020   |
001C1955 | B9 20290000         | mov ecx,2920                        |
001C195A | 0F1000            | movups xmm0,xmmword ptr ds:    |
001C195D | 66:0FF805 B0081F00| psubb xmm0,xmmword ptr ds:| - 0x05
001C1965 | 66:0FEF05 C0081F00| pxor xmm0,xmmword ptr ds:   | xor 0x4E
001C196D | 0F1100            | movups xmmword ptr ds:,xmm0    |
001C1970 | 8D40 10             | lea eax,dword ptr ds:       |
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 的实现。

- https://github.com/reactos/reactos/blob/dd54cd3/dll/win32/kernel32/client/loader.c#L288 -> https://github.com/reactos/reactos/blob/master/dll/ntdll/ldr/ldrutils.c#L2429
- https://github.com/wine-mirror/wine/blob/27ab696/dlls/kernelbase/loader.c#L528 -> https://github.com/wine-mirror/wine/blob/27ab696752294f6b847515fe0bd905d448d26e64/dlls/ntdll/loader.c#L2622

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

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

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?mod=redirect&goto=findpost&ptid=1839400&pid=48132918
对应的补丁下载地址 -> https://t.wss.ink/f/cca99m216s3


leedun 发表于 2023-10-4 22:07

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

这个win7能用吗
页: [1] 2
查看完整版本: 求助:去除软件升级引发的一系列问题