首页
社区
课程
招聘
[讨论][求助]vmprotect小bug,如果是bug请帮反馈给作者
发表于: 2015-3-9 03:10 14018

[讨论][求助]vmprotect小bug,如果是bug请帮反馈给作者

2015-3-9 03:10
14018
我写了个dll,这个dll会自己重定位,也就是把自己清空,再填回来运行

vmp乱序,一共加了3处,测试3处都运行正常。
vmp虚拟化,一共加了3处,测试第3处不能正常运行,windows弹出异常错误,提示dll unload,含义是dll已经被卸载

用safengine虚拟化,一共加了3处,测试3处都运行正常

第3处代码如下,一个线程!
procedure dllfun_;
begin
while 0 = 0 do
begin
asm db $EB,$10,'VMProtect begin',0 end;
messagebox(0,'dllfun_','',0);
asm db $EB,$0E,'VMProtect end',0 end;
sleep(10000);
end;
end;

所有问题都是因为重定位,但是这个重定位是原位置填回,也就是稳定性上没问题,目前肯定是vmp的加密流程上有bug,小bug,这种bug很少见。

我怀疑vmp是不是调用了getmodulehandle后出虚拟机,此时dll模块不存在的,这样好不效率啊,除了这样想,我实在没办法找出问题原因。

这回,感觉到了国产货的强大!!!但是要联网!!

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

收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
加壳的时候联网没关系吧…
2015-3-9 08:55
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
3
不明白“填回”的准确含义及为什么要这么做。

从原理上讲,Dll载入后,GetModuleHandle取基址,基址在这个进程中就是常量。
因为VMP在生成虚拟代时是基于PE文件头的"Image base",在模块载入后需要按实际地址进行修正。实际上,这就是“重定位”的含义,无论这个模块加密与否。
当VMP的虚拟代码执行,基址在VM初始化时放入某个VM寄存器。在这段VM代码要访问内存时,都要用保存在VM寄存器的基址进行“重定位”!
正常的模块,“重定位”在载入时只做一次;而VM后的代码,随时都要进行的!效率上肯定要作出牺牲,还有大量的垃圾虚拟代码。

这样看来,按理只要保证两次载入的基址相同就不会有问题。
“此时dll模块不存在的”,怀疑VMP取得的基址和现在的实际基址不同!你稍微跟一下就可以确认。
不知道你这个Dll是用那种方式载入的。通常,在Windows XP下Dll每次的基址是固定的;Windows 7以上,不作处理,每次肯定不同。

另外,还有IAT,显然与基址有关。

请检查报错的第3处代码,与前面2处成功的区别。我现在看到一个MessageBox,可能问题出在IAT上。

大家都知道,VMP的IAT是“加密”的,举个例子:
[FONT="Courier"]; 模块基址:10000000。
; 这个Call实际上是调用 7C80934A kernel32.GetTickCount(Windows XP),去除了垃圾指令。

1000EA74   E8 23CF4700               CALL    1048B99C
...
1046E66F   B8 486C0110               MOV     EAX, 10016C48
1046E674   FF7424 04                 PUSH    DWORD PTR [ESP+0x4]
1046E678   8B80 8C114400             MOV     EAX, DWORD PTR [EAX+0x44118C]      ; 10016C48+0044118C=10457DD4
        [10457DD4] = 9D0186DE
...
1044021B   8D80 6C0C7FDF             LEA     EAX, DWORD PTR [EAX+0xDF7F0C6C]    ; 9D0186DE+DF7F0C6C=7C80934A[/FONT]
2015-3-9 11:17
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
dll1加载后,自己在内存里拷贝一份镜像,再复制一个dll2,并加载,然后用复制的dll2把第dll1卸载,并把镜像填回dll1的base地址,然后用dll2启动无模块内存中的线程,然后再卸载掉dll2,于是加密后的线程会触发错误,系统抛出dll unload相关字眼,ps:所有代码都是原样!!!

vmp加密机制太复杂,没文档,所以我也没办法,暂时只能用safengine的虚拟化加密!当然用vmp的变异加密,不会出任何问题。

我对整个dllsize做的拷贝,也就是全拷贝了,那么原来的有对应dll模块的的内存   =   后来的无对应模块的内存,原样填回,于是用国产加密,不报错,用老毛子的就报错,在vmp里找错,不会!

报这种错误,明显是
上传的附件:
2015-3-9 13:50
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个和VMP没关系,PELOADER,就有这样的问题,因为DLL的handle不给系统认可了,所以有些API就有问题了
2015-3-9 13:52
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
明显和vmp有关系,我说的很清楚了呀,哎呀,你怎么还说和vmp没关系

我确定,认定,非常确认,我写的卸载非常完美,原版,不存在卸载不掉,也不存在执行不了,更不存在报错!!改进下,其实是一个万能无模块load,只要把任何一个dll和load放一起,load会自动处理一切问题,你只要写代码时候写的犀利点,忘记模块概念,保证不出错!

肯定vmp用了模块概念,老毛子没遇到我这种情况,我觉得现在问题很清楚了,让老毛子改良,在vmp引擎中放弃模块概念

直白的说,vmp过的函数过程,卸载dll后,在原位置填回去,不一定能执行!!!!!

这次多亏nooby壳,要不,我都不知道加啥壳了
2015-3-9 14:05
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个错误,我仔细看了下,dll卸载后,系统给出了project1.dll_unloaded+偏移处的错误

厉害,系统报错还能知道模块名!!!我都free掉空间,重新在原处申请的!!他还知道是project1.dll,这是一个额外信息!!厉害

我还是冒险去跟一根,虽然看不懂vm,等
2015-3-9 14:14
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你选择最快速度加VMP,看看会不会出错,别用VMP壳
2015-3-9 14:23
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
asm db $EB,$10,'VMProtect begin',0 end;
messagebox(0,'dllfun_','',0);
asm db $EB,$0E,'VMProtect end',0 end;
对应下图的反汇编,在入口断下,开始用od自动跟踪

dll2的确在无模块空间启动了这个线程,我跟踪跑了11万多行代码时候报错了。
上传的附件:
2015-3-9 14:39
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
快速加密,依然报错,vmp选择乱序模式的话,不报错
2015-3-9 14:41
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这图是自动跟踪,在最后一行报错了,最后一行是什么意思,执行到哪里了,出错原因,无效指针!!!,据我的观察,这里是vmp的处理系统函数的关键地方,vmp作者肯定知道为什么会出错,我反正是不知道,按楼上一个高手的回答,那就是vmp每次执行过程都要初始化参数,初始化依赖模块!!!!,具体很复杂,反正我觉得不够完美,复杂难破解是好,但是不完美,不能支持我这种dll我不清楚!反正就一个messagebox!!!!难道vmp加密后的,把输入表都抽走了,每次在虚拟机过程里获取,那nooby壳就不会出错

nooby壳,我加密时候都是默认,也抽取了输入表啊,或许我的思考是错误,具体你们看看是什么原因。

我现在更关心的还有一点,dll都卸载了。操作系统还知道原来这里有个dll名字叫做project1.dll,并报错 ,好打击啊,我都卸载了,他还记载着?

下面我要自己实现动态变型,自动生成10个一样的函数,第一次用第一个,把另外9个free掉,第二次拷贝到第二处,再把另外9个卸载掉,就这么不断卸载来卸载去!拷贝流程增添算法,如果破解者阻止拷贝,算法不对的话,就把所有空间free了!

哈哈,下面还想干一件事,就是自己塞代码到函数里,一行塞一个,实现自动变异,无视特征码!~~~~过程绝对不出错,啥函数,想怎么写怎么写,看那些定位特征码的人,拿啥定位!!~

内在保护好了,就可以对付线程白名单检测了!~~~弄好了就无视检测了吧,就算有也没有裤子被脱的感觉
上传的附件:
2015-3-9 14:46
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
别用 asm db $EB,$10,'VMProtect begin',0 end;

这种

在优化的情况下,函数头尾,没保证

用 map 那种找函数名字的方式
2015-3-9 14:57
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我估计有dll存在时候vmp用了一些不泄露资源的函数申请了空间,存储了一些信息,我卸载dll后,这些空间也卸载了~~~哈
2015-3-9 15:11
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你说的是,我还从来没用过map,我去了解下,不过我看过流程了,vmp识别正确
2015-3-9 15:13
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不是识别正确,最理想的情况哪宏在,是在函数头 push ebp 那个执行前   ret 后   但是偏偏就不是那么回事,还是用map的方式,那是很完美的
2015-3-9 18:19
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
16
MAP方式是首选,但问题似乎不在这里。
可能是Dll unload造成的,#13楼已经意识到这点。

设想一下,Dll载入时VMP在Process Heap申请一块空间,写入一些关键数据,比如Dll的Module Handle。
Dll卸载时,这块数据被释放掉了,回填的代码再去访问这些数据,必然出错,“无效指针”。可视为VMP的一种ANTI,而不是BUG!
以前在分析某个VMP保护Dll里的虚拟代码时,遇到过这种情况。

其实,“无模块”,你没必要兜这么大的圈子。
自己实现LoadLibrary:
按Dll的PE头+映像大小申请内存,再按PE头、各区段大小细分,复制头、各区段数据,重定位,Imports/Exports thunking,修改各区段内存属性,调用DllEntry。
大致过程就是这样,可以试试。
进一步,这些Project?.dll可全部放到xx.exe里。但是VMP保护的Dll有个文件校验,需要处理。
2015-3-10 11:38
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我这么实现,是为了兼容性,自己实现load过程的话,怕加壳后问题大的多,至少我这样,用se壳没问题

待会试试,拷贝面积大点

万一成功了,那正好可以这样破解一些dll,记住dllbase,和破解点,然后再其他机器抢先申请指定内存,注入,跑起来~~~

再问楼上一个问题,无模块dll,你实现过带窗体的无模块dll不,我测试不行,dll窗体没创建,但是把单元带进去编译,鼠标切换exe界面,就会报错,鼠标不动不错,怀疑是消息导致的,或许delphi编译器不原生,打算改良dll
2015-3-10 14:04
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
18
你这种方法还真没试过。
如果要坚持这么做,可以把Dll里Form等GUI的东西移到Exe里,Dll只实现算法、资源等。

理论上,如果不FreeLibrary,肯定是可以的!你这个Dll又不是写的一个服务,可以用VMProtect自带的Delphi例子去确认。
模块都卸载了,仅恢复Dll Image Memory的代码和数据恐怕不行,这牵扯到系统的一些问题。
自己实现LoadLibrary就可以避免Dll卸载这一步,又达到“无模块”的目的。商用保护软件内部的Dll基本上都是这么处理的。

提醒一下,不知你“恢复”PE Header内存段没有!?
这个非常重要。一方面,运行时依赖里面的信息。另一方面,在任何一个VMP虚拟化的代码块内,都会进行随机内存校验,如果那张表里恰好包含这部分内容,而又没有“恢复”的话,随时会挂掉。

不清楚SE的保护机制,免费版可以,收费版也许就不行。

作为实验,还可试试Themida,用法很跟VMP一样的,map文件或marker都可以。
但是,你这种做法也只有CISC类型的VM可用,其它VM类型的代码和数据有部分不在Dll image的内存范围内,也需要保存、恢复,很麻烦的。

或者就用VMProtect的"DLL Box",Themida的XBundler功能,可能不符合你的期望。
2015-3-11 13:29
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
https://www.supersoftengine.com/super.htm
这里有个注入器,可以完美运行你说,什么窗体之类的

SuperInjectEngine

一款支持X86 X64全系统的驱动级注入解决方案

支持所有基于标准PE结构的DLL 以及MFC类DLL

支持各类主流pe保护后的DLL 如Themida Safengine等
可让注入后的DLL用xuetr等rootkit工具看不出来

视频演示以及软件下载
2015-3-11 17:01
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看到e就跑!哈,不玩,看到e,感觉一身病毒
2015-3-12 23:46
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
dllbase  +  size   完整的内存,od模块界面里显示的那个,没用的,我复制了全部的

问你下。商业保护,load dll,稳定性很高?随便加密?我原来写这个东西就是想到,我先正常内存加载,这一步肯定稳定,然后整体拿走,整体搬回,我认为稳定,至少无壳dll,非常稳定的说
2015-3-12 23:48
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
dllbase是从dos头开始的  +  size   完整的内存,od模块界面里显示的那个,没用的,我复制了全部的

问你下。商业保护,load dll,稳定性很高?随便加密?我原来写这个东西就是想到,我先正常内存加载,这一步肯定稳定,然后整体拿走,整体搬回,我认为稳定,至少无壳dll,非常稳定的说,貌似加se有时候也出错,等几天,我确定能随便加se再跟帖,现在没空测试
2015-3-12 23:54
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
23
建议不要再浪费时间做这种无谓的实验了。

DllMain entry point (Windows)
When the system starts or terminates a process or thread, it calls the entry-point function for each loaded DLL using the first thread of the process. The system also calls the entry-point function for a DLL when it is loaded or unloaded using the LoadLibrary and FreeLibrary functions.

先不说被保护的Dll,就算是一个无壳Dll,设想下面这种最基本、普通的场景:
Dll里的函数需要一块内存,保存这个Dll生命期间要用的数据。通常为方便,内存的请求和释放放在DllMain里。
LoadLibrary时,系统调用一次DllMain,这里你可以进行一些初始化的工作,比如申请内存,保存指针/句柄。
FreeLibrary时,系统再次调用DllMain,这次你得到清理的机会,释放内存、关闭句柄等等。

显然,FreeLibrary后,好多东西都不存在了,还要去访问,必定出问题。

对一个加壳的Dll,从DllEntry到DllMain/OEP之间的壳代码几乎可以肯定会有动态内存分配,用于保存VM运行时的数据,或者一些校验、标志信息,甚至VM的代码。
所以VMP的运行异常;SE的也时好时坏,不稳定,这个方案就没有实际意义了。

就好比一个婚姻,如果注定是要离的,那干吗要结呢!既然结了(LoadLibrary),就不要离(FreeLibrary),这样 Everybody Happy!

如果既想“在一起”,又不愿意“结”,就只能造成“事实”:自己实现LoadLibrary的过程。
无非就是把PE文件,展开成PE映像,应该可以找到现成的源代码,稳定性没什么好耽心的,而且与Dll是否加壳毫无关系。
2015-3-13 11:19
0
雪    币: 56
活跃值: (1548)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
你先在xp测试吧,win7以上系统难免不出错,兼容性问题
2015-3-27 11:19
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
在做同样的东西,2.12版是正常的,新买了3.05版报相同的错。
2016-2-17 11:46
0
游客
登录 | 注册 方可回帖
返回
//