57907103 发表于 2018-12-28 00:19

APIhook补丁让被VM的程序自动写出注册码

这个软件是前不久在其他地方看到一个求助帖,看了下此软件,找到关键点不难,
主要的是软件加壳了,会影响正常断点分析,会检测内存注册机。

今天就主要说下怎么不脱壳,通过APIhook补丁使软件自动生成注册码实现永久注册。

未注册和注册后的界面如下:


第1步:查壳
PEID查壳显示:       yoda's Protector v1.02 (.dll,.ocx) -> Ashkbiz Danehkar (h) *
ExeinfoPe查壳显示:VMProtect v.2.07 - X.X2003-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处:(爆破,需要每次使用补丁才能正常使用)
逆向前:

00460AEA    8B85 FCFDFFFF   mov eax,dword ptr ss:         ; ebp-4    ;\\假码给EAX


逆向后:

00460AEA    8B45 FC         mov eax,dword ptr ss:         ; ebp-4          ;\\将真码给EAX,后面的比较就成了真码与真码比较,肯定能通过了。
00460AED    90            nop
00460AEE    90            nop
00460AEF    90            nop
===================================================================================================

===================================================================================================
第2处:(需要在第1处逆向的前提下操作此处逆向,将软件产生的真码通过改动软件代码,让软件自己将真码写出到注册文件中,实现永久逆向,真码在c:\writecard\tmp.o中。)
逆向前:

00402E33    56            push esi                                                    ; \\假码位数
00402E34    8B43 14         mov eax,dword ptr ds:          ; \\假码
00402E37    50            push eax


逆向后:

00402E33    6A 2C         push 0x2C                                              ;\\固定显示注册码位数为44为
00402E35    FF73 E0         push dword ptr ds:               ;\\将真码地址作为参数给写出函数


=====================================================================================

APIhook补丁怎么打呢,可以使用XH补丁制作工具 V1.3.6,首先填入OD中修改后的数据
如图


然后勾选InLine hook,在模块后填入kernel32.dll,在函数后填入对应的API函数名CreateFileW
如图:

生成补丁后运行补丁即可成功打开软件



=============================================
贴出分析的代码


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:
00460B23    E8 0C25FAFF   call T6万能写.00403034
00460B28    8D85 20FEFFFF   lea eax,dword ptr ss:
00460B2E    E8 9D22FAFF   call T6万能写.00402DD0
00460B33    E8 CC20FAFF   call T6万能写.00402C04
00460B38    8D95 F8FDFFFF   lea edx,dword ptr ss:
00460B3E    8B87 04030000   mov eax,dword ptr ds:
00460B44    E8 736FFDFF   call T6万能写.00437ABC
00460B49    8B95 F8FDFFFF   mov edx,dword ptr ss:
00460B4F    8D85 20FEFFFF   lea eax,dword ptr ss:
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:
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:
00460B8B    E8 50EFFEFF   call T6万能写.0044FAE0
00460B90    8B15 7CDA4800   mov edx,dword ptr ds:          ; T6万能写.0048EE30
00460B96    8902            mov dword ptr ds:,eax
00460B98    A1 7CDA4800   mov eax,dword ptr ds:
00460B9D    8B00            mov eax,dword ptr ds:
00460B9F    E8 C432FFFF   call T6万能写.00453E68
00460BA4    A1 28EE4800   mov eax,dword ptr ds:
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:
00460BBF    8B00            mov eax,dword ptr ds:
00460BC1    E8 EE68FFFF   call T6万能写.004574B4
00460BC6    33C0            xor eax,eax



mxx852 发表于 2018-12-28 21:31

学习楼主的教程,支持楼主

猪哥亮 发表于 2018-12-30 09:08

水平有限,实在没看懂。。。。。。

零下10℃ 发表于 2018-12-31 07:49

有软件给我看看么?

零下10℃ 发表于 2018-12-31 07:52

不得不说度娘还是有点东西的溜了

Shy 发表于 2018-12-31 13:11

恕我直言,这个好像不是VM,好像是因为断点的问题把前面两个字节改成了00,导致汇编代码的改变,你取消断点就能恢复正常,虽然我不敢确定到底是断点还是OD或者是软件的原因,但这个我敢肯定不是VM,请大佬们指教

57907103 发表于 2018-12-31 22:34

软件https://pan.baidu.com/s/1wQo30PgOkCf66DpC99tIGg

747076693 发表于 2019-1-1 19:04

学习了,感谢楼主

雪花公子 发表于 2019-4-20 09:27


学习楼主的教程

a353698400 发表于 2019-4-22 04:29

学习了谢谢
页: [1] 2 3 4
查看完整版本: APIhook补丁让被VM的程序自动写出注册码