这个软件是前不久在其他地方看到一个求助帖,看了下此软件,找到关键点不难,
主要的是软件加壳了,会影响正常断点分析,会检测内存注册机。
今天就主要说下怎么不脱壳,通过APIhook补丁使软件自动生成注册码实现永久注册。
未注册和注册后的界面如下:
第1步:查壳
PEID查壳显示: yoda's Protector v1.02 (.dll,.ocx) -> Ashkbiz Danehkar (h) *
ExeinfoPe查壳显示:VMProtect v.2.07 - X.X 2003-2012 VMProtect Software - www.vmpsoft.com
搞不定这壳,只能带壳调试,
第2步:找关键点
字符串参考、F12暂停、按钮事件任选一种方法即可,
打开软件,输入假码会提示“验证码不正确,注意大小写!”
OK,先载入OD,字符串查找错误信息“验证码不正确,注意大小写!”,很容易找到关键代码段,找到关键call和关键跳如下,
00460AF3 E8 987EFAFF call T6万能写.00408990 ; \\关键call,返回1就需要注册,返回0就注册版,EDX为真码,这里可用内存注册机,但程序会检测注册机!!!
00460AF8 85C0 test eax,eax
00460AFA 0F85 B0000000 jnz T6万能写.00460BB0 ; \\关键跳,不跳就成功,并将注册码写到C盘下c:\writecard\tmp.o,nop即爆破,但不脱壳时此处
不修改一切代码正常,一下段或者修改代码,他这段代码自动就改变了,如下图:必须要在程序完全解码后激活断点或者修改才行。
下断前运行效果
怎么判断程序完全解码呢,测试可用API断点CreateFileW,当程序运行到这个断点时,程序就已经完全解码了,这时就可以激活断点进行分析或者打补丁 。
对软件代码进行了分析,如果只改关键跳,它会把我们输入的假码写到C盘下c:\writecard\tmp.o,下次重新启动时会再次读取这个文件进行检测,每次打开软件都必须使用补丁进行逆向,这不方便,我们可以通过改动赋值语句让程序将正确的代码自动写出到注册文件,下次打开时即为正版了,以后就不在需要使用补丁。该法如下:
===================================================================================================
第1处:(爆破,需要每次使用补丁才能正常使用)
逆向前:
[Asm] 纯文本查看 复制代码
00460AEA 8B85 FCFDFFFF mov eax,dword ptr ss:[ebp-0x204] ; ebp-4 ;\\假码给EAX
逆向后:
[Asm] 纯文本查看 复制代码
00460AEA 8B45 FC mov eax,dword ptr ss:[ebp-0x4] ; ebp-4 ;\\将真码给EAX,后面的比较就成了真码与真码比较,肯定能通过了。
00460AED 90 nop
00460AEE 90 nop
00460AEF 90 nop
===================================================================================================
===================================================================================================
第2处:(需要在第1处逆向的前提下操作此处逆向,将软件产生的真码通过改动软件代码,让软件自己将真码写出到注册文件中,实现永久逆向,真码在c:\writecard\tmp.o中。)
逆向前:
[Asm] 纯文本查看 复制代码
00402E33 56 push esi ; \\假码位数
00402E34 8B43 14 mov eax,dword ptr ds:[ebx+0x14] ; \\假码
00402E37 50 push eax
逆向后:
[Asm] 纯文本查看 复制代码
00402E33 6A 2C push 0x2C ;\\固定显示注册码位数为44为
00402E35 FF73 E0 push dword ptr ds:[ebx-0x20] ;\\将真码地址作为参数给写出函数
=====================================================================================
APIhook补丁怎么打呢,可以使用XH补丁制作工具 V1.3.6,首先填入OD中修改后的数据
如图
然后勾选InLine hook,在模块后填入kernel32.dll,在函数后填入对应的API函数名CreateFileW
如图:
生成补丁后运行补丁即可成功打开软件
=============================================
贴出分析的代码
[Asm] 纯文本查看 复制代码
00460AF3 E8 987EFAFF call T6万能写.00408990 ; \\关键call,返回1就需要注册,返回0就注册版,这里可用内存断点,EDX为真码,但程序会检测注册机!!!
00460AF8 85C0 test eax,eax
00460AFA 0F85 B0000000 jnz T6万能写.00460BB0 ; \\关键跳,不跳就成功,并将注册码写到C盘下c:\writecard\tmp.o,nop即爆破,但此处会被Vm,不知道怎么改?
00460B00 B8 540C4600 mov eax,T6万能写.00460C54 ; ASCII "c:\writecard"
00460B05 E8 8A86FAFF call T6万能写.00409194
00460B0A 84C0 test al,al
00460B0C 75 0A jnz short T6万能写.00460B18
00460B0E B8 540C4600 mov eax,T6万能写.00460C54 ; ASCII "c:\writecard"
00460B13 E8 6488FAFF call T6万能写.0040937C
00460B18 BA 6C0C4600 mov edx,T6万能写.00460C6C ; ASCII "c:\writecard\tmp.o"
00460B1D 8D85 20FEFFFF lea eax,dword ptr ss:[ebp-0x1E0]
00460B23 E8 0C25FAFF call T6万能写.00403034
00460B28 8D85 20FEFFFF lea eax,dword ptr ss:[ebp-0x1E0]
00460B2E E8 9D22FAFF call T6万能写.00402DD0
00460B33 E8 CC20FAFF call T6万能写.00402C04
00460B38 8D95 F8FDFFFF lea edx,dword ptr ss:[ebp-0x208]
00460B3E 8B87 04030000 mov eax,dword ptr ds:[edi+0x304]
00460B44 E8 736FFDFF call T6万能写.00437ABC
00460B49 8B95 F8FDFFFF mov edx,dword ptr ss:[ebp-0x208]
00460B4F 8D85 20FEFFFF lea eax,dword ptr ss:[ebp-0x1E0]
00460B55 E8 9244FAFF call T6万能写.00404FEC
00460B5A E8 DD2AFAFF call T6万能写.0040363C
00460B5F E8 A020FAFF call T6万能写.00402C04
00460B64 8D85 20FEFFFF lea eax,dword ptr ss:[ebp-0x1E0]
00460B6A E8 8D25FAFF call T6万能写.004030FC ;\\写出注册码的call,进去后改参数即可实现程序自己将真码写出
00460B6F E8 9020FAFF call T6万能写.00402C04
00460B74 B8 880C4600 mov eax,T6万能写.00460C88 ; ASCII "Form1"
00460B79 E8 923EFBFF call T6万能写.00414A10
00460B7E 85C0 test eax,eax
00460B80 75 16 jnz short T6万能写.00460B98
00460B82 8BCF mov ecx,edi
00460B84 B2 01 mov dl,0x1
00460B86 A1 EC0C4600 mov eax,dword ptr ds:[0x460CEC]
00460B8B E8 50EFFEFF call T6万能写.0044FAE0
00460B90 8B15 7CDA4800 mov edx,dword ptr ds:[0x48DA7C] ; T6万能写.0048EE30
00460B96 8902 mov dword ptr ds:[edx],eax
00460B98 A1 7CDA4800 mov eax,dword ptr ds:[0x48DA7C]
00460B9D 8B00 mov eax,dword ptr ds:[eax]
00460B9F E8 C432FFFF call T6万能写.00453E68
00460BA4 A1 28EE4800 mov eax,dword ptr ds:[0x48EE28]
00460BA9 E8 B232FFFF call T6万能写.00453E60
00460BAE EB 16 jmp short T6万能写.00460BC6
00460BB0 B8 980C4600 mov eax,T6万能写.00460C98 ; ASCII "验证码不正确,注意大小写!"
00460BB5 E8 9A06FDFF call T6万能写.00431254
00460BBA A1 44D94800 mov eax,dword ptr ds:[0x48D944]
00460BBF 8B00 mov eax,dword ptr ds:[eax]
00460BC1 E8 EE68FFFF call T6万能写.004574B4
00460BC6 33C0 xor eax,eax
|