加壳的软件怎么修改控件

加壳的软件怎么修改控件,第1张

什么是脱壳技术?在一些电脑软件里有一段专门负责保护软件不被非法修改或反编译的程序

它们一般都是先于程序运行拿到控制权,然后完成它们保护软件的任务。

就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。

由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。

就像电脑病毒和自然界的病毒一样,其实都是命名上的方法罢了。

从功能上抽象,软件的壳和自然界中的壳相差无几。

无非是保护、隐蔽壳内的东西。

而从技术的角度出发,壳是一段执行于原始程序前的代码。

原始程序的代码在加壳的过程中可能被压缩、加密……。

当加壳后的文件执行时,壳这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。

软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP(入口点,防止被破解)。

关于“壳”以及相关软件的发展历史请参阅吴先生的《一切从“壳”开始》。

(一)壳的概念:作者编好软件后,编译成exe可执行文件。

1有一些版权信息需要保护起来,不想让别人随便改动如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。

2需要把程序搞的小一点,从而方便使用。

于是需要用到一些软件,它们能将exe可执行文件压缩。

3在黑客界给木马等软件加壳脱壳以躲避杀毒软件。

实现上述功能,这些软件称为加壳软件。

(二)加壳软件最常见的加壳软件ASPACK ,UPX,PEcompact 不常用的加壳软件WWPACK32;PE-PACK;PETITE NEOLITE (三)侦测壳和软件所用编写语言的软件,因为脱壳之前要查他的壳的类型。

1侦测壳的软件 fileinfoexe 简称 fiexe (侦测壳的能力极强)。

2侦测壳和软件所用编写语言的软件languageexe(两个功能合为一体,很棒)推荐。

language2000中文版(专门检测加壳类型)。

3软件常用编写语言Delphi;VisualBasic (VB)最难破;VisualC (VC)。

(四)脱壳软件。

软件加壳是作者写完软件后,为了保护自己的代码或维护软件产权等利益所常用到的手段。

目前有很多加壳工具,当然有盾,自然就有矛,只要我们收集全常用脱壳工具,那就不怕他加壳了。

软件脱壳有手动脱和自动脱壳之分,下面我们先介绍自动脱壳,因为手动脱壳需要运用汇编语言,要跟踪断点等,不适合初学者,但我们在后边将稍作介绍。

======================================================================= 加壳一般属于软件加密,现在越来越多的软件经过压缩处理,给汉化带来许多不便,软件汉化爱好者也不得不学习掌握这种技能。

现在脱壳一般分手动和自动两种,手动就是用TRW2000、TR、SOFTICE等调试工具对付,对脱壳者有一定水平要求,涉及到很多汇编语言和软件调试方面的知识。

而自动就是用专门的脱壳工具来脱,最常用某种压缩软件都有他人写的反压缩工具对应,有些压缩工具自身能解压,如UPX;有些不提供这功能,例如:ASPACK,就需要UNASPACK对付,好处是简单,缺点是版本更新了就没用了。

另外脱壳就是用专门的脱壳工具来对付,最流行的是PROCDUMP v162,可对付目前各种压缩软件的压缩档。

在这里介绍的是一些通用的方法和工具,希望对大家有帮助。

我们知道文件的加密方式,就可以使用不同的工具、不同的方法进行脱壳。

下面是我们常常会碰到的加壳方式及简单的脱壳措施,供大家参考:脱壳的基本原则就是单步跟踪,只能往前不能往后。

脱壳的一般流程是:查壳--->寻找OEP--->Dump修复。

找OEP的一般思路如下:[color=blue]先看壳是加密壳还是压缩壳,压缩壳相对来说容易些一般是没有异常,找到对应的popad后就能到入口。

跳到入口的方式一般为:我们知道文件被一些压缩加壳软件加密,下一步我们就要分析加密软件的名称、版本。

因为不同软件甚至不同版本加的壳,脱壳处理的方法都不相同。

我很少写破文,最近看到一些新手常问查壳工具查不出是什麽壳?不知壳如何脱?我这里就简单的用一个范例程式谈谈脱壳方法,算是给新手打打气。

一般这种没有公开的壳不会太猛(除了hying,vcasm, jingulong等这些圈内人的壳哈)大多是自己土制的壳,有的还伪装一下致使查壳工具查不出或查出什麽Aspack,UPX的壳。

碰到这种壳不用太怕认真跟踪分析一下、一般都没多大问题。

一般加壳后的程式运行时大多是用各种方法AntiDebugger,其中夹杂很多花指令和垃圾指令、然后解码又是一堆AntiDebugger,可能又解码恢复IAT又是一堆AntiDebugger最后再跳到程式真正的OEP处。

对付这种壳一般的方法是先找到OEP,再修复IAT。

在壳跳到OEP的时候一般是个跨段跳转,跳转方法有很多例如:JMP XXXXXXXX, JMP [XXXXXXXX], JE [XXXXXXXX],PUSH XXXXXXXX RET, CALL XXXXXXXXX, CALL [XXXXXXXX], CALL EAX还有的是在SEH中直接指定EIP等等。

找到这个跳转位址,然后在相应位址上设上中断点,F9运行就到达OEP处了。

此时就是最好的Dump时机,修复IAT一般用

推荐一个混淆或加壳软件!!!

微软的 Dotfuscator Community Edition打包注册表项,运行库,程序文件{最好在XP-X86 环境下打包,上下兼容}PS:其实自己也能做,就像读取文本再写进去过程中加下密,就像RAR,然后利用一个可执行程序进行解压{俗称-安装,术语-封装} 在百度文库里搜索一下教程 内容更多建议和 加壳 一起学,

如何破解一个软件

用工具试试看。

但是不保证一定能成功。

如果启动软件的时候,出现需要注册码情况话,。

1启动软件之后,先选择你要解密的office文件,再选择恢复模式,点击“开始”等待破解结束即可,这里以word做为例子。

2如果已知密码位数高于6位的话,建议使用字典破解,然后在字典破解中设置密码长度即可。

office密码破解工具:>

DLL当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。

由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行,如图184。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。

184gif

利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32dll, ntdlldll等核心系统库以外的DLL有效,如网络应用程序的ws2_32dll,游戏程序中的d3d8dll,还有大部分应用程序都调用的lpkdll,这些DLL都可被劫持。

利用562章提供的CrackMeNetexe来演示一下如何利用劫持技术制作补丁,目标文件用Themida v1920加壳保护。

1.补丁地址

去除这个CrackMe网络验证方法参考第5章,将相关补丁代码存放到函数PatchProcess( )里。例如将401496h改成:

代码:00401496 EB 29 jmp short 004014C1

补丁编程实现就是:

代码:

unsigned char p401496[2] = {0xEB, 0x29};

WriteProcessMemory(hProcess,(LPVOID)0x401496, p401496, 2, NULL);

p401496这个数组的数据格式,可以用OllyDBG插件获得,或十六进制工具转换。例如Hex Workshop打开文件,执行菜单Edit/Copy As/Source即可得到相应的代码格式。

2.构建输出函数

查看实例CrackMeNetexe输入表,会发现名称为ws2_32dll的DLL,因此构造一个同名的DLL来完成补丁任务。伪造的ws2_32dll有着真实ws2_32dll一样的输出函数,完整源码见光盘。实现时,可以利用DLL模块中的函数转发器来实现这个目标,其会将对一个函数的调用转至另一个DLL中的另一个函数。可以这样使用一个pragma指令:

代码:#pragma comment(linker, "/EXPORT:SomeFunc=DllWorksomeOtherFunc")

这个pragma告诉链接程序,被编译的DLL应该输出一个名叫SomeFunc的函数。但是SomeFunc函数的实现实际上位于另一个名叫SomeOtherFunc的函数中,该函数包含在称为DllWork dll的模块中。

如要达到劫持DLL的目的,生成的DLl输出函数必须与目标DLL输出函数名一样,本例可以这样构造pragma指令:

代码:#pragma comment(linker, "/EXPORT:WSAStartup=_MemCode_WSAStartup,@115")

编译后的DLL,会有与ws2_32dll同名的一个输出函数WSAStartup,实际 *** 作时,必须为想要转发的每个函数创建一个单独的pragma代码行,读者可以写一个工具或用其他办法,将ws2_32dll输出函数转换成相应的pragma指令。

当应用程序调用伪装ws2_32dll的输出函数时,必须将其转到系统ws2_32dl中去,这部分的代码自己实现。例如WSAStartup输出函数如下构造:

代码:

ALCDECL MemCode_WSAStartup(void)

{

GetAddress("WSAStartup");

__asm JMP EAX;//转到系统ws2_32dll的WSAStartup输出函数

}

其中GetAddress()函数的代码如下:

代码:

// MemCode 命名空间

namespace MemCode

{

HMODULE m_hModule = NULL; //原始模块句柄

DWORD m_dwReturn[500] = {0}; //原始函数返回地址

// 加载原始模块

inline BOOL WINAPI Load()

{

TCHAR tzPath[MAX_PATH]={0};

TCHAR tzTemp[MAX_PATH]={0};

GetSystemDirectory(tzPath, sizeof(tzPath));

strcat(tzPath,"\\ws2_32dll");

m_hModule = LoadLibrary(tzPath);//加载系统系统目录下ws2_32dll

if (m_hModule == NULL)

{

wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);

MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP);

}

return (m_hModule != NULL);

}

// 释放原始模块

inline VOID WINAPI Free()

{

if (m_hModule)

FreeLibrary(m_hModule);

}

// 获取原始函数地址

FARPROC WINAPI GetAddress(PCSTR pszProcName)

{

FARPROC fpAddress;

TCHAR szProcName[16]={0};

TCHAR tzTemp[MAX_PATH]={0};

if (m_hModule == NULL)

{

if (Load() == FALSE)

ExitProcess(-1);

}

fpAddress = GetProcAddress(m_hModule, pszProcName);

if (fpAddress == NULL)

{

if (HIWORD(pszProcName) == 0)

{

wsprintf(szProcName, "%d", pszProcName);

pszProcName = szProcName;

}

wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);

MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP);

ExitProcess(-2);

}

return fpAddress;

}

}

using namespace MemCode;

编译后,用LordPE查看伪造的ws2_32dll输出函数,和真实ws2_32dll完全一样,如图185所示。

185gif

查看伪造的ws2_32dll中任意一个输出函数,例如WSACleanup:

代码:

text:10001CC0 ; int __stdcall WSACleanup()

text:10001CC0 WSACleanup proc near

text:10001CC0 push offset aWsacleanup ;"WSACleanup"

text:10001CC5 call sub_10001000 ;GetAddress(WSACleanup)

text:10001CCA jmp eax

text:10001CCA WSACleanup endp

会发现输出函数WSACleanup()首先调用GetAddress(WSACleanup),获得真实ws2_32dll中WSACleanup的地址,然后跳过去执行,也就是说ws2_32dll各输出函数被HOOK了。

3.劫持输出函数

ws2_32dll有许多输出函数,经分析,程序发包或接包时,WSAStartup输出函数调用的比较早,因此在这个输出函数放上补丁的代码。代码如下:

代码:

ALCDECL MemCode_WSAStartup(void)

{

hijack();

GetAddress("WSAStartup");

__asm JMP EAX;

}

hijack()函数主要是判断是不是目标程序,如是就调用PatchProcess()进行补丁。

void hijack()

{

if (isTarget(GetCurrentProcess())) //判断主程序是不是目标程序,是则补丁之

{

PatchProcess(GetCurrentProcess());

}

}

伪造的ws2_32dll制作好后,放到程序当前目录下,这样当原程序调用WSASTartup函数时就调用了伪造的ws2_32dll的WSASTartup函数,此时hijack()函数负责核对目标程序校验,并将相关数据补丁好,处理完毕后,转到系统目录下的ws2_32dll执行。

这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用,当挂接函数被执行时,相关的代码己被解压,可以直接补丁了。有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。

一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,应引起注意。

想要脱VMP的壳,首要工作当然是要找一个强OD。至于是什么版本的OD自己多试验几个,网上有很多,一般来说只要加载了你想脱的VMP加壳程序不关闭都可以。 其次,就是StrongODdll这个插件了

你这个问题太过于笼统,其实破解中的脱壳是一个非常复杂的过程,有些壳很容易脱掉,在网上也可以找到相应的脱壳机,有些复杂的壳就需要手动脱壳,我觉得脱壳也可以成为一门复杂的学科,毕竟要破解就要学会脱壳,以前我也曾经看过很多关于脱壳的文章和视频但是由于编程技术不是很好所以总是似是而非,有一日看到一个视频,终于有了一个脱壳的思路,留下你的邮箱我可以给发过去,或者你加我的号码240410420 ,这个视频的文字教程如下:

脱壳多种方法总结篇

一脱壳基础知识要点

1PUSHAD :(压栈) 代表程序的入口点

2POPAD :(出栈) 代表程序的出口点,与PUSHAD想对应看到这个,就说明快到OEP了

3OEP:程序的入口点,软件加壳就是隐藏OEP而我们脱壳就是为了找OEP

二脱壳调试过程中辨认快到OEP的简单方法

下面二个条件是快到OEP的共同现象:

若出现下面情况时,说明OEP就要到了:

1 OD跟踪过程中如果发现:

popad

popfd

popad

2同时,紧接着,有retn ,jmp等其它跳转指令,发生跨段跳跃时

说明OEP马上到了

三脱壳必需牢记的要领

1单步往前走,不要让程序向上走,遇到向上跳时,在下一句按F4,运行到所选

2刚载入程序,在附近就call时,我们按F7跟进去

3若跟踪时,运行某个call程序就运行时,这个call也用F7进入

4在跟踪时,出现比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN同时发生大跨段跳转时,说明很快就到OEP了

四常用脱壳方法总结

------------------

方法一:单步跟踪法

------------------

介绍:这是最通用的方法,对于未知壳,基本都用这种方法,这种方法过程比较麻烦,要一步一步的跟踪分析,要有一定的耐心

1用OD载入,选"不分析代码"

2单步向下跟踪按F8,实现向下的跳不让程序往回跳

3遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)

4如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易运行

5在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入

6一般遇到很大的跳转(跨段跳),比如 jmp XXXXXX 或 JE XXXXXX 或有RETN的一般很快就会到程序的OEP。

-----------------

方法二:ESP定律法(ESP与EIP都为红色)

-----------------

介绍: 这种方法可以脱大部的压缩壳和少数加密壳, *** 作起来比较简单,脱壳速度也相对比较快

1开始就点F8向下走,注意观察OD右上角的寄存器中ESP有没突现(变成红色)

2在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者hr

XXXXXXXX),按回车!

3选中下断的地址,断点--->硬件访--->WORD断点。

4按一下F9运行程序,直接来到了跳转处,按下F8向下走,就到达程序OEP。

-----------------

方法三:内存镜像法

-----------------

介绍:也是一种比较好用的脱壳方法,大部分的压缩壳和加密壳用内存镜像法能快速脱掉非常实用

1用OD打开,设置选项——调试选项——异常,忽略所有异常(也就是把里面的忽略全部√上),然后CTRL+F2重载下程序!

2按ALT+M,打开内存镜象,找到程序的第一个rsrc按F2下断点,然后按SHIFT+F9运行到断点

3接着再按ALT+M,打开内存镜象,找到程序的第一个rsrc上面的CODE,按F2下断点!然后按SHIFT+F9,直接到达程序OEP!

另外:加入内存模块中看到多个PE代码就从第一个PE下面的代码下断点,shift+F9,单步进行,看到INC 的地址,查找到这个地址一般就为程序入口,可能会因为有多个PE所以没有解密,单步进行知道程序返回到这个入口,然后脱壳

----------------

方法四:一步到OEP

----------------

介绍:这是一种巧方法,脱壳速度最快,前提是要知道这个壳的特征,利用这种壳的共性快速找到程序的OEP这种方法只用于少数壳

1开始按Ctrl+F,输入:popad,然后按下F2下断,按F9运行到此处

2很快来到大跳转,按F8向下走,来到OEP

----------------

方法五:利用内存异常(选项--异常,中下面勾都去掉)

----------------

shift+F9 几次 运行后记住运行了几次后打开的软件

重新导入,shift+F9 运行比刚才少一次,观察od右下角SE异常,记下前面地址,ctrl+G,输入这个地址

F2下断点,shift+F9运行到此处,取消断点然后单步F7跟踪到oep入口处,LE修改大小然后转存,然后用ImportRE修改OEP,然后将刚才转存的文件输入即可。

下白垩统烃源岩在周口坳陷颇具特色,该套烃源岩厚度大,分布区域相对稳定和集中,有机碳丰度较高,但可溶有机质和生烃潜量较低,不同构造部位热演化程度差异大。其中,永丰组和巴村组是一套较深湖相的沉积,被认为是下白垩统的主力烃源岩层段。

1下白垩统烃源岩分布

据周参10井、周参11井、周参12井、周15井、周18井、周22井、周23井、周25井、沈1井及南9井等探井资料分析,沈丘凹陷下白垩统暗色泥岩较谭庄凹陷发育,大部分属较深湖亚相沉积。其中周参11井下白垩统永丰组暗色泥岩特别发育,厚度达1227m,占相应地层厚度的53%。沈丘凹陷东部水体深,为沉积中心所在区,西部永丰组虽有一部分属较深湖亚相,但主要为浅湖亚相及滨浅湖亚相,而周14井和周18井都处于浅水区,周15井则更靠近物源区,几乎无暗色泥岩,反映谭庄凹陷较深水区分布面积局限,且持续时间较短。统计结果显示,下白垩统潜在烃源岩的分布基本上与凹陷的伸展方向一致,呈NWW—SEE向。各组段的分布也基本一致,唯永丰组上段在东部的中心位置向北偏移至郭平楼—关庄一带。其中心位置:西为双楼田—穆庄一带,最大厚度大于600m;东为萤子寨—周庄一带,最大厚度大于700m。厚度大于100m的区域大约有1378km2。

2下白垩统烃源岩有机地球化学特征

(1)下白垩统有机质丰度

谭庄-沈丘凹陷暗色泥岩有机碳含量平均为097%,氯仿沥青“A”平均含量为00472%,总烃平均含量为137×10-6,生烃潜量(S1+S2)平均为017mg/g(表6-23)。从平面上看,有机碳含量差别不大,但受热演化程度的影响,可溶烃含量和生油潜量具有南低北高的特点。南部周参10井、周参11井和南9井平均氯仿沥青“A”分别为91×10-6、182×10-6和320×10-6,北部周19井永丰组平均氯仿沥青“A”达933×10-6,高于全区平均值近2倍。凹陷北部的南2井、周19井,因热演化程度低(Ro<08),比较能够体现白垩系的原始有机质丰度。在纵向上,主要生油气层段为永丰组下段,其次为巴村组和永丰组上段,商水组较少。综合分析认为,下白垩统的烃源岩应属于中-好的烃源岩。

表6-23 周口坳陷谭庄-沈丘凹陷下白垩统有机质丰度

(2)下白垩统有机质类型

根据干酪根显微组分分析、元素分析、红外光谱测定得知下白垩统有机质基本为Ⅲ型,个别为ⅡB型。由于该烃源岩已经受了较高的热演化历程,采用人工热模拟的方法恢复处理后,其原始母质类型比直接测得的现存类型要好一些,原始母质类型以Ⅱ型为主(图6-18)。

图6-18 谭庄-沈丘凹陷下白垩统原始母质类型

3烃源岩有机质成熟度与生烃演化

(1)烃源岩有机质成熟度

该套烃源岩Ro在07%~15%之间较多,Tmax值以440~450℃居多,OEP值为12左右,生物标志化合物演化参数大多数落于低熟-成熟区间,综合说明尚处于生油液态窗之中。周口下白垩统的热演化程度在不同的构造部位上具明显的不均衡性,总的来讲呈北高南低的演化趋势,但亦有局部异常变化情况。演化程度最低的是沈丘凹陷北部斜坡区,其中周19井埋深3500m 时泥岩干酪根的镜质体反射率才达到049%,至今还未成熟;谭庄凹陷中生界生油岩处于成熟阶段,周参12井和周14井Ro介于05%~15%之间。沈丘凹陷娄堤构造带中生界生油岩成熟度相对最高,周参10井、周参11井及南9井一带存在一个高值区,Ro均大于15%,处于过成熟阶段,尤其是凹陷南部的周参11井Ro达229%~385%。该区并无火山岩分布,因而其原因一方面可能是沉积、沉降中心的深埋藏及后期的沉积叠加所致;另一方面可能与构造活动造成的局部热异常有关——下白垩统沉积后期(或期后),深部“热水”沿断裂上涌,形成了附加热源。

区内下白垩统沉积后,经历了燕山晚期的隆升剥蚀和喜马拉雅期的再度深埋改造,具有两期深埋、两次生烃的过程。其早白垩世末期的生烃范围较为局限,热演化程度较低,Ro值在05%~10%之间,且主要位于下白垩统的深凹区底部,即周18井-周参12井-周参11井一带。古近系沉积后,凹陷内下白垩统深埋至4000m 以下,进入生烃高峰期。开始大规模生烃。其二次生烃区主要位于古近系的深凹陷区,即商水断裂以南,周18井-周参12井-周参10井以北的地区。

(2)下白垩统永丰组暗色泥岩生烃模拟实验

实验结果获得了周参12井中生界样品C1、C2—C4及 生气、生油动力学参数——周口坳陷下白垩统永丰组暗色泥岩生油、生气活化能分布及其频率因子(图6-19)及K1泥岩Ro的动力学参数。结合谭庄凹陷、沈丘凹陷南部和沈丘凹陷北部典型井的埋藏史,得到了谭庄-沈丘凹陷不同洼陷下白垩统永丰组生油岩古地热史(图6-20)。由此得知,谭庄凹陷及沈丘凹陷南部K1生油岩在燕山中期曾演化到Ro为06%~12%,其后经历了约60~70Ma的热演化停顿,于喜马拉雅期再次深埋。于是,热演化增至Ro为12%~25+%,源岩开始了二次生烃的历程。沈丘凹陷北部的K1生油岩在燕山期基本处于生油门限附近,并且在长达近100Ma的时间里基本保持不变,直到喜马拉雅期才进一步增加至Ro为10%~12%左右,达到生油高峰,烃源岩仅有一次生烃的经历。

图6-19 周参12井源岩C1、C2—C4及 生气、生油动力学参数图

从图6-20可知,沈丘凹陷南部K1生油岩在60~40Ma左右达到生烃高峰,甲烷产率为90m L/g有机碳,C2—C4产率为3~35m L/g有机碳;沈丘凹陷北部K1生油岩生烃高峰相对南部要晚,在喜马拉雅晚期,但产率却低得多,甲烷产率为18~20m L/g有机碳,C2—C4产率小于002m L/g有机碳;谭庄凹陷K1生油岩虽属二次生烃,但与沈丘凹陷南部区块有所区别的是生烃高峰期更晚,为喜马拉雅运动晚期,但甲烷产率却与周19井相似,仅为18~20m L/g有机碳,C2—C4产率小于002m L/g有机碳。这是周参12井及周19井K1生油岩现今演化程度相对较低所致,两地该套烃源岩层目前演化程度最高Ro仅为10%~12%左右,而周参11井的Ro多超过20%,甚至30%,相应甲烷、C2—C4产率大大提高。

图6-20 谭庄-沈丘凹陷K1源岩产率、古地热史曲线图

根据图6-20的下白垩统源岩生油动力学参数,获得了不同地区 液态烃产率。其中,沈丘凹陷南部周参11井地区,燕山中期一次产油率为10mL/g·TOC,到50Ma左右达二次生烃高峰,产油率为10~18m L/g·TO C;北部周参19井地区,燕山中期源岩多未熟,几乎不产油,到喜马拉雅运动晚期产油率为6~7mL/g·TOC;谭庄凹陷周参12井地区燕山中期产油率为3~4mL/g·TOC,现今产油率为6~7mL/g·TOC。与下白垩统产气率相同,周参11井地区高演化也带来高产油率。

加壳理论

所谓加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩、加密驱动程序),以达到缩小文件体积或加密程序编码的目的。

当被加壳的程序运行时,外壳程序先被执行,然后由这个外壳程序负责将用户原有的程序在内存中解压缩,并把控制权交还给脱壳后的真正程序,这就是我们找OEP的原因了。一切 *** 作自动完成,用户不知道也无需知道壳程序是如何运行的。一般情况下,加壳程序和未加壳程序的运行结果是一样的。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。

(PS:壳是指在一个程序的外面加上另外一段代码,保护里面的代码不被非法修改或者反编译。)

脱壳理论

脱壳主要有两种方法:硬脱壳和动态脱壳。

第一种,是硬脱壳,这是指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。由于现在的壳有加密、变形、虚拟环境等等特点,每次加壳生成的代码都不一样。硬脱壳对此无能为力,

第二种,是动态脱壳。加壳的程序运行时必须还原成原始形态,就是加壳程序运行后必须进行解压到程序的文件头。所以我们可以用OD跟踪到OEP的原因。这个时候我们就可以抓取(Dump)内存中的镜像,再重构成标准的执行文件。这样我们就脱壳了。

(PS:现在的加密壳更复杂一点,需要我们考虑的东西就更多了。)

以上说明的就是针对压缩壳的简单说明,

现在壳已经由压缩壳到加密壳到VM壳。

如果觉得可以给我qb哦

一、DLL的脱壳方法:

我们从官方网站下载的原始压缩包中选一个 xmp-wmadll 来测试一下。用 OllyDBG 载入,会有一个请求载入 DLL 文件的对话框,问是否用 LOADDLLEXE 载入,我们选“是”。稍等一会又出来一个入口点警告的对话框,点“确定”,接着又有个询问是否为压缩代码,是否需要分析的对话框,这里我们选“否”。进入程序,我们停在这:

CODE

10017039 > B8 00700110 MOV EAX,xmp-wma10017000 ; 开始停在这

1001703E 68 00500110 PUSH xmp-wma10015000

10017043 64:FF35 0000000>PUSH DWORD PTR FS:[0]

1001704A 64:8925 0000000>MOV DWORD PTR FS:[0],ESP

10017051 66:9C PUSHFW

10017053 60 PUSHAD

10017054 50 PUSH EAX

不要管它,直接 F9 运行(在我这跳出一个异常对话框,不管它,点确定,SHIFT+F9继续运行),稍后 OllyDBG 的左下角会显示“要调试的 DLL 初始化结束”,我们暂停在这里:

CODE

10001000 /$ 55 PUSH EBP ; 停在这里

10001001 | 8BEC MOV EBP,ESP

10001003 | 83EC 20 SUB ESP,20

10001006 | 53 PUSH EBX

10001007 | 56 PUSH ESI

10001008 | 8BF1 MOV ESI,ECX

1000100A | 33DB XOR EBX,EBX

1000100C | 57 PUSH EDI

1000100D | 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]

现在继续不管,还是在 OllyDBG 中 F9 运行,再用鼠标左键点击任务栏那的绿色的 LOADDLLEXE 的图标,出来一个小窗口,点关闭图标关掉它,我们将在 OllyDBG 中停在这里:

CODE

10017039 > $- E9 08B5FFFF JMP xmp-wma10012546 ; 停在这里,跳转目标就是OEP

1001703E $- E9 84307F6C JMP kernel32WideCharToMultiByte

10017043 $- E9 75297F6C JMP kernel32LocalAlloc

10017048 $- E9 79BA7F6C JMP kernel32GetSystemInfo

1001704D $- E9 24A47F6C JMP kernel32DisableThreadLibraryCalls

10017052 $- E9 CEA57E6C JMP kernel32DeviceIoControl

10017057 $- E9 5B81806C JMP kernel32GlobalMemoryStatus

1001705C $- E9 4C38D067 JMP USER32wsprintfA

10017061 $- E9 C65F9966 JMP ole32CoTaskMemFree

大家可以注意看一下,和刚开始进入的地址是不是一样啊?呵呵。这时按一下 F8 单步一下,来到这里:

CODE

10012546 / 55 PUSH EBP ; OEP,可直接用插件 OllyDump 脱壳

10012547 | 8BEC MOV EBP,ESP

10012549 | 53 PUSH EBX

1001254A | 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8]

1001254D | 56 PUSH ESI

1001254E | 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C]

10012551 | 57 PUSH EDI

10012552 | 8B7D 10 MOV EDI,DWORD PTR SS:[EBP+10]

这里找 OEP 的方法是利用了 DLL 退出时会再次中断在EP处的原理,记得 fly 曾经说过。如果你和我一样用的是 OllyDump v300110 版的插件的话,这个 DLL 脱出来后都不需修复输入表。如果不是的话,修复也很简单:

用插件脱壳后先不要关 OllyDBG ,继续让 OllyDBG 暂停在上面 10012546 地址处,启动 ImportREC_fixexe,在进程列表中选择 loaddllexe,再点后面的“选取 DLL”按钮,选择 xmp-wmadll 后按确定,把选项中的“使用来自磁盘的 PE 文件头”选项去掉,“重建原始 FT”选项勾上,在OEP中填12546,点“自动查找 IAT”按钮,出来一个对话框,点“确定”,再点“获取输入表按钮”,会有一些函数无效。点“显示无效的”按钮,在无效函数上右击,选“跟踪级别 1 (反汇编)”菜单,这时所有无效函数都已修复,现在点“修复转存文件”按钮把你刚才脱出来的文件修复一下就可以了。

到此为止我们的脱壳工作已告一段落,剩下的就是修复重定位表的问题了。现在我们打开 PE Tools 15,点菜单 插件->Reloc 重建器,选择我们刚才脱壳后的文件,点“重建”按钮,OK,完工!测试一下,一切正常!到此可再用 PE Tools 优化一下文件,减小一下体积。

二、主程序

OllyDBG 载入,停止这里:

CODE

0054B039 > B8 00B05400 MOV EAX,xmplay0054B000 ; 载入后停在这里

0054B03E 68 BDA74400 PUSH xmplay0044A7BD

0054B043 64:FF35 0000000>PUSH DWORD PTR FS:[0] ; F8运行到这一步时在命令行中输 hr esp

现在F9运行,会中断6次。第6次断下来时代码如下:

CODE

0044367E 55 PUSH EBP ; OEP,真正的入口点

0044367F 8BEC MOV EBP,ESP ; 我们断在这里

00443681 6A FF PUSH -1

00443683 68 18874400 PUSH xmplay00448718

记住上面的OEP地址,删除硬件断点,重新载入程序,前面步骤一样,也是先F8单步到 54B043 位置时在命令行中输 hr esp 命令,F9运行。数一下断下来的次数,当第5次时删除硬件断点,在OllyDBG中按快捷键CTR+G,输入地址0044367E后按确定,这时光标将停在

CODE

0044367E 55 PUSH EBP

这一句上。这时按一下F4键,OllyDBG将运行到这个位置并暂停。此时 *** 作就和前面脱DLL的壳一样,直接用插件 OllyDump 脱壳,再用 ImportREC_fixexe 修正输入表就OK了。

总结一下脱主程序步骤:载入后F8运行到代码的第三行,在命令行中输入 hr esp 命令后回车,F9运行,中断6次后(次数并不是主要的)看代码是否与上面的类似,是的话就记住最后中断位置上面一句的地址,再删硬件断点,重新启动程序,前面步骤一样,在比上次少一次时删硬件断点,CTR+G到刚才记下来的地址,F4运行到这里,用插件脱壳,再用 ImportREC 重建输入表。

原则上上面的方法适合一般的 PEtite 加壳的程序,照搬就可以了。

以上就是关于加壳的软件怎么修改控件全部的内容,包括:加壳的软件怎么修改控件、如何对软件脱壳、DLL文件劫持应该怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9613843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存