借宝地人气再发一贴,讨论如何不依赖外部直接进入到目标进程空间挂接JIT

CodeProject-Jerry 2009-08-17 01:12:11
最近在研究编写.Net的壳(以.Net3.5 SP1环境做开发测试),思路如下:

1.读取要加壳的.Net PE文件,对IL指令进行加密并移动位置(我放到了一个新PE节)
2.一个非托管的DLL,在这个DLL中HOOK JIT编译部分,当对IL指令做即时编译的时候读取并解密

整个过程都是没问题的,现在遇到的问题是如何将非托管的DLL加入到目标的进程空间。最好是直接在PE文件上做改动,这样,只需要复制加壳后的文件,就可以直接在其它机器上运行。
而且JIT HOOK必须在Assembly执行前加载,如果被加密的方法被直接执行而缺少JIT HOOK DLL只会直接报错。

1. 首先想到的办法是修改.Net PE的 Import Table,将自己的DLL导入。
试过之后发现这种方式不行,NT的PE Loader在检测到PE文件时.Net PE时,会在加载前先调用mscoree.dll中的_CorValidateImage检验文件,文件检验格式非法就返回0xC000002B。
而 CorValidateImage 把.Net PE文件的格式限制得非常死,很多东西不允许改。看下面。

text:79005197 push ebp
.text:79005198 mov ebp, esp
.text:7900519A push ecx
.text:7900519B push ecx
.text:7900519C push esi
.text:7900519D mov esi, ecx
.text:7900519F test byte ptr [esi+8], 40h
.text:790051A3 jnz loc_790223BC
.text:790051A3
.text:790051A9 push edi
.text:790051AA lea eax, [ebp+var_4]
.text:790051AD push eax
.text:790051AE call PEDecoder::CheckCorHeader(void)
.text:790051AE
.text:790051B3 xor edi, edi
.text:790051B5 cmp [eax], edi
.text:790051B7 jnz loc_790223C7
.text:790051B7
.text:790051BD push ebx
.text:790051BE mov ecx, esi
.text:790051C0 call PEDecoder::GetNumberOfRvaAndSizes(void)
.text:790051C0
.text:790051C5 xor ebx, ebx
.text:790051C7 inc ebx
.text:790051C8 test eax, eax
.text:790051CA mov [ebp+var_4], eax
.text:790051CD jbe short loc_790051E1
.text:790051CD
.text:790051CF
.text:790051CF loc_790051CF: ; CODE XREF: PEDecoder::CheckILOnly(void)+48j
.text:790051CF push edi
.text:790051D0 mov ecx, esi
.text:790051D2 call PEDecoder::HasDirectoryEntry(int)
.text:790051D2
.text:790051D7 test eax, eax
.text:790051D9 jnz short loc_79005160
.text:790051D9
.text:790051DB
.text:790051DB loc_790051DB: ; CODE XREF: PEDecoder::CheckILOnly(void)-26j
.text:790051DB ; PEDecoder::CheckILOnly(void)-Ej
.text:790051DB inc edi
.text:790051DC cmp edi, [ebp+var_4]
.text:790051DF jb short loc_790051CF
.text:790051DF
.text:790051E1
.text:790051E1 loc_790051E1: ; CODE XREF: PEDecoder::CheckILOnly(void)+36j
.text:790051E1 push ebx
.text:790051E2 mov ecx, esi
.text:790051E4 call PEDecoder::HasDirectoryEntry(int)
.text:790051E4
.text:790051E9 test eax, eax
.text:790051EB jz loc_790223D5
.text:790051EB
.text:790051F1
.text:790051F1 loc_790051F1: ; CODE XREF: PEDecoder::CheckILOnly(void)+1D249j
.text:790051F1 ; PEDecoder::CheckILOnly(void)+1D259j
.text:790051F1 lea eax, [ebp+var_8]
.text:790051F4 push eax
.text:790051F5 mov ecx, esi
.text:790051F7 call PEDecoder::CheckILOnlyImportDlls(void)
.text:790051F7
.text:790051FC xor edi, edi
.text:790051FE cmp [eax], edi
.text:79005200 jnz short loc_7900518B
.text:79005200
.text:79005202 lea eax, [ebp+var_8]
.text:79005205 push eax
.text:79005206 mov ecx, esi
.text:79005208 call PEDecoder::CheckILOnlyBaseRelocations(void)
.text:79005208
.text:7900520D cmp [eax], edi
.text:7900520F jnz loc_7900518B
.text:7900520F
.text:79005215 lea eax, [ebp+var_8]
.text:79005218 push eax
.text:79005219 mov ecx, esi
.text:7900521B call PEDecoder::CheckILOnlyEntryPoint(void)
.text:7900521B
.text:79005220 cmp [eax], edi
.text:79005222 jnz loc_7900518B


mscoree.dll把修改导入表这条路封死了。(我是不是可以试试其它方式?比如IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT??)

2.第2个想到的办法是修改.Net入口 EntryPointToken
首先修改.Net PE的MetaTable,加入一个自己的函数,然后修改导入点, 在程序启动的时候调用LoadLibrary一次。

不过这样也存在一个问题,如果是ASP.Net Web Site,编译出来是DLL, EntryPointToken 为0, 我试过改成某函数也根本无效。看来mscoree.dll的_CorDllMain完全忽略EntryPointToken 。

欢迎高手给点建议或者意见

...全文
226 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2009-08-23
  • 打赏
  • 举报
回复
高手
vwxyzh 2009-08-23
  • 打赏
  • 举报
回复
关注
moface 2009-08-23
  • 打赏
  • 举报
回复
关注
ai_li7758521 2009-08-23
  • 打赏
  • 举报
回复
关注
zzxap 2009-08-23
  • 打赏
  • 举报
回复
路过
fjtxwd 2009-08-23
  • 打赏
  • 举报
回复
redleafe 2009-08-23
  • 打赏
  • 举报
回复
帮顶,不懂。
微创社(MCC) 2009-08-23
  • 打赏
  • 举报
回复
不懂,请解释一下...
CodeProject-Jerry 2009-08-22
  • 打赏
  • 举报
回复
楼上 你那是非托管壳的,
mscoree.dll会检查PE的入口部分,所以对于.Net PE这样坐会导致程序无法启动
微创社(MCC) 2009-08-18
  • 打赏
  • 举报
回复
[1]保护型

[2]压缩型

[3]加密型
微创社(MCC) 2009-08-18
  • 打赏
  • 举报
回复
学习的份,
最多帮你问问"砖家"
szzzp110 2009-08-18
  • 打赏
  • 举报
回复
upupupupup
bychgh 2009-08-18
  • 打赏
  • 举报
回复
顶顶好处多
szzzp110 2009-08-17
  • 打赏
  • 举报
回复
顶上去
lovvver 2009-08-17
  • 打赏
  • 举报
回复
这个问题问的比较深入,没研究过这个问题,关注一下,帮你顶~
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧