能力值:
( LV2,RANK:10 )
2 楼
加壳的时候联网没关系吧…
能力值:
( 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]
能力值:
( LV2,RANK:10 )
4 楼
dll1加载后,自己在内存里拷贝一份镜像,再复制一个dll2,并加载,然后用复制的dll2把第dll1卸载,并把镜像填回dll1的base地址,然后用dll2启动无模块内存中的线程,然后再卸载掉dll2,于是加密后的线程会触发错误,系统抛出dll unload相关字眼,ps:所有代码都是原样!!!
vmp加密机制太复杂,没文档,所以我也没办法,暂时只能用safengine的虚拟化加密!当然用vmp的变异加密,不会出任何问题。
我对整个dllsize做的拷贝,也就是全拷贝了,那么原来的有对应dll模块的的内存 = 后来的无对应模块的内存,原样填回,于是用国产加密,不报错,用老毛子的就报错,在vmp里找错,不会!
报这种错误,明显是
上传的附件:
能力值:
( LV2,RANK:10 )
5 楼
这个和VMP没关系,PELOADER,就有这样的问题,因为DLL的handle不给系统认可了,所以有些API就有问题了
能力值:
( LV2,RANK:10 )
6 楼
明显和vmp有关系,我说的很清楚了呀,哎呀,你怎么还说和vmp没关系 我确定,认定,非常确认,我写的卸载非常完美,原版,不存在卸载不掉,也不存在执行不了,更不存在报错!!改进下,其实是一个万能无模块load,只要把任何一个dll和load放一起,load会自动处理一切问题,你只要写代码时候写的犀利点,忘记模块概念,保证不出错!
肯定vmp用了模块概念,老毛子没遇到我这种情况,我觉得现在问题很清楚了,让老毛子改良,在vmp引擎中放弃模块概念
直白的说,vmp过的函数过程,卸载dll后,在原位置填回去,不一定能执行!!!!!
这次多亏nooby壳,要不,我都不知道加啥壳了
能力值:
( LV2,RANK:10 )
7 楼
这个错误,我仔细看了下,dll卸载后,系统给出了project1.dll_unloaded+偏移处的错误
厉害,系统报错还能知道模块名!!!我都free掉空间,重新在原处申请的!!他还知道是project1.dll,这是一个额外信息!!厉害 我还是冒险去跟一根,虽然看不懂vm,等
能力值:
( LV2,RANK:10 )
8 楼
你选择最快速度加VMP,看看会不会出错,别用VMP壳
能力值:
( 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万多行代码时候报错了。
上传的附件:
能力值:
( LV2,RANK:10 )
10 楼
快速加密,依然报错,vmp选择乱序模式的话,不报错
能力值:
( LV2,RANK:10 )
11 楼
这图是自动跟踪,在最后一行报错了,最后一行是什么意思,执行到哪里了,
出错原因,无效指针!!!,据我的观察,这里是vmp的处理系统函数的关键地方,vmp作者肯定知道为什么会出错,我反正是不知道,按楼上一个高手的回答,那就是vmp每次执行过程都要初始化参数,初始化依赖模块!!!!,具体很复杂,反正我觉得不够完美,复杂难破解是好,但是不完美,不能支持我这种dll 我不清楚!反正就一个messagebox!!!!难道vmp加密后的,把输入表都抽走了,每次在虚拟机过程里获取,那nooby壳就不会出错
nooby壳,我加密时候都是默认,也抽取了输入表啊,或许我的思考是错误,具体你们看看是什么原因。
我现在更关心的还有一点,dll都卸载了。操作系统还知道原来这里有个dll名字叫做project1.dll,并报错 ,好打击啊,我都卸载了,他还记载着? 下面我要自己实现动态变型,自动生成10个一样的函数,第一次用第一个,把另外9个free掉,第二次拷贝到第二处,再把另外9个卸载掉,就这么不断卸载来卸载去!拷贝流程增添算法,如果破解者阻止拷贝,算法不对的话,就把所有空间free了!
哈哈,下面还想干一件事,就是自己塞代码到函数里,一行塞一个,实现自动变异,无视特征码!~~~~过程绝对不出错,啥函数,想怎么写怎么写,看那些定位特征码的人,拿啥定位!!~
内在保护好了,就可以对付线程白名单检测了!~~~弄好了就无视检测了吧,就算有也没有裤子被脱的感觉
上传的附件:
能力值:
( LV2,RANK:10 )
12 楼
别用 asm db $EB,$10,'VMProtect begin',0 end;
这种
在优化的情况下,函数头尾,没保证 用 map 那种找函数名字的方式
能力值:
( LV2,RANK:10 )
13 楼
我估计有dll存在时候vmp用了一些不泄露资源的函数申请了空间,存储了一些信息,我卸载dll后,这些空间也卸载了~~~哈
能力值:
( LV2,RANK:10 )
14 楼
你说的是,我还从来没用过map,我去了解下,不过我看过流程了,vmp识别正确
能力值:
( LV2,RANK:10 )
15 楼
不是识别正确,最理想的情况哪宏在,是在函数头 push ebp 那个执行前 ret 后 但是偏偏就不是那么回事,还是用map的方式,那是很完美的
能力值:
( 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有个文件校验,需要处理。
能力值:
( LV2,RANK:10 )
17 楼
我这么实现,是为了兼容性,自己实现load过程的话,怕加壳后问题大的多,至少我这样,用se壳没问题
待会试试,拷贝面积大点
万一成功了,那正好可以这样破解一些dll,记住dllbase,和破解点,然后再其他机器抢先申请指定内存,注入,跑起来~~~ 再问楼上一个问题,无模块dll,你实现过带窗体的无模块dll不,我测试不行,dll窗体没创建,但是把单元带进去编译,鼠标切换exe界面,就会报错,鼠标不动不错,怀疑是消息导致的,或许delphi编译器不原生,打算改良dll
能力值:
( 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功能,可能不符合你的期望。
能力值:
( LV2,RANK:10 )
19 楼
https://www.supersoftengine.com/super.htm
这里有个注入器,可以完美运行你说,什么窗体之类的
SuperInjectEngine
一款支持X86 X64全系统的驱动级注入解决方案
支持所有基于标准PE结构的DLL 以及MFC类DLL
支持各类主流pe保护后的DLL 如Themida Safengine等
可让注入后的DLL用xuetr等rootkit工具看不出来
视频演示以及软件下载
能力值:
( LV2,RANK:10 )
20 楼
看到e就跑!哈,不玩,看到e,感觉一身病毒
能力值:
( LV2,RANK:10 )
21 楼
dllbase + size 完整的内存,od模块界面里显示的那个,没用的,我复制了全部的
问你下。商业保护,load dll,稳定性很高?随便加密?我原来写这个东西就是想到,我先正常内存加载,这一步肯定稳定,然后整体拿走,整体搬回,我认为稳定,至少无壳dll,非常稳定的说
能力值:
( LV2,RANK:10 )
22 楼
dllbase是从dos头开始的 + size 完整的内存,od模块界面里显示的那个,没用的,我复制了全部的
问你下。商业保护,load dll,稳定性很高?随便加密?我原来写这个东西就是想到,我先正常内存加载,这一步肯定稳定,然后整体拿走,整体搬回,我认为稳定,至少无壳dll,非常稳定的说,貌似加se有时候也出错,等几天,我确定能随便加se再跟帖,现在没空测试
能力值:
( 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是否加壳毫无关系。
能力值:
( LV2,RANK:10 )
24 楼
你先在xp测试吧,win7以上系统难免不出错,兼容性问题
能力值:
( LV2,RANK:10 )
25 楼
在做同样的东西,2.12版是正常的,新买了3.05版报相同的错。