-
-
[翻译]UPX 0.89.6 - 1.02 1.05 - 1.24 (Delphi) stub - Markus & Laszlo.doc[翻译工具+人脑]
-
发表于: 2010-12-12 22:22 9875
-
[翻译]UPX 0.89.6 - 1.02 1.05 - 1.24 (Delphi) stub - Markus & Laszlo.doc[翻译工具+人脑]
分析UPX壳报告
星期二,2005年5月3日@下午9点43 CEST时
投稿人:wizard
点击:5886
级别:初学者
讲解手动修补被加壳了的软件
软件名称:Zoom Player Professional (inmatrix.com)
使用工具:OllyDbg 1.09d PEID v0.91
注。一个软件版本(如软件本身)并不重要,但重要的是,所有的工作,你知道你做什么。第二件事情,你必须记住所有的地址是什么,价值和数量,这相当于一个反汇编代码中hexadimal系统为代表,其余的数字都是十进制的。
作者:Wizard
时间:2004年4月16日
难度:初学者
来源:不希望它更容易,希望你更好。Michelangelo
简介:
Zoom Player Professional是当今为止PC上最先进的媒体播放器和DVD,Designed to be simple at first glance while being remarkably dynamic and flexible when used to its full potential.
Zoom Player的两种工作模式,第1个是媒体模式,它可以使用DirectShow支持任何DirectShow支持的文件(任何文件,该文件在MediaPlayer的播放)与另一个模式是DVD模式,它使用预先安装的DirectShow DVD过滤器来播放DVD内容。
勘查:
首先,本人从官方网站下载的文件,然后安装它zp331pro.exe,安装完成之后,我检查了主要可执行的(zplayer.exe)文件 ,这是八九不离十被加壳,可以肯定的,因为我用PEiD检测发现一些老版本的UPX,也许是因为它被修改了一下,但也许这确实是如此,不管怎样PEID显示: "UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo".
现在运行程序看看启动提示
你必须等待3秒,然后按相应的按钮。一旦你按下按钮 - 程序启动并运行良好。检查我们有什么。进入选项菜单按Ctrl + P或通过点击播放器的面板上相应的按钮(在右下角)。
点击左栏中的信息栏,我们看到字符串: "Registered to: This copy is unregistered".
您可能还注意到在表格下方的注册按钮。如果你按下它,它会带给你到互联网注册页面。这意味着,如果界面没有密码/名称对话框,它应该使用一些其他注册方式。
通常它是一个注册文件(密钥文件)。为什么呢?很简单,为什么它需要iNet的呢?当然,注册为合法用户,给钱注册以后,注册用户将收到一些关键文件,他将只把该程序的文件夹(通常在根目录)。99%的惯例。没有人(我的意思是“任何”软件的作者)都不会做这样的技巧去隐藏密码对话框按组合键或别的什么更棘手的地方。在他们的软件上毛病一般用户不需要
,他们根本无法解决毛病。换句话说,最终用户需要简单的登记手续。当然,这只是我的主观角度,我可以错了,但我只信任我的直觉,依靠自己的经验。
载入OD得到:
火了奥利,按F3和打开你的ZoomPlayer目录(例如“C:程序FilesZoom播放器”)文件zplayer.exe。你会看到这个对话框,提示该内容(我们的可执行文件)可能与某些压缩壳有关。
按“Yes”按钮开始分析代码。一旦它将停在UPX压缩的入口点(00683ED0)。
00683ED0 : 60 PUSHAD ; <=你在这里00683ED1 : BE00C05C00 MOV ESI,zplayer.005CC000
00683ED6 : 8DBE0050E3FF LEA EDI,DWORD PTR DS:[ESI+FFE35000]
00683EDC : C787C4B01C00 MOV DWORD PTR DS:[EDI+1CB0C4],80067C41
00683EE6 : 57 PUSH EDI
00683EE7 : 83CDFF OR EBP,FFFFFFFF
00683EEA : EB0E JMP SHORT zplayer.00683EFA
。。。。。。跳过。。。。
所有我们现在需要的是找到真正的(原文件)入口点(REP/OEP)。你也许会问:怎么办呢?那么,它取决于一个黑客,他的经验和直觉。每个人会有所不同。正如我们所知,该程序是与UPX压缩,我们可以简单地用下一页键向下滚动加壳后程序。我个人把它压8次,直到我来到了入口点。另外还有一个最简单的方法去那里。按Ctrl + F来开始找到它“POPAD”命令对话框和类型,但下降的标志“整个块”,按“查找”按钮来搜索指令...我们就在这个里。
。。。。。。跳过。。。。
0068402B : 55 PUSH EBP
0068402C : FF96 7CA62800 CALL DWORD PTR DS:[ESI+28A67C]
00684032 : 09C0 OR EAX,EAX
00684034 : 74 07 JE SHORT zplayer.0068403D
00684036 : 8903 MOV DWORD PTR DS:[EBX],EAX
00684038 : 83C3 04 ADD EBX,4
0068403B : EB D8 JMP SHORT zplayer.00684015
0068403D : FF96 80A62800 CALL DWORD PTR DS:[ESI+28A680]
00684043 : 61 POPAD ; <=我们的地方found
00684044 : E9 9774F4FF JMP zplayer.005CB4E0 ; jump to tOEP REP
00684049 : 00 DB 00
0068404A : 00 DB 00
0068404B : 00 DB 00
我们搜索了“POPAD”(61)指令,因为该程序是与UPX压缩加壳。与解密ASPack一样,但我需要搜索几次,但只有一次的UPX(通常),或多次(很少)。
注。当然什么都可以是非常困难的时候,但是如果它是一个UPX压缩标准(哪怕是一点点修改),你总能找到了。此外,你可以尝试找到与自动跟踪的特征(OEP),但这种方式有时可以(很少),
把一个断点在地址00684044 F2键。按F9运行proggy。好吧,我们就在这个地方。现在,按F7或F8(现在也没关系,因为它只是一个跳跃)一次,可以跳到OEP。
不公开的东西
我们在实际的切入点了。
005CB4E0 : 55 PUSH EBP ; <= the REP itself
005CB4E1 : 8BEC MOV EBP,ESP
0
05CB4E3 : B9 07000000 MOV ECX,7
005CB4E8 : 6A 00 PUSH 0
005CB4EA : 6A 00 PUSH 0
005CB4EC : 49 DEC ECX
现在,让我们记住我们是什么文字已在NAG的观察。我们将只需要一些短语。让它成为“This is a Trial”。我们要搜索转储这些话。要做到这一点,请在地址我们现在右击,然后选择“在转储/选择跟随。”
前往转储窗口。现在它的地址应该是相等的代表(005CB4E0)。我们这样做是为了转储窗口中设置光标的可执行文件,我们被解析。这是非常重要的,因为否则我们不会找到我们的字符串。这是因为这种搜索并没有涵盖所有的Windows内存,你必须选择的范围内存在,你将自己的搜索(就像在SoftICE)。
注。我们已经设置光标的地址,因为我们正好在解压的代码现在。因此,它还有另一个切入点比UPX压缩的内存地址。但正如我们要寻找一个NAG的字符串,我们必须设置光标移动到相应的内存范围。这是因为我们不会找到我们想要的字符串中搜索可执行文件的包装的一部分。我们只能找到解压缩的内存范围内。
按Ctrl + B的二进制转储开始搜索对话框。键入“this is a trial”在ASCII字段中,设置标志“整个块”(如果你没有设置这个标志,搜索将会有所下降,从你的光标的位置已现,但它会覆盖所有的搜索可执行文件相关的内存)。按“确定”,稍等一会。没有运气,老兄!不要担心,只要尝试搜索相同的字符串为Unicode。键入相同的字符串,但在Unicode字段。尝试...成功!我个人发现,在地址00541790字符串。
注意,永不选择“区分大小写”标志,当为在内存中的字符串搜索。
在转储只选择我们已经找到字符串的第一个字节。我们只选择一个字节,因为它总是足以抓住一个字符串处理(如果最后的话)。现在,应标有灰色。右键点击这个(选中)字节,然后向上通过菜单并选择“断点/内存的访问”。
现在,只要按F9,让程序运行和调试器将抓取的时刻,当字符串(从NAG)将被读取。你会停在Kernel32模块中的某处。
77E7AB08 : 0FB702 MOVZX EAX,WORD PTR DS:[EDX] ; <=你在这里
77E7AB0B : 8A0418 MOV AL,BYTE PTR DS:[EAX+EBX]
77E7AB0E : 42 INC EDX
。。。跳过。。。。
我们已经删除之前设置断点。要做到这一点,在地址右击你现在在的代码窗口(或在转储窗口),从右键的弹出的菜单选择“断点/删除内存断点”。
一旦你这样做去,以解决77E7AB26,然后按F4追踪,直到命令,我们需要的权限。这是因为我们并不需要在循环运行下面就像是一个车轮松鼠。
77E7AB26 : C2 1800 RETN 18 ; trace out of here
77E7AB29 : 2BF7 SUB ESI,EDI
77E7AB2B : 8975FC MOV DWORD PTR SS:[EBP-4],ESI
77E7AB2E : E901FEFFFF JMP kernel32.77E7A934
当您将离开这个CALL要跟踪很长一段时间与F8键,直到你将看到了NAG。没错,是我们以前看到的画面。我们正在做的所有的东西,因为如果到审查程序处理字符串(在对话框),这意味着不久将出现NAG的。
你也许想知道,为什么要尽一切棘手的东西,如果我们可以只设置一个断点,一些API调用。嗯,这部分是正确的。首先,我们不知道在函数来设置断点,因为它像,这一项目是在Delphi编写的样子。我们可以得出结论,由于许多人(太深刻递归)不必要的调用。其次,我们只是没有导入表。你可以尝试按Ctrl + N以检查的名称。你只能看到内核命名(当你在范围77E7 ...),只有UPX压缩功能(当你在范围404E是..),但你没有真正的(加壳)可执行名称,可以观察到。当然,如果我们用SoftICE的打击,我们会尽量设置一些断点,用我们的直觉。但你说,如果这是一个Delphi的组成proggy那么标准的API函数将无法正常工作,因为德尔福使用自己的绘画风格。你可能只是有些人喜欢尝试的DestroyWindow,CreateWindow或其他非标功能。所有这些东西你可以用SoftICE的,但让我们回到Olly。
注。我要提醒你。不要试图通过按F9来达到你的生活更轻松的对话。这不会帮助,因为在这种情况下运行的程序公正。我可以给你一个提示如何追踪“without the brains”。刚刚你会出在地址77E7AB26通话,跟踪与F8键(是的,只要持有它),直到你看到了NAG。Olly将停在你需要的地址光标。
Olly停在地址0057ACA7。现在点击任务栏中看到了NAG“Zoom Player”的过程。一旦你会看到它等待3秒钟,然后按相应的按钮继续跟踪。
之后,“遭遇”
好吧,当你按下相应的按钮Olly再次采取了控制。
0057ACA5 : 8B00 MOV EAX,DWORD PTR DS:[EAX]
0057ACA7 : 8B10 MOV EDX,DWORD PTR DS:[EAX]
0057ACA9 : FF92 EC000000 CALL DWORD PTR DS:[EDX+EC] ; 在NAG的本身
0057ACAF : 837D DC00 CMP DWORD PTR SS:[EBP-24],0 ; <=你应该在这里
0057ACB3 : 0F84FA000000 JE zplayer.0057ADB3
0057ACB9 : B201 MOV DL,1
回顾一下。如果我们在这里(在0057ACAF),那么它必须有一种方法可以到达这里。翻阅了一下,检查,如果有一些有趣的事情。
0057AC19 : E8 E2460100 CALL zplayer.0058F300
0057AC1E : 803D90315D0000 CMP BYTE PTR DS:[5D3190],0 ; if (@[5D3190]==0) badboy
0057AC25 : 0F8584000000 JNZ zplayer.0057ACAF ;如果注册的跳跃
0057AC2B : 807DC3 01 CMP BYTE PTR SS:[EBP-3D],1
0057AC2F : 7555 JNZ SHORT zplayer.0057AC86
你看到和我所看到的?在地址0057AC1E我们看到一个有趣的对比。看起来比较之后,在地址0057AC25有条件跳不会跳,因为我们还没有注册用户。换句话说,该跳“应该”直接在NAG的方案,就在我们现在地址(0057ACAF)。这也意味着,地址为[5D3190]存储单元包含登记状态(0未注册,> 0是注册)。
我们需要知道的就是当程序改变状态未登记。换句话说,什么时候会写在该存储单元的零值。
一个简单大多数
按Ctrl + F2来终止程序。我们需要再次启动程序捕捉了片刻,当cell[5D3190]将与0(未注册状态)写的。但是,如果我们已经看到了NAG我们不会赶上那一刻。这就是为什么我们要启动它了。因此,再次运行程序。你会打破我们的第一个断点(在00684044)前代表。按F8一次。现在,我们在实际(解压码)开始005CB4E0了。
现在去转储窗口。按Ctrl + G,键入5D3190,然后按“确定”去了。你将在适当的地方。
0057A28D : C645C300 MOV BYTE PTR SS:[EBP-3D],0
0057A291 : C60590315D0000 MOV BYTE PTR DS:[5D3190],0; <=OLLY激活,在这里
0057A298 : 8D854CFDFFFF LEA EAX,DWORD PTR SS:[EBP-2B4]
0057A29E : 8B15 48275D00 MOV EDX,DWORD PTR DS:[5D2748] ;点到 "zplayer.regkey"
哈哈,让我们牢记这一点,首先我们见过,未注册的状态保存的地方。顺便说一下,如果你能跟踪一些比较好,你会看到程序试图加载文件“zplayer.regkey”,然后检查其有效性。但是我们继续前进,因为我们不关心的关键在意,我们的目标是登记没有找到有效的连续/密钥等方案,但扭转了未经注册登记的状态。这就是为什么继续按F9看到旁边的地方(如果程序有它)去。
尝试...程序运行和NAG已经显现。好吧,这意味着这里有一个经典的算法。首先,程序移动到一个细胞未登记的状态,然后它会尝试加载注册表许可证文件/许可证ini-file/license键(没关系,因为这只是方法)。第二,如果它未能载入许可证密钥,或者它不是有效的运行,然后它只是像往常一样,显示NAG的,所有收费功能被禁用等,如果关键是有效的(后检查它)计划肯定会动议登记状态(在本例中的东西> 0 [1 ..法郎],因为那jnz换成,记住),而且将被注册。
注。什么都可以,有时不那么容易。寄存器状态细节可以被初始化为未注册状态已经(在编译的话,)。或者有可能是一些这样的记忆细节。此外,有可能是没有这样一个像我们这样简单的假设:
CMP BYTE PTR [RegisteredState],0
JNZ GOOD_BOY
但也可能有一些其他比较喜欢这个技巧:
MOV EAX,[RegisteredState]
PUSH EAX
... 其他命令 ...
XCHG DWORD PTR [EBP+A],EDX
CMP EDX,00BAD000
JZ BAD_BOY
还是其他什么东西,更活泼。一切都取决于作者的思想。不过,这并不意味着你不能抓住它。它只是意味着一切并非如此简单。
现在我们知道,我们有标准的(经典)计划,这意味着登记过的存储单元只能写入两次(只有一页的情况作为例子):
一次在编译(未注册/登记的状态),然后在程序运行(如果该密钥是无效/有效);
只有在程序运行时,先重点检查程序后,如果关键是有效/无效。
因此,我们只需要更换一个字节的命令字节的PTR MOV的点心:在地址0057A291 [5D3190],1:[5D3190],0为MOV字节的PTR DS中。
我们不知道到底应该是什么值,但如果有一个jnz换成指令,那么我们建议,应该是任何值的字节区间(01 ..FF)大于零大。
通过了解上述所有,所有剩下的就是我们尝试将它的工作与否。它的简单测试。再次重新启动程序。按F9。它应该再次打破在OEP处。按F7/F8来获得代表。我们再次在地址005CB4E0。按Ctrl + G,键入0057A291(它的前面,我们已经找到地址)在外地,按“OK”。现在,按空格,然后键入“MOV的字节的PTR点心:[5D3190],1”而不是“字节的PTR MOV的点心:[5D3190],0”,按“组装”,以确认更改。
正如你可以看到只有一个字节改变(从00到01)在地址0057A297。请记住,对于进一步修补的事实。在此之后对Beta测试按F9。万岁!它运行无限额的罚款唠叨。此外,如果你会去的选项,你不会再找到“注册”在信息栏按钮。不过,这仍是字符串“这个副本是未经注册的”。我想这是因为该程序没有找到章与代码和名称的文件,但它认为,它的注册反正。
确定,重新启动该程序再次(用Ctrl + F2)和准备修补这个子程序。
在fly中制作一个内联补丁
与F9键运行程序停止在著名的断点(在00684044)。我们知道如何修补和地点。我们需要的是找到一个地方,使我们的内嵌补丁。要做到这一点,我们必须找到基址有可执行文件。这个消息,我们需要找到一些自由空间(一零序),我们将使用我们的补丁。
要了解基址具有可执行打开使用Alt +男快捷的存储器映射。找到一行,所有列“zplayer”和“PE header”的类型列。
注意在地址列的值。它等于00400000。这是基址本身。当然你也可以单击该行和滚动窗口的出现,找出相同的值(这将有适当的名称 - 图片基地)下来。实际上,我们需要这种价值只找到可执行文件的开头一个自由的空间。正是从“锰锌”签名(前两个方案字节)。你总是会找到在任何可执行文件的头零序列。这是一个预留空间,这从未使用过。因此,它可以使用。
我们已经把所有的信息,使一个补丁。关闭内存映射和去转储窗口。按Ctrl + G,输入00400000(我们先前得到的值),然后按“确定”。我们在可执行文件的开头(就在头的解压缩的可执行文件的开头)。翻阅了一下,装出一副一零序列。滚动...我们看到的是什么呢?在地址00400080小空间。嗯,你可以使用这个空间,但是你愿意滚动下跌了一点。应该有一个空间,从00400300。滚动一次...啊哈!就像我告诉你,有一个很大的自由空间在前述的地址。大多数拥有它的可执行文件,正是从该地址。
转到代码窗口。还是应该站在你的光标在地址00684044。新空间改变,从“JMP 005CB4E0”到“JMP 00400300”跳。换句话说,我们只是改变从跳跳到我们的补丁后回到远来的地方
按回车键在你刚更改的命令,去00400300。你看,它的零爆满。让我们创建我们的补丁了。按空格,然后键入“MOV BYTE PTR [0057A297],1”。下降的标志,再按“Assemble”(不要关闭窗口Assemble)“与Fill with NOP's”。这就是我们的补丁!
有一件事我们必须做的是引导程序的代表。简单地说,键入“JMP 005CB4E0”,按“Assemble”了,并关闭Assemble窗口。
我们正在改变在00到01地址[0057A297],因为它的命令的最后一个字节。换言之,这只是我们所做的命令更改。因此,有没有需要移动存储器的相同的命令(字节),但只有那些需要加以改变。
现在我们正在做。所有您需要做的是保存所有的修改到另一个或同一个文件。
我用了几个星期Zoom Player
但是当我开始有一天我看到一个奇怪的消息,它反映了完整性检查的东西。我甚至没有认真对待,并按下“确定”,但该程序只是退出让我感到吃惊。
之后,我开始了程序再次,我突然明白了,这是一个隐藏的保护,这是以前没有检测到,因为它只是不能被检测到。看来,这种简单的自我检查somekind可执行。换句话说,它只是一个简单的CRC校验模块的内容检查。
所有我们需要做的就是消除这个意外的消息,停止运行该程序。要做到这一点,再次重新启动该程序(如果它运行)。在地址00684044设置一个断点,然后按F9。OLLY打破该地址。现在按F8一步一步00400300我们的内嵌补丁。步,直到你达到程序(005CB4E0)的代表。
同样的,现在我们开始时,我们正在寻找的提示。换言之,在我们现在的地址右击,然后选择“按照转储/选择”。按Ctrl + B,并尝试搜索的“完整性检查”作为一个Unicode字符串(不要忘记设置标志“整个块”,以涵盖所有的可执行文件的内存范围)...嗯,没有运气!嗯,奇怪。尝试搜索作为一个ASCII字符串。是啊!我发现它在0054A444。看上去有点上面,你会看到字符串(“Zoom Player Professional")的开始。
我认为我们并没有发现为Unicode它,因为它可能是撰文提出,节省空间。是的,这是正确的。他做了一个简单的字符串(“Zoom Player Professional”)与其他字符串来连接它。就是这样。这就是为什么我们没有发现为Unicode字符串。当然,这只是我的理论,所以不要把理论当作教条看待它。
现已形成集上获得了我们所找到字符串的第一个字节内存断点。如你所知,我们并不需要,只是想与NAG的字符串我们只需要抓住一个处理该字符串。因此,选择只有一个字节的地址0054A444,右键今(选中)字节单击开始,然后向上通过菜单并选择“断点/内存的访问”。现在按F9键,等待大约10秒钟。当奥利将打破一些地址(我是004D1E82)删除断点。要做到这一点,就在代码或转储窗口中点击,然后选择“断点/删除内存断点”,从出现的弹出菜单。微量F8键,直到这个地方一点:
0057DF3C : 803D8C315D0000 CMP BYTE PTR DS:[5D318C],0 ; the reason of jump
0057DF43 : 7544 JNZ SHORT zplayer.0057DF89 ; jump over the NAG
0057DF45 : 833D64245D0000 CMP DWORD PTR DS:[5D2464],0 ; the second reason
0057DF4C : 753B JNZ SHORT zplayer.0057DF89 ; another jump
0057DF4E : 6A00 PUSH 0
0057DF50 : 8D45F4 LEA EAX,DWORD PTR SS:[EBP-C]
0057DF53 : 8B0D58245D00 MOV ECX,DWORD PTR DS:[5D2458] ; @("Zoom Player Professional")
0057DF59 : 8B1554245D00 MOV EDX,DWORD PTR DS:[5D2454] ; @("has failed integrity...")
0057DF5F : E84C71E8FF CALL zplayer.004050B0 ; it concatenates two strings
0057DF64 : 8B55F4 MOV EDX,DWORD PTR SS:[EBP-C] ; <= you will be here
0057DF67 : 8D45F8 LEA EAX,DWORD PTR SS:[EBP-8]
0057DF6A : E8C177E8FF CALL zplayer.00405730 ; converts string to Unicode
0057DF6F : 8B45F8 MOV EAX,DWORD PTR SS:[EBP-8] ; EAX points to Unicode string
0057DF72 : 668B0DC8E25700 MOV CX,WORD PTR DS:[57E2C8]
0057DF79 : 33D2 XOR EDX,EDX
0057DF7B : E884E0F2FF CALL zplayer.004AC004 ; this is that crazy message
0057DF80 : 33D2 XOR EDX,EDX
正如你所看到的,如果有地址[5D318C]或地址[5D2464]不为零的存储单元的内容,那么你会看到没有消息。这是我们需要的方式。好了,再次重新启动该程序,按F9键。你在address00684044了。跟踪,直至代表。右击,选择“按照转储/选择”。按Ctrl + G,在出现的对话框中输入“005D318C”,然后按“确定”。所有我们现在需要的是抓住一个时刻,当这种细胞将被写入一些值(可能为零,因为原来的[不打补丁] exe文件的CRC从补丁的EXE的CRC不同)。
注。我们只需要知道,当我们写的细节之一,因为'是比较是否为零,随后在消息跳(或不)。这就是为什么我们需要的只是'时间之一。因此,选择任何。我选择了首先是因为它是一个字节(第二个是DWORD)。
要知道,当细胞[5D318C]将一个价值,在地址005D318C,右击选择写“断点/内存,写”。现在,只需按F9键。一旦你这样做,你会看到这样的事情:
00562DF2 : BA00040000 MOV EDX,400
00562DF7 : B8DB030000 MOV EAX,3DB
00562DFC : E85B500500 CALL zplayer.005B7E5C ; returns 0 (bad CRC) || > 0 (good)
00562E01 : A28C315D00 MOV BYTE PTR DS:[5D318C],AL ; <= Olly broke-up here (EAX = 0)
00562E06 : 33C0 XOR EAX,EAX
请记住这个地方(00562E01),然后按F9再次看到,如果有任何其他地方在这之前在地址0057DF3C比较...的BAMS!而你看到相同的消息了。这意味着,只有一个地方,在那里我们的单字节[5D318C]是零值写入。所有已经离开我们要做的就是写了一些积极的和大于零值到该单元格(如01)。
提高内联补丁
首先,你必须决定如何修补它,然后添加你已经决定到我们的内嵌补丁补丁。它有许多是打补丁的方式。您首先想到的可能会是这样的。让我们改变“MOV BYTE PTR DS:[5D318C],AL”的(A2 8C 31 5D 00 => 5 bytes),以”MOV BYTE PTR DS:[5D318C],01“(C6 05 8C 31 5D 00 01 => 7 bytes)。哦,不是一个坏主意,但可惜它会增加5至7个字节的命令。你或许会问,那么什么。没有什么,但有一个命令“XOR EAX,EAX" (33 C0)”在地址00562E06,这也正是两个字节长。如果我们将在这样的方式修补我们就失去了命令。因为我们没有写这个程序,那么我们不知道,怎么会没有这两个方案字节长的命令作出反应。
你可以在其他不同的方式修补,但离开它。我认为最“正确”的方法是打补丁的。别忘了,我们正在以一个内嵌的补丁,所以这个补丁不同(在无加壳的EXE)从一个普通的补丁。随着补丁,你能想像的补丁,但不直接在EXE补丁此类。因为你不能直接在解压的EXE补丁,你必须等待时exe是解包并打补丁。这就是主体意识的内联补丁
我们需要什么样的最终补丁的需要。不要太多,只是觉得有点。试想一下,我们只是没有命令“MOV BYTE PTR DS:[5D318C],AL”的解压的EXE。试想一下它。如果是这样,怎么会在这种情况下,程序的行为?没错,它总是给我们带来的消息,如果病程第二存储单元([5D2464])也将为零。所以,如果我们马上写有5个字节与NOP的长的命令,程序将永远不会写零的值。这正是我们需要的,但它不退出不够。最后要做的事情是写了一些值大于存储单元[5D318C]零(如01)。
实际的补丁将是这样的。在最后重新启动程序时,按F9到达著名的断点00684044。按F8一次,可以给我们打补丁的地址00400300。我们要以将其添加一点。再次按F8(因为我们的第一个补丁工作正常,所以离开它)来设置光标到00400307。新闻空间,打“MOV EAX,562E01”,按“组装”。这是该报告中,我们要填充与NOP的第一个字节。键入“MOV DWORD PTR DS:[EAX],90909090”填补了前4个与NOP的字节。然后键入“MOV BYTE PTR DS:[EAX+4],90”,以填补最后( 5th)与NOP字节。在此之后,键入“MOV BYTE PTR DS:[5D318C],1”设置一个值,我们需要的,而不是零。我们设定一(01),因为这样的程序会一直以为它的CRC就可以了。最后,键入补丁“JMP 005CB4E0”,这将返回控件补丁解压后,我们计划的最后命令。
当然,这种补丁要大得多,但每一次的工作。在最后一次保存的变化和运行程序。它工作正常。
说的最后一句话
这不是很难找到一个地方或一个方法,使内联,特别是UPX压缩补丁。我只是表明你对修补方法之一。顺便说一下,如果你不熟悉的太多与UPX压缩内嵌补丁(或所有),那么我建议您阅读Detten's tutorial关于如何做到这一点的教程。我建议你他的教程,因为它的简短,简单和非常清楚下手。此外,它包含了一些理论,我没有提到在本次调查。
作为这个文章的最后一句话,我不得不说,是因为有很多很多人做同样的方法,因为我们没有以上。您甚至可以使用不同的方法解决,没什么可说的内嵌补丁,因为最后的事情可能会有所不同,从黑客的经验,他的编程知识,直觉,从他的逻辑过程和。这就是为什么不担心任何事情你不能做。只要继续前进,你会做的一天。
所有权利逆转(c)2004 - BiW Reversing - http://www.reversing.be - 挑战是你
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]再见,看雪论坛,这一次是永远! 17584
- [求助]更改文章标题怎么还要扣KX? 11725
- [分享]根据国外的开源B树写了一份C++版本。 8635
- [原创]去掉标题免得被喷...... 7253
- [讨论]以前搞360,现在搞百度? 4762