好友
阅读权限25
听众
最后登录1970-1-1
|
这是在吾爱打算发关于破解的第二个帖子········ 第一个帖子在排版上腹死胎中····(排版了大半天就要完了,然后小手一抖关了发帖网页,心态炸了就此作罢了,第一个帖子卒!)
个人感觉吾爱的发帖排版对我特别不友好···也可能我排版菜····
废话不多说,先上程序!
程序界面很简单,只有一个OK键,机制是验证你输入的 Key ,我们点下OK后
弹窗的大概意思就是输入的key 输入错误了,等云云,我们再查下壳
无壳表示一切都很爽!! 接下来可以OD上手了
在OD中找到程序的你想要的关键事件中无疑是很重要的,有时候这个步骤也是很艰难,很让人头疼的,有很多办法找到关键事件的地址。
但我个人在学习的一步一步中来说,相对来说我比较喜欢直接用反编译软件下手直接找到事件的地址,办法很多,随个人喜好。
我用的是VBExplorer
在VBExplorer找到了按钮事件 ,也找到了OK按钮事件的地址 00401E20
OD中 直接照这个地址跳转过去断下断点 然后OD运行程序 ----》 程序主窗口跳出 -----》随便输入一串字符点下OK -------》OD停下在断点处
这证明我们刚刚断下的断点是没错的,我也就不一一上图了。接下来就轮到来好好分析一下这个事件了。
第一次接触vb程序,才发现它的效率之低······ 好多对你没什么帮助的鬼代码,一开始我是一个一个call分析的,泥垢········日个香蕉吧啦···怎么这都多少个call啦!!! 一点有用的信息都没有,虽然说破解要的就是耐心····· 我还是选择看看强大的OD在这个事件里分析出来的函数,度娘vb函数库搜索一下如:vbaLenVar , rtcMidCharVar,_vbaVarTstEq
[Asm] 纯文本查看 复制代码 00401E20 > \55 push ebp
00401E21 . 8BEC mov ebp,esp
00401E23 . 83EC 0C sub esp,0xC
00401E26 . 68 16104000 push <jmp.&MSVBVM50.__vbaExceptHandler> ; SE 处理程序安装
00401E2B . 64:A1 0000000>mov eax,dword ptr fs:[0]
00401E31 . 50 push eax
00401E32 . 64:8925 00000>mov dword ptr fs:[0],esp
00401E39 . 81EC 10010000 sub esp,0x110
00401E3F . 53 push ebx
00401E40 . 56 push esi
00401E41 . 57 push edi
00401E42 . 8B7D 08 mov edi,dword ptr ss:[ebp+0x8] ; Andréna.<模块入口点>
00401E45 . 8BC7 mov eax,edi
00401E47 . 83E7 FE and edi,-0x2
00401E4A . 8965 F4 mov dword ptr ss:[ebp-0xC],esp
00401E4D . 83E0 01 and eax,0x1
00401E50 . 8B1F mov ebx,dword ptr ds:[edi]
00401E52 . C745 F8 00104>mov dword ptr ss:[ebp-0x8],Andréna.00401>
00401E59 . 57 push edi
00401E5A . 8945 FC mov dword ptr ss:[ebp-0x4],eax
00401E5D . 897D 08 mov dword ptr ss:[ebp+0x8],edi
00401E60 . FF53 04 call dword ptr ds:[ebx+0x4]
00401E63 . 33F6 xor esi,esi
00401E65 . 57 push edi
00401E66 . 8975 DC mov dword ptr ss:[ebp-0x24],esi
00401E69 . 8975 CC mov dword ptr ss:[ebp-0x34],esi
00401E6C . 8975 BC mov dword ptr ss:[ebp-0x44],esi
00401E6F . 8975 AC mov dword ptr ss:[ebp-0x54],esi
00401E72 . 8975 A8 mov dword ptr ss:[ebp-0x58],esi
00401E75 . 8975 A4 mov dword ptr ss:[ebp-0x5C],esi
00401E78 . 8975 94 mov dword ptr ss:[ebp-0x6C],esi
00401E7B . 8975 84 mov dword ptr ss:[ebp-0x7C],esi
00401E7E . 89B5 74FFFFFF mov dword ptr ss:[ebp-0x8C],esi
00401E84 . 89B5 64FFFFFF mov dword ptr ss:[ebp-0x9C],esi
00401E8A . 89B5 54FFFFFF mov dword ptr ss:[ebp-0xAC],esi
00401E90 . 89B5 44FFFFFF mov dword ptr ss:[ebp-0xBC],esi
00401E96 . 89B5 14FFFFFF mov dword ptr ss:[ebp-0xEC],esi
00401E9C . 89B5 FCFEFFFF mov dword ptr ss:[ebp-0x104],esi
00401EA2 . 89B5 ECFEFFFF mov dword ptr ss:[ebp-0x114],esi
00401EA8 . FF93 00030000 call dword ptr ds:[ebx+0x300]
00401EAE . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
00401EB1 . 50 push eax
00401EB2 . 51 push ecx
00401EB3 . FF15 20414000 call dword ptr ds:[<&MSVBVM50.__vbaObjSe>; msvbvm50.__vbaObjSet
00401EB9 . 8BF8 mov edi,eax
00401EBB . 8D45 A8 lea eax,dword ptr ss:[ebp-0x58]
00401EBE . 50 push eax
00401EBF . 57 push edi
00401EC0 . 8B17 mov edx,dword ptr ds:[edi]
00401EC2 . FF92 A0000000 call dword ptr ds:[edx+0xA0]
00401EC8 . 3BC6 cmp eax,esi
00401ECA . 7D 12 jge short Andréna.00401EDE
00401ECC . 68 A0000000 push 0xA0
00401ED1 . 68 781A4000 push Andréna.00401A78
00401ED6 . 57 push edi
00401ED7 . 50 push eax
00401ED8 . FF15 10414000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>; msvbvm50.__vbaHresultCheckObj
00401EDE > 8B45 A8 mov eax,dword ptr ss:[ebp-0x58]
00401EE1 . 8975 A8 mov dword ptr ss:[ebp-0x58],esi
00401EE4 . 8B35 F8404000 mov esi,dword ptr ds:[<&MSVBVM50.__vbaVa>; msvbvm50.__vbaVarMove
00401EEA . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
00401EED . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44]
00401EF0 . 8945 9C mov dword ptr ss:[ebp-0x64],eax
00401EF3 . C745 94 08000>mov dword ptr ss:[ebp-0x6C],0x8
00401EFA . FFD6 call esi ; <&MSVBVM50.__vbaVarMove>
00401EFC . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
00401EFF . FF15 AC414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>; msvbvm50.__vbaFreeObj
00401F05 . B9 02000000 mov ecx,0x2
00401F0A . B8 01000000 mov eax,0x1
00401F0F . 898D 54FFFFFF mov dword ptr ss:[ebp-0xAC],ecx
00401F15 . 898D 44FFFFFF mov dword ptr ss:[ebp-0xBC],ecx
00401F1B . 8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]
00401F21 . 8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
00401F27 . 8985 4CFFFFFF mov dword ptr ss:[ebp-0xB4],eax
00401F2D . 8D55 BC lea edx,dword ptr ss:[ebp-0x44]
00401F30 . 51 push ecx ; /Step8 = 0012FFB0
00401F31 . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C] ; |
00401F34 . 52 push edx ; |/var18 = ntdll.KiFastSystemCallRet
00401F35 . 50 push eax ; ||retBuffer8 = NULL
00401F36 . FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaLenVa>; |\_vbaLenVar 计算字符长度以及加上空格长度
00401F3C . 8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC] ; |
00401F42 . 50 push eax ; |End8 = NULL
00401F43 . 8D95 ECFEFFFF lea edx,dword ptr ss:[ebp-0x114] ; |
00401F49 . 51 push ecx ; |Start8 = 0012FFB0
00401F4A . 8D85 FCFEFFFF lea eax,dword ptr ss:[ebp-0x104] ; |
00401F50 . 52 push edx ; |TMPend8 = ntdll.KiFastSystemCallRet
00401F51 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24] ; |
00401F54 . 50 push eax ; |TMPstep8 = NULL
00401F55 . 51 push ecx ; |Counter8 = 0012FFB0
00401F56 . FF15 1C414000 call dword ptr ds:[<&MSVBVM50.__vbaVarFo>; \ vbaVarForInit 重复执行初始化
00401F5C . 8B1D 68414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVa>; msvbvm50.__vbaVarCat
00401F62 . 8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaFr>; msvbvm50.__vbaFreeVarList
00401F68 > 85C0 test eax,eax
00401F6A . 0F84 BB000000 je Andréna.0040202B ; 要进行验证就要跳转
00401F70 . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
00401F73 . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
00401F76 . 52 push edx ; ntdll.KiFastSystemCallRet
00401F77 . 50 push eax
00401F78 . C745 9C 01000>mov dword ptr ss:[ebp-0x64],0x1
00401F7F . C745 94 02000>mov dword ptr ss:[ebp-0x6C],0x2
00401F86 . FF15 90414000 call dword ptr ds:[<&MSVBVM50.__vbaI4Var>; msvbvm50.__vbaI4Var
00401F8C . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44] ; |
00401F8F . 50 push eax ; |Start = 0x0
00401F90 . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C] ; |
00401F93 . 51 push ecx ; |dString8 = 0012FFB0
00401F94 . 52 push edx ; |RetBUFFER = ntdll.KiFastSystemCallRet
00401F95 . FF15 34414000 call dword ptr ds:[<&MSVBVM50.#632_rtcMi>; \rtcMidCharVar 截取字符串
00401F9B . 8D45 84 lea eax,dword ptr ss:[ebp-0x7C]
00401F9E . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58]
00401FA1 . 50 push eax ; /String8 = NULL
00401FA2 . 51 push ecx ; |ARG2 = 0012FFB0
00401FA3 FF15 64414000 call dword ptr ds:[<&MSVBVM50.__vbaStrVa>; __vbastrvarval 从字符串特点位置上获取其值
00401FA9 . 50 push eax ; /String = NULL
00401FAA . FF15 08414000 call dword ptr ds:[<&MSVBVM50.#516_rtcAn>; \rtcAnsiValueBstr 传回字符码(返回第一个字符的字符代码)
00401FB0 . 66:05 0A00 add ax,0xA ; 依次截取的字符 16进制 +A 转换新的字符
00401FB4 . 0F80 B0020000 jo Andréna.0040226A
00401FBA . 0FBFD0 movsx edx,ax
00401FBD . 52 push edx ; ntdll.KiFastSystemCallRet
00401FBE . FF15 70414000 call dword ptr ds:[<&MSVBVM50.#537_rtcBs>; msvbvm50.rtcBstrFromAnsi
00401FC4 . 8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax
00401FCA . 8D45 CC lea eax,dword ptr ss:[ebp-0x34]
00401FCD . 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
00401FD3 . 50 push eax
00401FD4 . 8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]
00401FDA . 51 push ecx
00401FDB . 52 push edx ; ntdll.KiFastSystemCallRet
00401FDC . C785 74FFFFFF>mov dword ptr ss:[ebp-0x8C],0x8
00401FE6 . FFD3 call ebx
00401FE8 . 8BD0 mov edx,eax
00401FEA . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34]
00401FED . FFD6 call esi
00401FEF . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58] ; 连接计算后的字符
00401FF2 . FF15 B0414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>; msvbvm50.__vbaFreeStr
00401FF8 . 8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]
00401FFE . 8D4D 84 lea ecx,dword ptr ss:[ebp-0x7C]
00402001 . 50 push eax
00402002 . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
00402005 . 51 push ecx
00402006 . 52 push edx ; ntdll.KiFastSystemCallRet
00402007 . 6A 03 push 0x3
00402009 . FFD7 call edi
0040200B . 83C4 10 add esp,0x10
0040200E . 8D85 ECFEFFFF lea eax,dword ptr ss:[ebp-0x114]
00402014 . 8D8D FCFEFFFF lea ecx,dword ptr ss:[ebp-0x104]
0040201A . 8D55 DC lea edx,dword ptr ss:[ebp-0x24]
0040201D . 50 push eax ; /TMPend8 = NULL
0040201E . 51 push ecx ; |TMPstep8 = 0012FFB0
0040201F . 52 push edx ; |Counter8 = ntdll.KiFastSystemCallRet
00402020 . FF15 A4414000 call dword ptr ds:[<&MSVBVM50.__vbaVarFo>; \ __vbavarfornext 是VB程序里的循环结构
00402026 .^ E9 3DFFFFFF jmp Andréna.00401F68
0040202B > 8D45 CC lea eax,dword ptr ss:[ebp-0x34]
0040202E . 8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]
00402034 . 50 push eax ; /var18 = NULL
00402035 . 51 push ecx ; |var28 = 0012FFB0
00402036 . C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],Andréna.0040>; |UNICODE "kXy^rO|*yXo*m\kMuOn*+"
00402040 . C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8008 ; |
0040204A . FF15 40414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTs>; \_vbaVarTstEq // 比较变量是否相等
00402050 . 66:85C0 test ax,ax
00402053 . 0F84 C0000000 je Andréna.00402119 ; 关键跳转
事实证明我的做法十分正确! 再次吐槽没什么鬼用的call 和代码真的多, 将所有OD识别过来的函数作用全部注释后瞬间对这个事件的大概作用明白了
再次深人了解前,我们先暴力将关键跳转修改再次验证此事件是否关键事件
嗯呢,可以继续深入了解了,
接下来是关键:
事件将输入的字符进行循环,循环的过程中,依次将输入的字符进行 + 0xA 操作,然后组成新的字符和 UNICODE "kXy^rO|*yXo*m\kMuOn*+"
字符进行匹配,匹配成功进行跳转。
总体来说这个程序进行的操作相对简单,比起我第一个帖子那个让OK键消失的程序友好,小动作少多了
接下来就是注册机:
[C] 纯文本查看 复制代码 #include<stdio.h>
#include<string.h>
#include<iostream>
int main()
{
char encrypt[100] = "kXy^rO|*yXo*m\\kMuOn*+";
char key[100] = {0};
int len = strlen(encrypt);
printf("encrypt is len : %d\n",len);
for(int i=0;i<len;i++)
{
key[i]= encrypt[i] - 0xA;
}
printf("key is :%s \n",key);
system("pause");
return 0;
}
key : aNoThEr oNe cRaCkEd !
帖子最后在写几个能找到关键事件的办法 :
vb窗口断点:
OD中鼠标右键查找二进制字符串 :搜索 “816C24”,或者ctrl +b
OD跳转过去后当前代码下会有个JMP跳转 F4运行到当前JMP,然后F8就可以跳到关键事件(通常来说有几个JMP就会有几个程序窗口,此方法也是学习来的,具体是怎么原理也是不太明白,不过实测有效)
查看调用堆栈:
OD直接运行程序,到错误窗口弹出后,暂停下程序,工具栏 ---》查看 -----》调用堆栈(或者ALt+ k)
找到最后一行,右键-----》显示函数调用
显示函数调用后向上看,就会发现代码很熟悉,其实这就是验证失败后失败窗口弹出的CALL
Andrénalin.3.rar
(3.8 KB, 下载次数: 14)
(此程序····)
(菜鸟发帖有错误的地方请大佬指出,欢迎一起学习~~) 小蜗牛呀,一步一步往上爬~~~ |
免费评分
-
查看全部评分
|