【文章标题】: 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直播授课