• 标 题:对ljtt《金天地MH型软件狗 "时间间隔检测保护"的一点分析》一文的一点补充 (1千字)
  • 作 者:真.hp
  • 时 间:2000-12-29 22:28:52
  • 链 接:http://bbs.pediy.com

我看了ljtt的那篇文章,于是跟着作了,但却不成功,于是我也跟踪了一下,
发现程序在015F:00408A2F处有一call走过之后就会推出,于是用F8跟进

0040782F 55              push    ebp
00407830 8BEC            mov    ebp, esp
00407832 83EC4C          sub    esp, 4Ch
00407835 53              push    ebx
00407836 56              push    esi
00407837 57              push    edi
00407838 C745C800000000  mov    dword ptr [ebp-38h], 0
0040783F 833D7C30410000  cmp    ds:dword_41307C, 0      <-判断此处是否为0
00407846 0F843B010000    jz      loc_407987              <-跳就完了
0040784C C745D0724102CF  mov    [ebp+var_30], 0CF024172h
00407853 8175D035247683  xor    [ebp+var_30], 83762435h

由于后面的程序还会判断41307C是否为0,所以我把0040783F处的代码改为

0040783F C6057C30410001  mov      ds:dword_41307C, 1

正好也是7个字节,这样就可以对付以后的判断了。另外

004079FD  C705183041004C9B4000  MOV DWORD PTR [00413018],00409B4C

的代码和

00408F28  C705183041004C9B4000  MOV DWORD PTR [00413018],00409B4C

一样于是我把它也改为

C705BE324100D3000000  MOV DWORD PTR [004132BE],000000D3

否则照样无法运行。

被mh-dog加壳的程序的那个用来还原程序数据的“密匙”
放.data的某处(在notepadmh.exe中为123FFh处),只要
一个字节即可,而源程序的oep,放在.gdata的+18h处的4
个字节(dj-dog加的壳的oep在.gdata的+10h处)。
我还没找出好方法来判断那个“密匙”存放的地方。

最后,我要感谢ljtt的无私奉献!
ps:ljtt,你能把如何反推出“密匙”的方法详细的讲一下吗?
我比较笨,怎么跟都看不懂算法。

  • 标 题:如何快速破解被金天地DJ,MH型狗加壳的程序。 (2千字)
  • 作 者:真.hp
  • 时 间:2000-12-31 22:27:35

此方法仅对被金天地DJ,MH型狗加壳的程序有效,
对彩虹天地的DJ,MH型狗可能无效。由于例子太少
,无法作太多的研究。请有软狗的人像小牧童一样
把notepad用软狗加密程序加密一下放到网上供人
下载,或发给我hp_xm@elong.com,好让我有更多
的例子可研究。(记的写明是哪种狗加的壳)

现在开始(以小牧童的那6个程序为例):

DJ型狗

打开notepaddj.exe,转到.gdata段。
.gdata+10h处放的是程序的oep(4字节),
.gdata+14h和.gdata+26h(各4字节)存放
的是程序运行的期限,即程序未过期时可免
狗运行。算法如下:
(设.gdata+14h处为11 22 33 44,.gdata+26h处为55 66 77 88)
11 xor 55   得出日期
22 xor 66   得出月份
4433 xor 8877 得出年份
日期同时也是那个关键的“密匙”,当日期为0时dj狗的
“密匙”为0Bh,mh狗的“密匙”为D3h。(后半句未经
验正,不知是否于狗有关)
.gdata+74h处放的是加壳方式(4字节)为1时无狗可运行,
但过期后要狗,为0时要有狗才能运行。
现在我们来修改notepaddj.exe,
把.gdata+74h处改为 01 00 00 00,
把.gdata+14h处改为 0B 0C 0F 27
0B(日期兼“密匙”)0C(12月)0F27->270F(9999年)
把.gdata+26h处改为 00 00 00 00
这样改过之后程序就可以运行了,过期日9999年12月11日。

MH型狗

打开notepadmh.exe,转到.gdata段。
.gdata+18h处放的是程序的oep(4字节),
.gdata+1Ch和.gdata+2Eh(各4字节)存放
的是程序运行的期限,即程序未过期时可免
狗运行。算法如下:
(设.gdata+1Ch处为11 22 33 44,.gdata+2Eh处为55 66 77 88)
11 xor 55   得出日期
22 xor 66   得出月份
4433 xor 8877 得出年份
日期同时也是那个关键的“密匙”,当日期为0时dj狗的
“密匙”为0Bh,mh狗的“密匙”为D3h。(后半句未经
验正,不知是否于狗有关)
.gdata+7Ch处放的是加壳方式(4字节)为1时无狗可运行,
但过期后要狗,为0时要有狗才能运行。
现在我们来修改notepadmh.exe,
把.gdata+7Ch处改为 01 00 00 00,
把.gdata+1Ch处改为 D3 0C 0F 27
D3(日期兼“密匙”)0C(12月)0F27->270F(9999年)
把.gdata+2Eh处改为 00 00 00 00
这样改过之后程序的过期日9999年12月211日,但此时还不
能运行。因为加了mh的限期运行的壳后它会生成一个文件,
这个文件是用来记录程序上次运行的时间,如果没有这个
文件程序就不能运行,如果存在,它会读取这个文件,判
断程序上次运行的时间是否小于当前时间,如果大于当前
时间则拒绝运行。这个文件大小为20字节
.gdata+84h处的4个字节,文件内容与这4个字节有关系,
不过我不知道算法。
.gdata+88h处放这个文件的文件名。
我们把.gdata+84h处的4个字节改为00 00 00 00
把.gdata+88h处改为"date.dat",并建立一个大小为20字
节,内容均为00h的文件date.dat,这时即可成功运行程序。

  • 标 题:分析得这么透彻,真不简单!!祝你元旦快乐! (1千字)
  • 作 者:ljtt
  • 时 间:2000-12-31 23:04:28
  • 链 接:http://bbs.pediy.com

我是这么改的。

Comparing files NOTEPADDJ.EXE and TEMP\CRDJ.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 0B
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADDJ1.EXE and TEMP\CRDJ1.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 0B
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADDJ2.EXE and TEMP\CRDJ2.EXE
00005E75: 55 C3
00006B8D: 10 96
00006B8E: D0 D2
00006B91: 06 16
00006B92: 78 00
00006B93: 40 00

Comparing files NOTEPADMH.EXE and TEMP\CRMH.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C D3
00008F2F: 9B 00
00008F30: 40 00

Comparing files NOTEPADMH1.EXE and TEMP\CRMH1.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C D3
00008F2F: 9B 00
00008F30: 40 00

Comparing files NOTEPADMH2.EXE and TEMP\CRMH2.EXE
000079EB: 89 C7
000079EE: 83 00
000079EF: 7D 00
000079F0: B4 00
000079F2: 74 EB
00008D46: 89 C7
00008D49: 83 00
00008D4A: 7D 00
00008D4B: C8 00
00008D4D: 74 EB
00008F2A: 18 BE
00008F2B: 30 32
00008F2E: 4C 16
00008F2F: 9B 00
00008F30: 40 00

  • 标 题:在你贴出那篇文章之前我已作了不少研究,但被卡在那个“密匙”处,我找不出恢复数据“密匙”,你那篇文章给... (147字)
  • 作 者:真.hp
  • 时 间:2000-12-31 23:11:40
  • 链 接:http://bbs.pediy.com

标题: 在你贴出那篇文章之前我已作了不少研究,但被卡在那个“密匙”处,我找不出恢复数据“密匙”,你那篇文章给了我很大帮助!也祝你新年快乐!

内容:

  • 标 题:我则是小牧童的笨笨招下启发的,他不是说关键的是小部分,大部分是对付破解的代码。所以。。。。 (633字)
  • 作 者:ljtt
  • 时 间:2000-12-31 23:24:07
  • 链 接:http://bbs.pediy.com

我想找出关键的地方就行了,就没有去关心其他的转换的过程了。我是逆推的。
其实我也很笨.......只不过是因为我早已过了“迷时师渡”的年龄,虽然笨到无法“悟”得,但也只好过着“自渡”的生活,加上爱一点面子的原因,所以有问题总是自己想办法解决。虽然很苦,但也有乐趣。:-)

这个所谓的“算法”说出来让你笑掉大牙!你看了就知道我是多么得头脑简单,只能对付这种被我冠以“算法”/“密匙”的一段代码,所以别被我唬住了,什么“密匙”/“算法”那都是我.........面子.........上的一点考虑.......。
程序那一大段代码是为了迷惑视线的。可以简化为:
            key = key * 0x4e35;
            key = key & 0x000000ff;
            key = key + 1
所以我说“很简单”,是真的很“简单”了。