【文章标题】: PowerISO V4.3
【文章作者】: yangjt
【作者邮箱】: yangjietao123@163.com
【作者主页】: http://blog.sina.com.cn/yangjt
【作者QQ号】: 325002492
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
打开软件……发现蹦出一个nag,于是乎就想去掉它……
OD装载……很显然……没有壳……然后找字符串……结果发现都是英文的……突然想到这是个多国语言版,于是乎找unreg这个字符,找到这个地方 00432298 . 68 08314D00 push 004D3108 ; unregistered copy
然后IDA打开分析之~~
发现sub_432240这段函数里有很有意思的东西~~ CString__operator_("PowerISO");
if ( !(_BYTE)dword_5305B4 )
{
sub_48CDDF("(");
v5 = sub_46F0F0(39, "Unregistered copy");
sub_48CDDF((LPCSTR)v5);
sub_48CDDF(L")");
}
很显然……有没有注册就是判断5305B4这个位置的值是不是0……
根据程序的意思,如果是0那就没有注册,反之就是注册……这下就简单了……我们先把它改成1试试看……
事实证明,改成1以后那个程序标题上的未注册版就没有了……但是NAG还是存在……于是乎继续找字符串……
找到下一个字符串unreg的地点 00451201 |. 68 08314D00 push 004D3108 ; unregistered copy
这里……IDA里F5 if ( (_BYTE)dword_5305B4 )
{
if ( strlen(byte_5305D8) - 1 <= 0x14 )
{
v19 = sub_46F0F0(38, "Registered to: ");
CString__operator_((LPCSTR)v19);
a2 = off_4DB5D4;
CString__operator_(byte_5305D8);
LOBYTE(v23) = 5;
CString__operator__(&a2);
LOBYTE(v23) = 1;
sub_48CA90();
Rect.left = 0;
Rect.right = v4;
v20 = *(_DWORD *)v3;
Rect.top = v26 + 10;
Rect.bottom = v5 + v26 + 10;
(*(int (__thiscall **)(void *, void *, _DWORD, struct tagRECT *, signed int))(v20 + 104))(
v3,
v22,
*((_DWORD *)v22 - 2),
&Rect,
1);
}
看来不仅要判断5305B4这个位置,还要判断5305D8这个位置……据分析……这个位置应该就是用来储存注册用户名的,既然要储存,当然要写入……那就在这里下硬件写入断点,会断在两个地方…… Place 1
004305C3 |. 881D D8055300 mov byte ptr [5305D8], bl ; |
004305C9 |. 881D 90055300 mov byte ptr [530590], bl ; |
004305CF |. FF15 10D04A00 call dword ptr [<&ADVAPI32.RegCreateK>; \RegCreateKeyExA
Place 2
00430483 |. 881D D8055300 mov byte ptr [5305D8], bl ; |
00430489 |. 881D 90055300 mov byte ptr [530590], bl ; |
0043048F |. FF15 10D04A00 call dword ptr [<&ADVAPI32.RegCreateK>; \RegCreateKeyExA
很显然……程序从注册表里读完了数据就开始往内存里写,据分析……place 2 是从place 1后面的某个Call 过来的,所以我们只改第一个Call就好了……
找到第一个procedure的起始地址,然后开始补丁 00430590 C605 B4055300>mov byte ptr [5305B4], 1
00430597 C605 DC055300>mov byte ptr [5305DC], 65
0043059E C705 D8055300>mov dword ptr [5305D8], 72757A41
004305A8 C3 retn
显然……在这里如果直接ret,下面的流程就不会执行,也不用考虑
补丁代码的第一句是让Unreg消失,补丁的第二句是让程序显示注册给谁……^_^这里是Azure
运行程序……虽然Unreg字符也没有了看关于也注册了……不过Nag还是存在……别忘了我们是准备干啥的……
既然弹出NAG就要ShowWindow,以下是堆栈变化情况 第一次
0012F5F4 00490D5F /CALL 到 ShowWindow 来自 PowerISO.00490D59
0012F5F8 00490B3E |hWnd = 00490B3E (class='#32770',parent=004B0B40)
0012F5FC 00000001 \ShowState = SW_SHOWNORMAL
0012F600 0049476F 返回到 PowerISO.0049476F 来自 PowerISO.00490D4B
第二次
0012F5F4 00490D5F /CALL 到 ShowWindow 来自 PowerISO.00490D59
0012F5F8 00670896 |hWnd = 00670896 (class='#32770',parent=002A0B1A)
0012F5FC 00000001 \ShowState = SW_SHOWNORMAL
0012F600 0049476F 返回到 PowerISO.0049476F 来自 PowerISO.00490D4B
....(中间省略)
第七次
0012FEAC 00490D5F /CALL 到 ShowWindow 来自 PowerISO.00490D59
0012FEB0 002A0B46 |hWnd = 002A0B46 ('PowerISO(未注册版本) - New Im...',class='Afx:400000:0')
0012FEB4 00000005 \ShowState = SW_SHOW
0012FEB8 00478C3D 返回到 PowerISO.00478C3D 来自 PowerISO.00490D4B
第八次
0012F930 00490D5F /CALL 到 ShowWindow 来自 PowerISO.00490D59
0012F934 00980A8E |hWnd = 00980A8E ('PowerISO',class='#32770',parent=00340B46)
0012F938 00000001 \ShowState = SW_SHOWNORMAL
0012F93C 00490585 返回到 PowerISO.00490585 来自 PowerISO.00490D4B
0012F940 00000001
0012F944 00000000
0012F948 0012F9AC
0012F94C 0012F99C
0012F950 00000004
0012F954 00000001
0012F958 00000000
0012F95C 00000001
0012F960 00340B46
0012F964 0048D506 返回到 PowerISO.0048D506 来自 PowerISO.0049050F
0012F968 00000004
0012F96C 00000001
0012F970 01E25770
0012F974 00432520 PowerISO.00432520
0012F978 00432626 返回到 PowerISO.00432626 来自 PowerISO.00430A10
0012F97C 00000000
0012F980 0012F9AC
0012F984 005823D0 PowerISO.005823D0
0012F988 00340B46
0012F98C 0012F96C
0012F990 0012FC60 指向下一个 SEH 记录的指针
0012F994 004ABE24 SE处理程序
0012F998 00000000
0012F99C /0012FCE0
0012F9A0 |00432636 返回到 PowerISO.00432636 来自 PowerISO.0048D425
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 jmp short 00432646
观察其上方代码 00432621 . E8 EAE3FFFF call 00430A10
00432626 . 83C4 28 add esp, 28
00432629 . 85C0 test eax, eax
0043262B . 75 0B jnz short 00432638
0043262D . 8D4C24 08 lea ecx, dword ptr [esp+8]
00432631 . E8 EFAD0500 call 0048D425
00432636 . EB 0E jmp short 00432646
执行00430A10,应该是个BOOL类型的,然后看EAX,不是0就跳……没有NAG……
显然那个call在计算注册码。这么容易让我们找到了……不进去看看可不是好孩子……
说实话我已经晕倒了……
啥乱其八糟的……都怪我学汇编没学好……看也看不懂……囧rz
好吧好吧……直接补丁好了…… 1
00430590 /E9 51C70700 jmp 004ACCE6
2
00432629 40 inc eax
3
004ACCE6 C605 B4055300 01 mov byte ptr [5305B4], 1
004ACCED C605 DC055300 65 mov byte ptr [5305DC], 65
004ACCF4 C705 D8055300 417A>mov dword ptr [5305D8], 72757A41
004ACCFE C3 retn
当然04ACCE6处的补丁也可以直接写在00430590,反正下面的东西都不准备要了。
拍屁股走人……
--------------------------------------------------------------------------------
【经验总结】
看来学好汇编和数学真的很有必要……
效果请见http://www.52pojie.cn/thread-18559-1-1.html
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2009年02月05日
[ 本帖最后由 yangjt 于 2009-2-5 16:06 编辑 ] |