0
点赞
收藏
分享

微信扫一扫

逆向工程核心原理----第二十章内嵌补丁练习

日月同辉9908 2022-04-14 阅读 82
安全

内嵌补丁这种方法适合于不便直接修改指定的代码,比如程序中含有校验函数,加解密函数等等。

零、运行源程序

 

 意思就是我们得修改这两处地方pack掉他吧。

一、分析源程序

用ollydbg打开unpackme.exe

一上来就进入函数,可以看到其下的内容是乱码,查找字符串也无果。

入栈了4010F5后继续进入函数

40109B函数内容如下

 首先对4010F5到401248地址上的内容异或44,然后调用两个函数,一个个来看

4010BD函数同样是异或操作,将401007到401085的内容异或7;将4010F5到401248上的内容异或11

 401039函数代码如下

 首先累加了4010F5到401248上的值,结果存到edx中。

之后调用了40108A函数,40108A函数操作同上面一样,将40124A到401280的内容异或了17。

然后回到主函数将edx的值与一个固定值做比较,若不相等则调用401262函数,通过函数入栈的参数“Error,Crc of this file has been modified”显然可以看出这个前面是一个检验操作,若4010F5到401248的内容被修改过则会报错退出。

当检验通过后,会跳转到40121E地址上,但此时发现其上是db型数据,这是因为之前的异或操作,也就是解码操作,修改到了其上的内容,只需右键->analysis->analyse code即可恢复成容易看的汇编指令

 

 获取程序模式句柄后,调用DIialogBoxParamA,经查阅,其功能是创建一个对话框,参数DlgProc是一个窗口过程函数,该函数为一个应用程序定义可与DialogBox函数一起使用的回调函数,总之是个函数就对了,进去看看,crtl+G输入4010F5来到该函数地址上。

现在就可以看见熟悉的字符串和API了,我们要做的就是修改掉字符串。该字符串位于校验和函数检验的区域内,直接修改检验将不通过,虽然可以同时修改检验和,但今天要做的是内嵌补丁,就仅考虑内嵌补丁的方法。

 三、分析内嵌补丁的合适位置

合适位置有三:文件的空白区域,添加到新节区,扩展节区;当补丁代码较少时可以优先考虑第一种。

用PEView查看一下文件的结构。

 可以注意到其第一节区text节的RVA为1000,实际大小是280,占用大小是400,所以后面还剩好多地方都是空白的,也就是ollydbg中401280后,当真如此。

 这就是补丁的合适位置了。

四、打补丁

上文中,我们提到检验和通过后将进入40121E函数,该函数调用了DialogBoxParam,所以第一步需要修改检验和通过后的跳转指令,让其跳转到内嵌补丁中,也就是401280上。

 需要注意的是,401083位于401007到401085中,这个区域经过了异或7的操作,所以我们的jmp unpackme.00401280的机器码 E9 F801就需要先和7异或,得到EEFF06,后面的0000不需要异或,因为他俩已经在401085之后了。

ctrl+F2重新调试程序,在dump窗口中来到401083,将原先的EE9106修改为EEFF06

那么接下来就是401280上的指令书写了。我们需要修改的字符串位于40110A和401123上,可以用rep movs指令将我们已经准备好的字符串覆盖他们。

rep指令一般和其他指令结合使用,当计数寄存器ecx上的值不为0时会循环执行其后的指令,比如rep movs就是循环执行movs指令直到ecx为0。

这部分指令直接照搬的书上的,方法是结合使用assemble(空格键)和ctrl+E,输入汇编指令ollydbg会转为机器码的。

 之后右键->copy to excutable->all modifications,在新弹出的窗口右键->save file即可。

运行得到

 内嵌补丁成功啦。

 

 

举报

相关推荐

0 条评论