首页
社区
课程
招聘
[解决] SSQ flexlm netapi32.dll的破解原理 简析
发表于: 2023-5-28 14:27 12638

[解决] SSQ flexlm netapi32.dll的破解原理 简析

2023-5-28 14:27
12638

通过这段时间的逆向,基本理清楚了ssq补充的原理,也基于此自己编出了fake netapi32.dll。

 

更新的内容见后面的帖子。

 

发现ssq的flexlm破解补丁比较通用,通过netapi32.dll做了loader的工作,但是因为拿到手的netapi32.dll加了壳,比较菜,不会脱壳,搞不懂原理。

 

请教懂的大牛,帮忙解释解释SSQ netapi32.dll 破解flexlm的原理,以及对于ecc的flexlm目标来说,覆盖这个dll后,license里面的各个字段尤其是sign怎么办?

 

感谢。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-6-13 17:26 被coolspace编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

目前我表面的能看到的逻辑如下。


fake  netapi32.dll的dllmain里面,新建一个mutex,之后对GetEnvironmentVariableW和RegOpenKeyExW下hook。


hook的新的fakeGetEnvironmentVariableW和fakeRegOpenKeyExW函数里面,分别会判断 lpName参数和lpSubKey参数。


如果这个参数是LM_LICENSE_FILE 或 SOFTWARE\\FLEXlm License Manager,说明调用来自flexlm的dll,这个时候通过getModuleHandleExA获得flexlm函数所在的模块handle。对这个flexlm模块进行patch。


这里的flexlm模块patch的逻辑,没看明白,里面壳和混淆什么的太多,晕了。


希望清楚的大侠帮忙解释解释。


感谢。

2023-5-28 21:22
0
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

自己补充下内容: 由于netapi32.dll loader本身 ollvm的很严重,静态分析比较困难。所以换了个思路,比较了下经过内存patch之后的调用flexlm的dll/exe与patch前的dll/exe,发现ssq的方法是patch了 l_pubkey_verify 函数的头部,修改为了   xor eax, eax retn。 但是netapi32.dll里面怎么定位到每个调用flexlm的dll/exe的l_pubkey_verify函数的具体位置的,目前还没搞明白逻辑。 有明白的大侠可以指点一二。



上传的附件:
2023-5-30 22:37
0
雪    币: 4605
活跃值: (4527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
当时我也想看是怎么patch的,发现混淆了,就没搞了
2023-5-31 07:25
0
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

记录一下最新进展。

大体上理清了SSQ是怎么定位l_pubkey_verify函数并patch的。

hook后,当被hook的函数开始被调用的时候,就回去检查是否是flexlm target,如果是再去检查是否已经patch过。没patch的话就会从PE header之后开始搜索16进制 0x2655.


SSQ认为若一个函数同时满足如下条件,那他就认为这个函数是l_pubkey_verify


1.  能搜索到16进制0x2655

2.  在出现0X2655之后,0xFA的字节范围内接着出现了0xffffff8c

3.  0xffffff8c出现之后,后续很快出现0xb8并且0xb8之后紧跟着就是0xffffffd3,或者很快出现0xc7,并且0xc7之后第六个字节开始是0xffffffd6。



当定位到l_pubkey_verify之后,就开始向前回溯,找到l_pubkey_verify函数头,并patch掉。


2023-6-4 14:33
1
雪    币: 4605
活跃值: (4527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
coolspace 记录一下最新进展。大体上理清了SSQ是怎么定位l_pubkey_verify函数并patch的。hook后,当被hook的函数开始被调用的时候,就回去检查是否是flexlm target,如果是再去检 ...
他是采用什么方法回溯到函数头的呢
2023-6-4 22:00
0
雪    币: 6323
活跃值: (1452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
为什么x64dbg里直接没有netapi32的加载痕迹呢,这都是我这个菜鸟不明白的地方
2023-6-7 12:15
0
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
先往前回溯足够的长度,之后开始进行汇编指令识别,一直找到最后的retn,再跳过函数间的无效指令填充,就到了
2023-6-13 17:12
0
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
x64dbg里看不到加载痕迹,可能和篡改了teb里的数据有关

       LIST_ENTRY* head = &NtCurrentTeb()->ProcessEnvironmentBlock->Ldr->InMemoryOrderModuleList;
       LIST_ENTRY* next;
       for (next = head->Flink; next != head; next=next->Flink)
       {
               LDR_DATA_TABLE_ENTRY* pEntry = (LDR_DATA_TABLE_ENTRY*)CONTAINING_RECORD(next, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
               if (pEntry->DllBase == hModule)
               {
                       pEntry->FullDllName.Buffer[0] = '0';
               }
       }
       return 0;
2023-6-13 17:14
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
coolspace 记录一下最新进展。大体上理清了SSQ是怎么定位l_pubkey_verify函数并patch的。hook后,当被hook的函数开始被调用的时候,就回去检查是否是flexlm target,如果是再去检 ...
netapi.dll的patch只补丁l_pubkey_verify函数吗?
2024-4-24 16:45
0
雪    币: 107
活跃值: (2274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
对flexlm来说,只patch了这个地方
2024-4-25 08:29
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
coolspace 对flexlm来说,只patch了这个地方

有的教程说ecc要补丁两个地方,其中一个是l_pubkey_verify,还有一个找死法的地方,netapi32仅改函数头吗?有的介绍改调用的结尾。

最后于 2024-4-25 14:35 被学习班编辑 ,原因:
2024-4-25 13:48
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主,请教一下修改内存比较你是怎么实现的,用什么工具。谢谢
2024-4-25 17:06
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
netapi32.dll除了patch函数是l_pubkey_verify还做了什么,我用dll没问题,直接修改是l_pubkey_verify头部修改成一样,在操作时退出,是不是也有校验操作。请教一下楼主。
2024-4-27 22:16
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
netapi32.dll除了patch函数是l_pubkey_verify函数外,应该还有进行内存校验方面的操作,一个软件直接patch函数l_pubkey_verify不可以,但用netapi32.dll又可以正常使用。
2024-4-29 14:07
0
雪    币: 1641
活跃值: (7329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
是你修改的不对!
2024-4-29 14:25
0
雪    币: 270
活跃值: (2639)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
最新 x64 11.19已失效
2024-4-29 14:32
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
wandering 是你修改的不对!
要怎么修改,可以指导下吗?
2024-4-29 16:22
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这个netapi32.dll有进行堆栈平衡方面的操作吗?或者内存完整性方面的修复。
2024-5-1 18:55
0
雪    币: 1641
活跃值: (7329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
人家就是直接做了一个补丁
2024-5-1 23:00
0
雪    币: 2086
活跃值: (3434)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主有没有重写一个dll实现这个功能,新版本19不适用了,应该是特征码改了。
2024-5-3 14:17
0
雪    币: 162
活跃值: (239)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我这有个linux版本 LD_PRELOAD  没有壳 想看看的Q我 80982871
2024-5-4 11:49
0
雪    币: 1641
活跃值: (7329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
自己编出了fake netapi32.dll,可以看看吗?
2024-7-4 10:41
0
游客
登录 | 注册 方可回帖
返回
//