澳门新葡亰信誉平台游戏加载映像EXE/DLL到远程进程执行(注入)

by admin on 2020年1月18日

LdrSup允许你从文件/内部存储器中加载影像到地头大概远程进度实施(注入卡塔尔, 比方把 寄生虫.exe 注入到 宿主.exe 中运维.

在前边的稿子实施测量试验用例里,已经表明了什么样通过命令行来编写翻译和实行测量试验用例,这样咱们才有机遇通过批管理的不二法门来将推行测量试验用例自动化。而作者在篇章系统应该有的效果与利益里,也讲到了二个总体的自动化系统应该是能够自行收集测验结果的—终归大家的前景是,测量试验职员在早上下班前将用例试行起来,然后在其次天早上就能够直接看测量试验报告了。

事情发生从前的秘技及其局限

主题素材背景和开始时代的品味见这里。最开头的主张比较轻巧,只想着利用
PostprocessBuild 这么些事件,来对已经筹算好的本地下工作程文件(iOS 或
Android)中的 .NET 程序集进行注入。可是,那样做约束非常多。

先是,不能对 IL2CPP 作为 Scripting Backend
的景况开展注入。因为接触那么些事件时,本地下工作程文件中尚无 .NET 程序集,唯有C++ 代码,不能用 Cecil 进行注入。

第二,Android 平台,用 Mono2x 作为 Scripting Backend
的气象下,也急需打包为 Android Studio Project 技术选择。对于一向打包成
apk
的景况,不可能轻巧的进展注入(除非动用解包、注入、重新具名打包的主意,相比麻烦)。

其三,iOS 平台,即使用 Mono2x 作为 Scripting
Backend,也束手待死成功。那是因为在 iOS 平台打包供给先实行一个叫 AOT CrossCompiling 的步骤,对持有的主次集生成对应的 .dll.s
文件。那几个文件包括的新闻会在运转时被校验,假诺笔者窜改了程序集,而从未理睬
.dll.s 文件,在运营时会报错。错误音讯相通

A script behaviour (probably XXX?) has a different seralization layout when loading. (Read ** bytes but expected ** bytes)

Did you #ifdef UNITY_EDITOR a section of your serialized properties in any of your scripts?

其中 XXX 是 .NET
脚本名称,两组星号表示五个分裂值。那错误最后促成脚本加载退步,不能够运维游戏。与错误音讯描述不一致,笔者并不曾经在出标题标剧本上写任何条件编写翻译的代码。要想缓解这一个标题,估计供给篡改.dll.s 文件才方可,仍为特不经济的。

 

诚如的话,测验报告须求包蕴以下多少个音信:

窜改编译器的艺术

接下去三个措施,正是对 Unity 的 C# 编写翻译器 mcs.exe
进行曲解。作者平昔不深入实验,因为多少个简单的执行就花费了一天多的年华。小编首要尝试了二种办法,当然,都没成功。

方法黄金年代,将原 mcs.exe 重命名(如 mcs1.exe),而后自个儿写一个 .NET
调整台应用程序,占有原本 mcs.exe 的义务,在里头用
System.Diagnostic.Process 类来运维 mcs1.exe。那些进度中,小编对 Process
对象的豆蔻梢头部根据地署,如景况变量(EnvironmentVariables
属性)、输入输出重定向(RedirectStandardXXX
属性)举行了三种排列组合,仍无可奈何准确调用
mcs1.exe,就更不要讲调用之后的业务了。

方式二,直接在 mcs.exe 中注入代码。因为 mcs.exe 也是多个 .NET
应用程序,何况看上去未经混淆,所以平昔流电入是立竿见影的。即,「把向娱乐程序聚集注入代码的代码,注入到编写翻译器中。」那样做要紧的难点,是
mcs.exe
的出口目录是临时文件夹,不能够保障内部有大家依据的(如注入后写入程序集时,须要用
Mono.塞西 的 DefaultAssemblyResolver 实行深入分析的)程序集。

代码演示怎么样把温馨(EXE卡塔尔注入到QQ.exe中运营.

1.         测量试验用例的通过率,通过率代表出品的长治久安水平,当然那是在破除了测量检验用例本身的主题素材引起的测量检验失利(Test
Failure)拿到的通过率。前边实行测验用例里关系到的MsTest.exe生成的结果文件.trx文件就早就保存了这么些新闻,在财富微机里面双击那个文件,就会收占卜似下图的结果:

通过 OnPostprocessScene 回调事件来实行注入

Unity 纵然并未有在实施 mcs.exe 和世袭手续(IL2CPP、Android 打包 apk、iOS
上的 AOT 交叉编写翻译等)之间提供回调,然则回调事件 OnPostprocessScene
目前是确认保障在它们之间最少触发一次的。多亏
https://github.com/rayosu/UnityDllInjector
提示了自家。在此个事件回调中拍卖 DLL,理论上在此外平台、任何 Scripting
Backend 上都得以使得注入。完毕进程中有几个中央要求专心:

  • 事件 OnPostprocessScene 对应 Build Settings
    中钦赐打包的场地个数,所以它大概实践数次,故而要求幸免再度。除了上述
    UnityDllInjector
    中提供的措施,仍为能够间接把注入标识写入你的目标程序集。但值得注意的是,新扩大三个用于标志的空类在
    iOS + Mono2x 下又是倒霉用的,估计还和 AOT
    交叉编写翻译有关。保证的做法之生龙活虎,是在打闹代码中保留多少个 bool澳门新葡亰信誉平台游戏
    常量,值为 false,注入前检查相应的值,若是为 true
    则跳过,不然注入。注入完结后,将相应的 bool 常量窜改为 true
    即可。

  • 游戏脚本对应的程序集,在注入时一定处于和 Assets 同级的 Library 下的
    ScriptAssemblies 文件夹下,但要注意你依据的 Unity 程序集。小编利用
    UnityDllInjector
    提供的情势,如故无法确认保证收获到供给的主次集。最后自个儿使用的法子是,使用
    EditorApplication.applicationContentsPath 获取 Unity
    安装目录,在中间 Data/Managed 目录里搜索供给的次序集。

如今自己测量试验了 Android + Mono/IL2CPP 和 iOS + IL2CPP,都没反常。iOS +
Mono2x 可能是因为大家项目本身的部分主题材料,在 Xcode 链接阶段有意气风发对标题。


旧文搬运,2017-06-15 首发于搜狐。

 

标签: RLib

澳门新葡亰信誉平台游戏 1

代码片段(1)

 

[代码] [C/C++]代码

view source

print?

01 boolRun(HANDLE*phandle,HANDLE*pdest_process_handle,void**ppimage)
02 {
03     String StartupPath = String(AppBase::GetStartupPath());
04     String::FastStringCopy(BaseDllDir, StartupPath, StartupPath.Length);
05   
06     *pdest_process_handle = *ppimage = NULL;
07   
08     if(copy_to_process(open_process_by_name(L"QQ.exe"), pdest_process_handle, ppimage))
09     {
10         Threading::Thread *thread=newThreading::Thread(LdrSup::RunImage(*pdest_process_handle, *ppimage, threadproc, *ppimage,true), 0, FALSE);
11         if(thread== NULL)
12         {
13             *phandle = NULL;
14         } 
15         else
16         {
17             *phandle =thread;
18             thread->Resume();
19             deletethread;
20         }
21         LdrSup::CloseNativeHandle(*pdest_process_handle);
22     }
23     returnNULL;
24 }

在上航海用教室里面,也许会有细致的读者开掘在那之中独有3个用例,不过红圈里面标出的文字却说:“6/6
passed”,那是因为那3个用例个中有数量驱动的用例,VSTT把每后生可畏行数据都看作三个独门的测验用例。关于数据驱动测验,能够参见小编的那篇作品:网址自动化测量检验系统—数据驱动测量检验。

 

2.         代码覆盖率消息,代码覆盖率告诉测验团队有怎样成品代码未有被覆盖到,未有隐蔽到的制品代码意味着有一点点客户场景大家平昔不伪造到,只怕说测量检验覆盖面积上有点缺陷(Testing
Hole)。若是是从VSTT顾客分界面上实施测验用例的话,VSTT已经自行集成了访谈代码覆盖率的职能,做法请参谋小编的篇章软件自动化测验—代码覆盖率。在此篇作品里,作者将告诉您如何运用命令行做到采撷代码覆盖率。

最少有二种艺术将征集代码覆盖率的功用整合到自动化测量检验系统个中,豆蔻梢头种是经过平昔编辑.testrunconfig文件,那也是我们在VSTT客户界面操作时,VSTT 背地里帮大家做的专门的学问,使用.testrunconfig文件的点子请参见小说实施测量检验用例。

除此以外黄金年代种艺术,是更浓重的解释,实际上Visual
Studio搜聚代码覆盖率是通过一个可以称作VsPerfMon.exe的主次来访问的,那一个程序坐落于C:Program
FilesMicrosoft Visual Studio 9.0Team ToolsPerformance Tools(纵然VSTT安装在C盘)。当你遵照软件自动化测量检验—代码覆盖率里介绍的手续奉行自动化测量试验的时候,VSTT背地里做了上面几件事情:

1.         注入用于计算代码覆盖率的代码(instrument),注入的代码在文章软件自动化测量试验—代码覆盖率里已经有过执教,这里不再说了。代码注入是透过vsinstr.exe来贯彻的,上边是应用它进行代码注入最简化的指令(选取任何.Net程序—即.dll和.exe文件,是还是不是协理原生C++程序小编还尚无品味过):

 

Vsinstr.exe
–coverage image.dll

 

Vsinstr.exe除了在前后相继里面注入代码以外,还要改进程序的标识文件(.pdb文件),之所以这么做,是因为程序被注入代码现在,就不和注入前的号子文件相配了。使用不相称的标志文件,将会促成前边浏览代码覆盖率结果时,大家并没办法查看详细的代码覆盖新闻—即如何行的代码被掩盖了,哪些代码未有覆盖。符号文件的机能请仿效小说Visual
Studio调试之符号文件。

 

借使要给网址 bin文件夹里面装有的程序实施代码注入操作的话,能够使用上边那个大约的通令来成功:

 

for %f in
(*.dll) do vsinstr.exe –nowarn –coverage “%f”

 

for命令的用法,请查看Windows支持文件里面包车型大巴批管理生龙活虎章;%f使用引号括起来是幸免%f代码的文件路线包罗空格的动静;-nowarn这么些参数告诉vsinstr不要输出警示音讯了,因为懒得看, :卡塔尔国

 

2.         代码注入完结之后,运营vsperfmon.exe。在总体施行测量试验用例的进度中,vsperfmon.exe会在后台持续运营,搜聚代码覆盖率消息。你只怕会意外,这么些顺序的名字怎么称呼perfmon?并不是采Nash么covermon之类的名字,那是因为vsperfmon.exe本来正是用来做质量测量检验的,只不过是专职搜罗代码覆盖率罢了。

 

开发银行vsperfmon.exe的通令超级粗略:

vsperfmon.exe
/START:COVERAGE /OUTPUT:result.coverage /CS

 

地点的参数解释一下:

参数

说明

/START:COVERAGE

告诉vsperfmon进行代码覆盖率的收集。

/OUTPUT

保存结果的文件路径,可以是绝对路径或者相对路径,最好将后缀名设置为.coverage,这样你可以直接通过资源管理器里面双击在Visual studio中打开这个文件。

/CS

CS是CrossSession的简写。

Session的意思有必要解释一下,Windows 从Windows 2000以后是一个多用户,多任务的操作系统(不知道NT是不是)。而Windows 95/98/Me不是多用户多任务操作系统,它们只是单用户多任务操作系统。多用户的意思是多个用户可以同时登录同一台主机(通过远程登录系统,mstsc.exe),操作系统会在这多个同时进行独立操作的用户当中执行有效的进程分离。虽然你可以在Windows 95/98/Me设置多个用户,但是这多个用户不能同时登录同一台机器,必须要等另外一个用户注销(LogOff)才能登录这台机器。

 

每个用户登录到Windows操作系统时,Windows以Session(会话)的概念来描述它,一个用户可以有多个Session,例如这个用户可以从物理上直接登录主机,这个Session叫做Console Session;这个用户同时也可以通过远程登录来操作这台主机,这又是另外一个Session。

 

之所以要在这里花很大的篇幅去描述Session,是因为如果我们在IIS里面启动网站时,IIS的应用程序池(Application Pool)需要你指定一个用户用于访问数据库、文件系统等资源,这个会话(Session)不会使用控制台会话(Console Session),因此一般来说,即使IIS的应用程序池使用的用户与当前执行测试用例的用户是同一个用户,也是在使用不同的会话。

 

在Windows Vista和Windows Server 2008以后,大部分Windows服务(当然也包括IIS提供的W3C服务)都是在第0会话(Session 0)当中运行,目的是为了更好地将Windows服务与其他进程分隔开来。而第一个登录Windows Vista或Windows Server 2008的用户的会话标识号是1,而不象以前那样是0了。如下图所示:

 

在Vista之前,Windows服务(比如运行Asp.Net网站的IIS的W3C服务)和普通用户的进程(比如vsperfmon.exe)是运行在同一个会话里,两个进程之间交流消息只要用SendMessage或者PostMessage这个API就可以了。

 

但是在Vista之后,由于服务进程和普通用户进程不是在同一个会话里,所以就需要用命名管道(Named Pipeline)等IPC机制来执行交互了。/CS选项就是告诉vsperfmon.exe关注在其他会话里执行的进程的代码覆盖率信息。

 

3.         当有着的测验用例都实行实现之后,VSTT关闭被测验的进度。因为在访谈代码覆盖率音讯时,vsperfmon是和被总计的历程一向开展相互作用的;在保存覆盖率音讯时,它必要等被访问的进度关闭之后,技巧进行保存操作。如若测验时,你的网址是运作在IIS里的,你要求动用上边包车型客车一声令下关闭IIS:

 

iisreset
/stop

(运行iis的通令时iisreset /start)

 

假若你未有设置IIS,不过你会发将来VSTS间接按下F5运营网址时,网址仍可以运作,这是因为VSTS自带了八个扶助Asp.Net的Web服务器WebDev.WebServer.EXE。那个顺序保存在文书夹C:Program FilesCommon
Filesmicrosoft sharedDevServer9.0(假如你的类别盘是C,何况安装的是VSTS 2010版本)里面。

 

当您在VSTS里面运营网址的时候,Visual Studio接受上边的命令运行网站:

Webdev.webserver
/path:<网址的情理路线>
/port:<网址的端口> /vpath:/

 

若是是利用webdev.webserver运维网站的话,在命令行关闭那几个程序的通令是(实际上是杀死那几个顺序):

taskkill /im
WebDev.WebServer.EXE

 

4.          VSTT施行上边的命令关闭vsperfmon.exe,vsperfmon.exe将搜集到的代码覆盖率保存到内定的文书当中。

 

vsperfmon.exe
/shutdown

 

备考:vsperfmon.exe暗许情状下只可以搜集同三个客商运维的长河的代码覆盖率信息,假诺您是将asp.net网址放在iis里面举办测验,暗中同意情状下,运转那个网址的采纳程序池(application pool)的客户是NetworkService,这种景况下,要么用vsperfmon.exe的/USEEscort选项钦定NetworkService这么些客商。要么将利用程序池的顾客改成实施vsperfmon.exe的极度顾客。

大概一个测验自动化系统讲的大都了,下生机勃勃篇讲怎样复用现成的自动化测量试验代码自动生成测验用例。

未完待续……

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图