- UID
- 13801
注册时间2006-5-22
阅读权限40
最后登录1970-1-1
独步武林
该用户从未签到
|
飘云老大为我们初学者小组提供了这个 CrackMe #3 For PYG5.4 Cracker,要求用LOADER来实现。当时初学,直接脱壳,暴破完成了。现在把用LOADER技术的方法写出来,与飘云老大及各位学友交流下。
一、我对LOADER的理解
LOADER,我自己理解就是一段加载程序,由它来把原来的程序运行起来,并在它的控制下,来完成对原程序的一些动态修改。
自己用过一些用LOADER破解的软件,如JCREATOR PRO,对那个LOADER的图标印象深刻,呵呵~~~~~~,不知道也没有生成LOADER的工具(很多LOADER的图标都是一样的)?
二、简单的LOADER实现思路
简单的LOADER我以为就是加载入程序后,动态写内存,和SMC类似,不同的是SMC一般是对文件本身做了修改,代码已经写在文件里了,而LOADER则是在软件加载或运行后,才把自己需要的代码写进去的。
最简单的方式就是用READPROCESSMEMORY和WRITEPROCESSMEMORY来实现,基本上就是把OD中对代码进行汇编的操作用程序来完成。只要找到要修改的地址和代码,然后WRITE到那个软件的进程进去就可以了。
三、复杂的LOADER实现
我只做了这一个LOADER的练习,实在讲是没资格说这些,不过一点心得与友分享下。复杂的LOADER我目前知道的是借助WINDOWS的调试API来成的,就是自己应用调试API,来写一个自己的小调试器,这样可以设置自己所需的断点,单步执行等功能。应用WAITFORDEBUGEVENT等API来实现。
四、飘云老大的CrackMe #3 For PYG5.4 Cracker的LOADER实现
这个CRACKME应该是有个壳的,不过没查出来。用OD调试时,用ESP可以脱掉,DUMP出来可以自动运行。
其中关键地址有如下三个:
BREAKADDRESS: DWORD = $40A413;\\JMP OEP
ADDRESS1: DWORD = $40102A;\\第一个去单实例检验的地方
ADDRESS2: DWORD = $401037;\\第二个去单实例检验的地方
如果简单来做的话,可以在脱壳后的程序基础上用简单LOADER实现的方法来完成,只要WRITEPROCESSMEMORY把ADDRESS1,ADDRESS2内的地址写9090(NOP NOP)就可以了。
不过如果完全按照要求的话,我想应该是不脱壳的基础上来完成。这就有一个难点在于:未脱壳前,ADDRESS1,ADDRESS2的内容还是空的,没有脱壳后的代码,只有等到脱壳后才可以进行WRITEPROCESSMEMORY的操作。所以,这就需要用到DEBUG API,我们需要的结果是:如同在OD中一样,在JMP OEP这个地址时,能够中断下来。这时,ADDRESS1,ADDRESS2内已是真正的代码,可以修改代码为NOP。
所以应用DEBUG API需要这样做,在第一次断点时,在BREAKADDRESS处写CC(INT 3 中断),以便执行到JMP OEP这个地址时能够引发下次中断。然后在第二次中断时,我们知道已经完全脱壳,ADDRESS1,ADDRESS2中为真正代码,此时再把NOP写入到这两个地址中,并且恢复原来BREAKADDRESS处的代码。这样,就相当于我们在OD所完成的操作了。
有一些关键词可以方便大家在网上找到自己所需的资料:
WRITEPROCESSMEMORY
READPROCESSMEMORY
WAITFORDEBUGEVENT
也可查MSDN。
初次接触LOADER,不知有没有其它更简单的方法(或者生成工具),请大家指教~~~~~~~~~~~
我做了一个,请参见:https://www.chinapyg.com/viewthr ... &extra=page%3D1。
[ 本帖最后由 caterpilla 于 2006-6-19 13:39 编辑 ] |
评分
-
查看全部评分
|