首页
社区
课程
招聘
[旧帖] [原创]PowerISO V4.3 Patch 0.00雪花
发表于: 2009-2-5 18:50 3844

[旧帖] [原创]PowerISO V4.3 Patch 0.00雪花

2009-2-5 18:50
3844
【文章标题】: PowerISO V4.3
【文章作者】: yangjt
【作者邮箱】: yangjietao123@163.com
【作者主页】: http://blog.sina.com.cn/yangjt
【作者QQ号】: 325002492
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  打开软件……发现蹦出一个nag,于是乎就想去掉它……
  
  OD装载……很显然……没有壳……然后找字符串……结果发现都是英文的……突然想到这是个多国语言版,于是乎找unreg这个字符,找到这个地方
  
  00432298   .  68 08314D00   [color=#0000D0]push[/color]    004D3108                         [color=#008000];  unregistered copy[/color]
  

  
  然后IDA打开分析之~~
  发现sub_432240这段函数里有很有意思的东西~~
  
    CString__operator_([color=#808080]"PowerISO"[/color])[color=#008000];[/color]
    [color=#b000b0]if[/color] ( !(_BYTE)dword_5305B4 )
    {
      sub_48CDDF([color=#808080]"("[/color])[color=#008000];[/color]
      v5 = sub_46F0F0(39, [color=#808080]"Unregistered copy"[/color])[color=#008000];[/color]
      sub_48CDDF((LPCSTR)v5)[color=#008000];[/color]
      sub_48CDDF(L[color=#808080]")"[/color])[color=#008000];[/color]
    }
  

  
  很显然……有没有注册就是判断5305B4这个位置的值是不是0……
  根据程序的意思,如果是0那就没有注册,反之就是注册……这下就简单了……我们先把它改成1试试看……
  事实证明,改成1以后那个程序标题上的未注册版就没有了……但是NAG还是存在……于是乎继续找字符串……
  找到下一个字符串unreg的地点
  
  00451201  |.  68 08314D00   [color=#0000D0]push[/color]    004D3108                         [color=#008000];  unregistered copy[/color]
  

  这里……IDA里F5
  
    [color=#b000b0]if[/color] ( (_BYTE)dword_5305B4 )
    {
      [color=#b000b0]if[/color] ( strlen(byte_5305D8) - 1 <= 0x14 )
      {
        v19 = sub_46F0F0(38, [color=#808080]"Registered to:  "[/color])[color=#008000];[/color]
        CString__operator_((LPCSTR)v19)[color=#008000];[/color]
        a2 = off_4DB5D4[color=#008000];[/color]
        CString__operator_(byte_5305D8)[color=#008000];[/color]
        [b][color=#000080]LOBYTE[/color][/b](v23) = 5[color=#008000];[/color]
        CString__operator__(&a2)[color=#008000];[/color]
        [b][color=#000080]LOBYTE[/color][/b](v23) = 1[color=#008000];[/color]
        sub_48CA90()[color=#008000];[/color]
        Rect.left = 0[color=#008000];[/color]
        Rect.right = v4[color=#008000];[/color]
        v20 = *(_DWORD *)v3[color=#008000];[/color]
        Rect.top = v26 + 10[color=#008000];[/color]
        Rect.bottom = v5 + v26 + 10[color=#008000];[/color]
        (*([color=#0000D0]int[/color] (__thiscall **)(void *, void *, _DWORD, struct tagRECT *, signed [color=#0000D0]int[/color]))(v20 + 104))(
          v3,
          v22,
          *((_DWORD *)v22 - 2),
          &Rect,
          1)[color=#008000];[/color]
      }
  

  看来不仅要判断5305B4这个位置,还要判断5305D8这个位置……据分析……这个位置应该就是用来储存注册用户名的,既然要储存,当然要写入……那就在这里下硬件写入断点,会断在两个地方……
  
  Place 1
  
  004305C3  |.  881D D8055300 [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305D8], [color=#FF0000]bl[/color]            [color=#008000]; |[/color]
  004305C9  |.  881D 90055300 [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [530590], [color=#FF0000]bl[/color]            [color=#008000]; |[/color]
  004305CF  |.  FF15 10D04A00 [color=#0000D0]call[/color]    [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [<&ADVAPI32.RegCreateK>[color=#008000]; \RegCreateKeyExA[/color]
  
  
  
  Place 2
  00430483  |.  881D D8055300 [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305D8], [color=#FF0000]bl[/color]            [color=#008000]; |[/color]
  00430489  |.  881D 90055300 [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [530590], [color=#FF0000]bl[/color]            [color=#008000]; |[/color]
  0043048F  |.  FF15 10D04A00 [color=#0000D0]call[/color]    [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [<&ADVAPI32.RegCreateK>[color=#008000]; \RegCreateKeyExA[/color]
  

  很显然……程序从注册表里读完了数据就开始往内存里写,据分析……place 2 是从place 1后面的某个Call 过来的,所以我们只改第一个Call就好了……
  
  找到第一个procedure的起始地址,然后开始补丁
  
  00430590      C605 B4055300>[color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305B4], 1
  00430597      C605 DC055300>[color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305DC], 65
  0043059E      C705 D8055300>[color=#0000D0]mov[/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [5305D8], 72757A41
  004305A8      C3            [color=#0000D0]retn[/color]
  

  
  显然……在这里如果直接ret,下面的流程就不会执行,也不用考虑
  补丁代码的第一句是让Unreg消失,补丁的第二句是让程序显示注册给谁……^_^这里是Azure
  运行程序……虽然Unreg字符也没有了看关于也注册了……不过Nag还是存在……别忘了我们是准备干啥的……
  既然弹出NAG就要ShowWindow,以下是堆栈变化情况
  
  [color=#008000]第一次[/color]
  0012F5F4   00490D5F  /[color=#0000D0]CALL[/color] [color=#008000]到 ShowWindow 来自 PowerISO.00490D59[/color]
  0012F5F8   00490B3E  |hWnd = 00490B3E (class=[color=#808080]'#32770'[/color],parent=004B0B40)
  0012F5FC   00000001  \ShowState = SW_SHOWNORMAL
  0012F600   0049476F  [color=#008000]返回到 PowerISO.0049476F 来自 PowerISO.00490D4B[/color]
  
  [color=#008000]第二次[/color]
  0012F5F4   00490D5F  /[color=#0000D0]CALL[/color] [color=#008000]到 ShowWindow 来自 PowerISO.00490D59[/color]
  0012F5F8   00670896  |hWnd = 00670896 (class=[color=#808080]'#32770'[/color],parent=002A0B1A)
  0012F5FC   00000001  \ShowState = SW_SHOWNORMAL
  0012F600   0049476F  [color=#008000]返回到 PowerISO.0049476F 来自 PowerISO.00490D4B[/color]
  
  ....([color=#008000]中间省略)[/color]
  [color=#008000]第七次[/color]
  0012FEAC   00490D5F  /[color=#0000D0]CALL[/color] [color=#008000]到 ShowWindow 来自 PowerISO.00490D59[/color]
  0012FEB0   002A0B46  |hWnd = 002A0B46 ([color=#808080]'PowerISO(未注册版本) - New Im...'[/color],class=[color=#808080]'Afx:400000:0'[/color])
  0012FEB4   00000005  \ShowState = SW_SHOW
  0012FEB8   00478C3D  [color=#008000]返回到 PowerISO.00478C3D 来自 PowerISO.00490D4B[/color]
  
  [color=#008000]第八次[/color]
  0012F930   00490D5F  /[color=#0000D0]CALL[/color] [color=#008000]到 ShowWindow 来自 PowerISO.00490D59[/color]
  0012F934   00980A8E  |hWnd = 00980A8E ([color=#808080]'PowerISO'[/color],class=[color=#808080]'#32770'[/color],parent=00340B46)
  0012F938   00000001  \ShowState = SW_SHOWNORMAL
  0012F93C   00490585  [color=#008000]返回到 PowerISO.00490585 来自 PowerISO.00490D4B[/color]
  0012F940   00000001
  0012F944   00000000
  0012F948   0012F9AC
  0012F94C   0012F99C
  0012F950   00000004
  0012F954   00000001
  0012F958   00000000
  0012F95C   00000001
  0012F960   00340B46
  0012F964   0048D506  [color=#008000]返回到 PowerISO.0048D506 来自 PowerISO.0049050F[/color]
  0012F968   00000004
  0012F96C   00000001
  0012F970   01E25770
  0012F974   00432520  PowerISO.00432520
  0012F978   00432626  [color=#008000]返回到 PowerISO.00432626 来自 PowerISO.00430A10[/color]
  0012F97C   00000000
  0012F980   0012F9AC
  0012F984   005823D0  PowerISO.005823D0
  0012F988   00340B46
  0012F98C   0012F96C
  0012F990   0012FC60  [color=#008000]指向下一个 SEH 记录的指针[/color]
  0012F994   004ABE24  SE[color=#008000]处理程序[/color]
  0012F998   00000000
  0012F99C  /0012FCE0
  0012F9A0  |00432636  [color=#008000]返回到 PowerISO.00432636 来自 PowerISO.0048D425[/color]
  0012F9A4  |01E25770
  0012F9A8  |00000000
  0012F9AC  |004AF0E8  PowerISO.004AF0E8
  0012F9B0  |00000001
  0012F9B4  |00000000
  0012F9B8  |00000000
  0012F9BC  |00000000
  0012F9C0  |00000001
  0012F9C4  |00000000
  0012F9C8  |00980A8E
  0012F9CC  |00000000
  0012F9D0  |00000018
  0012F9D4  |75BF2735  user32.DefDlgProcA
  

  想必这个第八次就应该是NAG了……仔细观察堆栈,发现这一大段执行完后返回的地方应该是返回到 PowerISO.00432636 因为中间有个异常处理……相信这个异常处理只是针对这个NAG的……
  
  直接返回到这里
  
  00432636   . /EB 0E         [color=#0000D0]jmp[/color]     short 00432646
  

  观察其上方代码
  
  00432621   .  E8 EAE3FFFF   [color=#0000D0]call[/color]    00430A10
  00432626   .  83C4 28       [color=#0000D0]add[/color]     [color=#FF0000]esp[/color], 28
  00432629   .  85C0          [color=#0000D0]test[/color]    [color=#FF0000]eax[/color], [color=#FF0000]eax[/color]
  0043262B   .  75 0B         [color=#0000D0]jnz[/color]     short 00432638
  0043262D   .  8D4C24 08     [color=#0000D0]lea[/color]     [color=#FF0000]ecx[/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000]esp[/color]+8]
  00432631   .  E8 EFAD0500   [color=#0000D0]call[/color]    0048D425
  00432636   .  EB 0E         [color=#0000D0]jmp[/color]     short 00432646
  

  执行00430A10,应该是个BOOL类型的,然后看EAX,不是0就跳……没有NAG……
  显然那个call在计算注册码。这么容易让我们找到了……不进去看看可不是好孩子……
  说实话我已经晕倒了……
  啥乱其八糟的……都怪我学汇编没学好……看也看不懂……囧rz
  
  好吧好吧……直接补丁好了……
  
  1
  00430590     /E9 51C70700        [color=#0000D0]jmp[/color]     004ACCE6
  
  2
  00432629      40                 [color=#0000D0]inc[/color]     [color=#FF0000]eax[/color]
  
  3
  004ACCE6      C605 B4055300 01   [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305B4], 1
  004ACCED      C605 DC055300 65   [color=#0000D0]mov[/color]     [color=#b000b0]byte[/color] [color=#b000b0]ptr[/color] [5305DC], 65
  004ACCF4      C705 D8055300 417A>[color=#0000D0]mov[/color]     [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [5305D8], 72757A41
  004ACCFE      C3                 [color=#0000D0]retn[/color]
  

  
  当然04ACCE6处的补丁也可以直接写在00430590,反正下面的东西都不准备要了。
  拍屁股走人……
  
--------------------------------------------------------------------------------
【经验总结】
  看来学好汇编和数学真的很有必要……
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年02月05日

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看晕了  一会再来
2009-2-5 19:01
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,其实一直想问,发贴的这个模板哪里有?发现很多帖子都是这个格式
【文章标题】:
【文章作者】:
【作者邮箱】:
【作者主页】:
【作者QQ号】:
【下载地址】:
【作者声明】:
--------------------------------------------------------------------------------
2009-2-5 19:11
0
雪    币: 609
活跃值: (237)
能力值: ( LV12,RANK:441 )
在线值:
发帖
回帖
粉丝
4
CTC破文生成器……搜索论坛……
2009-2-5 19:33
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好的,谢谢。
2009-2-5 19:41
0
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
nag去掉了,但是文件限制没破解呀。
2009-2-5 19:58
0
游客
登录 | 注册 方可回帖
返回
//