能力值:
( 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的逻辑,没看明白,里面壳和混淆什么的太多,晕了。
希望清楚的大侠帮忙解释解释。
感谢。
|
能力值:
( 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函数的具体位置的,目前还没搞明白逻辑。
有明白的大侠可以指点一二。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
当时我也想看是怎么patch的,发现混淆了,就没搞了
|
能力值:
( 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掉。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
coolspace
记录一下最新进展。大体上理清了SSQ是怎么定位l_pubkey_verify函数并patch的。hook后,当被hook的函数开始被调用的时候,就回去检查是否是flexlm target,如果是再去检 ...
他是采用什么方法回溯到函数头的呢
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
为什么x64dbg里直接没有netapi32的加载痕迹呢,这都是我这个菜鸟不明白的地方
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
先往前回溯足够的长度,之后开始进行汇编指令识别,一直找到最后的retn,再跳过函数间的无效指令填充,就到了
|
能力值:
( 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;
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
coolspace
记录一下最新进展。大体上理清了SSQ是怎么定位l_pubkey_verify函数并patch的。hook后,当被hook的函数开始被调用的时候,就回去检查是否是flexlm target,如果是再去检 ...
netapi.dll的patch只补丁l_pubkey_verify函数吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
对flexlm来说,只patch了这个地方
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
coolspace
对flexlm来说,只patch了这个地方
有的教程说ecc要补丁两个地方,其中一个是l_pubkey_verify,还有一个找死法的地方,netapi32仅改函数头吗?有的介绍改调用的结尾。
最后于 2024-4-25 14:35
被学习班编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
楼主,请教一下修改内存比较你是怎么实现的,用什么工具。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
netapi32.dll除了patch函数是l_pubkey_verify还做了什么,我用dll没问题,直接修改是l_pubkey_verify头部修改成一样,在操作时退出,是不是也有校验操作。请教一下楼主。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
netapi32.dll除了patch函数是l_pubkey_verify函数外,应该还有进行内存校验方面的操作,一个软件直接patch函数l_pubkey_verify不可以,但用netapi32.dll又可以正常使用。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
是你修改的不对!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
最新 x64 11.19已失效
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
这个netapi32.dll有进行堆栈平衡方面的操作吗?或者内存完整性方面的修复。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
人家就是直接做了一个补丁
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
楼主有没有重写一个dll实现这个功能,新版本19不适用了,应该是特征码改了。
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
我这有个linux版本 LD_PRELOAD 没有壳 想看看的Q我 80982871
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
自己编出了fake netapi32.dll,可以看看吗?
|
|
|