caterpilla 发表于 2006-6-19 13:33:39

飘云老大的 CrackMe #3 For PYG5.4 Cracker的LOADER实现方法

飘云老大为我们初学者小组提供了这个 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/viewthread.php?tid=5132&extra=page%3D1。

[ 本帖最后由 caterpilla 于 2006-6-19 13:39 编辑 ]

快雪时晴 发表于 2006-6-19 16:34:22

好文适合我

lhl8730 发表于 2006-6-19 18:14:32

学习了,谢谢!!

spc_cll 发表于 2006-6-19 19:21:14

兄弟把Loader的原代码贴出来啊,让大家学习学习。

我们上论坛不就是为了技术分享吗?

hanxiucao 发表于 2006-6-19 20:20:47

挺陌生的名词,谁叫我是门外汉呢,先学一点吧!

spc_cll 发表于 2006-6-20 00:31:03

兄弟根据跟踪调试主题里的CrackMe,写了一个读写内存的例子,里面包含源代码。

大家可以参考一下,也许对写Loader程序有所帮助。

读写内存---拦截API函数[源代码]

飘云 发表于 2006-6-20 07:09:32

原帖由 spc_cll 于 2006-6-20 00:31 发表
兄弟根据跟踪调试主题里的CrackMe,写了一个读写内存的例子,里面包含源代码。

大家可以参考一下,也许对写Loader程序有所帮助。

读写内存---拦截API函数

妙哉!这才是解这个CrackMe的正确方法!
兄弟何不DELPHI--ASM?那样文件就小了!

hbqjxhw 发表于 2006-6-20 08:00:01

不知我做的这个算不算LOADER,对CRACKME#3的
附件: crack3Prj.rar (2006-6-10 19:32, 176.07 K)
该附件被下载次数 8

试了一下,好像不能连续LOAD

caterpilla 发表于 2006-6-20 08:48:08

原帖由 hbqjxhw 于 2006-6-20 08:00 发表
不知我做的这个算不算LOADER,对CRACKME#3的
附件:crack3Prj.rar (2006-6-10 19:32, 176.07 K)
该附件被下载次数 8

试了一下,好像不能连续LOAD

目前做的LOADER比较笨,只能LOAD一个,多开需要运行多个LOADER来完成。

caterpilla 发表于 2006-6-20 08:52:03

原帖由 飘云 于 2006-6-20 07:09 发表


妙哉!这才是解这个CrackMe的正确方法!
兄弟何不DELPHI--ASM?那样文件就小了!
果然是高手,佩服SPC_CLL和飘云,原解应该是修改一下CREATEMUTEX?
要挂到别的进程,是否还得用HOOK?

看来我又走弯道了。。。。。。。。:L

[ 本帖最后由 caterpilla 于 2006-6-20 09:20 编辑 ]
页: [1] 2
查看完整版本: 飘云老大的 CrackMe #3 For PYG5.4 Cracker的LOADER实现方法