【文章标题】: 定式详解 V2.0[围棋]去功能限制及爆破注册——菜鸟教学【2】
【作 者】: laoqian[FCG]
【邮 箱】: -
【主 页】: www.fcgchina.com
【QQ 号】: -
【软件名称】: 定式详解 V2.0 [繁体版]
【下载地址】: http://www.lshuzhi.com,但是作者已经不提供此版本下载,有需要的告诉我!
【加壳方式】: 无
【编写语言】: delphi
【工 具】: OllyDbg1.10 fly, W32DSM
【操作平台】: windows系列
【软件介绍】: 定式详解包含了几乎所有常用定式,带有详细的解说。有了它,查询定式、学习定式将不再是麻烦事。你只要走一手,计算机就会告诉你下一步所有可能的应法,包括不正确的应法(解说中告诉你不正确的原因)。你也可以随时进入研究模式自己再琢磨新的走法,研究时进退自如,免除在传统棋盘上反复移挪棋子之苦。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
狗年就不打狗了,我们再来一个简单的爆破教学吧!
本文只适合初学者,高手略过!
前两天下了几次围棋,老是输,主要是定式都不会了,开局就落后!搞的人比较烦,我遂在网上找定式的软件,但都是一些试用功能不全的,比如http://www.lshuzhi.com/joseki.htm上的定式详解 V3.0,使用起来倒是很方便,只是代码不全,无法看到所有定式!
忽然想起在好4、5年前 ,有人给过我他的繁体英文版,要我破解,据说里面是全的,当时我初入破解,没有搞定,就放下了,没想到一搜硬盘,居然还找到了,那就干他,都是5年前的东西了,lshuzhi不会找我的茬吧?!
版本是 定式详解 V2.0,其实比3.0差不了许多,围棋定式几百年也变化不了多少,呵呵!
但他有限制,主要是下面几个:
1.必须在繁体中文或者英文操作系统下使用![显示繁体乱码,别扭吧!]
2.不注册,无法使用全部,但代码是全的!
由于分析得知,有代码的,。那我们就来爆破他实现,工作很简单,我只是说一下如何入手。其实对于新手破解时最困难的是如何入手,
如何快速的分析,如何最恰当的下断点!
代码:
:00484916 8BC0 mov eax, eax
:00484918 55 push ebp
:00484919 8BEC mov ebp, esp
:0048491B B91C000000 mov ecx, 0000001C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484925(C)
|
:00484920 6A00 push 00000000
:00484922 6A00 push 00000000
:00484924 49 dec ecx
:00484925 75F9 jne 00484920
:00484927 51 push ecx
:00484928 53 push ebx
:00484929 56 push esi
:0048492A 8BD8 mov ebx, eax
:0048492C 33C0 xor eax, eax
:0048492E 55 push ebp
:0048492F 68BF4D4800 push 00484DBF
:00484934 64FF30 push dword ptr fs:[eax]
:00484937 648920 mov dword ptr fs:[eax], esp
* Reference To: kernel32.GetSystemDefaultLangID, Ord:0000h ;判断操作系统语言版本的API
|
:0048493A E89921F8FF Call 00406AD8
:0048493F 8BD0 mov edx, eax ;我们简体版返回是eax=0804,繁体是0404了
:00484941 6683E23F and dx, 003F ;dx=4
:00484945 0FB7F0 movzx esi, ax ;传0804
:00484948 C1EE0A shr esi, 0A ;si=2
:0048494B 6683FA04 cmp dx, 0004 ;比较 4是中文简体或繁体版,其余还是其他系统
:0048494F 7506 jne 00484957 ;中文版相等不跳
:00484951 6683FE01 cmp si, 0001 ;比较2是简体,1是繁体
:00484955 7404 je 0048495B ;相等跳
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048494F(C)
|
:00484957 33C0 xor eax, eax ;标志置0。来这里是非中文版,即英语版,但是解说是乱码!
:00484959 EB02 jmp 0048495D ;跳到标志位A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484955(U)
|
:0048495B B001 mov al, 01 ;标志置1 繁体版
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484959(U)
|
:0048495D 88832C030000 mov byte ptr [ebx+0000032C], al ;标志A !!我们这里al=0
:00484963 6683FA04 cmp dx, 0004 ;比较 4是中文简体或繁体版,其余还是其他系统
:00484967 7506 jne 0048496F ;中文版相等不跳
:00484969 6683FE02 cmp si, 0002 ;比较2是简体,1是繁体
:0048496D 7404 je 00484973 ;相等跳
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484967(C)
|
:0048496F 33C0 xor eax, eax ;标志置0。来这里是非中文版,即英语版,但是解说是乱码!
:00484971 EB02 jmp 00484975 ;跳到标志位B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048496D(C)
|
:00484973 B001 mov al, 01 ;标志置1 简体版
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484971(U)
|
:00484975 88832D030000 mov byte ptr [ebx+0000032D], al ;标志B !简体版我们这里al=1
:0048497B 84C0 test al, al ;关键比较,
:0048497D 7416 je 00484995 ;al=0才跳 !我们强制jmp EB16
* Possible StringData Ref from Code Obj ->"该版本不是简体版,简体版请到http://www.lshuzhi"
->".com下载"
|;向上看避过这里吧!
:0048497F B8D44D4800 mov eax, 00484DD4
:00484984 E887CDFCFF call 00451710
:00484989 A11C924900 mov eax, dword ptr [0049921C]
:0048498E 8B00 mov eax, dword ptr [eax]
:00484990 E8E76AFCFF call 0044B47C ;出错提示,*进去看是调用user32.PostQuitMessage
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048497D(U)
|
:00484995 80BB2D03000000 cmp byte ptr [ebx+0000032D], 00 ;这里=1
:0048499C 750D jne 004849AB ;跳了!!
:0048499E 80BB2C03000000 cmp byte ptr [ebx+0000032C], 00
:004849A5 7504 jne 004849AB
:004849A7 33C0 xor eax, eax
:004849A9 EB02 jmp 004849AD
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048499C(C), :004849A5(C)
|
:004849AB B001 mov al, 01
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004849A9(U)
|
:004849AD 88832E030000 mov byte ptr [ebx+0000032E], al ;标志C !我们这里al=1
:004849B3 B205 mov dl, 05
:004849B5 8B83D4020000 mov eax, dword ptr [ebx+000002D4] ;一路走下去出错提示消失
:004849BB E8D871FAFF call 0042BB98
:004849C0 B201 mov dl, 01
:004849C2 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:004849C8 E8CB7AFAFF call 0042C498
:004849CD 33D2 xor edx, edx
:004849CF 8B8324030000 mov eax, dword ptr [ebx+00000324]
:004849D5 E8BE7AFAFF call 0042C498
:004849DA B205 mov dl, 05
:004849DC 8B83D8020000 mov eax, dword ptr [ebx+000002D8]
:004849E2 E8B171FAFF call 0042BB98
:004849E7 B201 mov dl, 01
* Possible StringData Ref from Code Obj ->"DA"
|
:004849E9 A1C4DF4000 mov eax, dword ptr [0040DFC4]
:004849EE E825E5F7FF call 00402F18
:004849F3 898330030000 mov dword ptr [ebx+00000330], eax
:004849F9 C78564FFFFFF94000000 mov dword ptr [ebp+FFFFFF64], 00000094
:00484A03 8D8564FFFFFF lea eax, dword ptr [ebp+FFFFFF64]
:00484A09 50 push eax
* Reference To: kernel32.GetVersionExA, Ord:0000h
|
:00484A0A E8F120F8FF Call 00406B00
:00484A0F 83BD74FFFFFF02 cmp dword ptr [ebp+FFFFFF74], 00000002
:00484A16 0F94C0 sete al
:00484A19 888334030000 mov byte ptr [ebx+00000334], al
:00484A1F 80BB2E03000000 cmp byte ptr [ebx+0000032E], 00
:00484A26 0F84E3010000 je 00484C0F ;不跳,一路走下去退出!!呵呵,还有暗桩!
:00484A2C 8D8D60FFFFFF lea ecx, dword ptr [ebp+FFFFFF60]
此刻我们想起一般退出都是调用user32.PostQuitMessage,正好前面也有调用这个的,我们进去看看会发现什么?
代码:
* Referenced by a CALL at Addresses:
|:00448263 , :00484990 , :00485034 ;发现有3处调用这里,我们一一进去看看!
|
:0044B47C E86303FCFF call 0040B7E4
:0044B481 84C0 test al, al
:0044B483 7407 je 0044B48C
:0044B485 6A00 push 00000000
* Reference To: user32.PostQuitMessage, Ord:0000h
|
:0044B487 E864BDFBFF Call 004071F0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B483(C)
|
:0044B48C C3 ret
在第三处我们看到了:
:00485014 803D648F490000 cmp byte ptr [00498F64], 00
:0048501B 741C je 00485039
:0048501D C605648F490000 mov byte ptr [00498F64], 00
:00485024 80B82D03000000 cmp byte ptr [eax+0000032D], 00 ;就是这里,我们前面简体版标志为1,当然下面不跳!!
:0048502B 740C je 00485039 ;我们当然要强制跳!改为jmp
:0048502D A11C924900 mov eax, dword ptr [0049921C]
:00485032 8B00 mov eax, dword ptr [eax]
:00485034 E84364FCFF call 0044B47C ; 调用user32.PostQuitMessage的地方
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048501B(C), :0048502B(U)
|
:00485039 C3 ret
:0048503A 8BC0 mov eax, eax
好到此,我们进去了!可是,显示是繁体,就是我们看到的是乱码!!怎么办,解决他,这时要请出od来了。
我们接着程序往下走,各位看到下面代码,明明看到的都是简体的字符串啊!
代码:
:004849F9 C78564FFFFFF94000000 mov dword ptr [ebp+FFFFFF64], 00000094
:00484A03 8D8564FFFFFF lea eax, dword ptr [ebp+FFFFFF64]
:00484A09 50 push eax
* Reference To: kernel32.GetVersionExA, Ord:0000h
|
:00484A0A E8F120F8FF Call 00406B00
:00484A0F 83BD74FFFFFF02 cmp dword ptr [ebp+FFFFFF74], 00000002
:00484A16 0F94C0 sete al
:00484A19 888334030000 mov byte ptr [ebx+00000334], al
:00484A1F 80BB2E03000000 cmp byte ptr [ebx+0000032E], 00
:00484A26 0F84E3010000 je 00484C0F ;不跳,一路走下去退出!!呵呵,还有暗桩!
:00484A2C 8D8D60FFFFFF lea ecx, dword ptr [ebp+FFFFFF60]
* Possible StringData Ref from Code Obj ->"定式详解"
|
:00484A32 BA144E4800 mov edx, 00484E14 ;就是这些地方!明明看到的都是简体的字符串啊!存edx=00484E14
:00484A37 8BC3 mov eax, ebx
:00484A39 E892FAFFFF call 004844D0 ;看来是这里可疑,我们进去看看吧!
:00484A3E 8B9560FFFFFF mov edx, dword ptr [ebp+FFFFFF60]
:00484A44 8BC3 mov eax, ebx
:00484A46 E8657BFAFF call 0042C5B0
:00484A4B 8D8D5CFFFFFF lea ecx, dword ptr [ebp+FFFFFF5C]
* Possible StringData Ref from Code Obj ->"请单击A、B、C等点"
|
:00484A51 BA284E4800 mov edx, 00484E28 ;就是这些地方!明明看到的都是简体的字符串啊!
:00484A56 8BC3 mov eax, ebx
:00484A58 E873FAFFFF call 004844D0 ;看来是这里可疑,
:00484A5D 8B955CFFFFFF mov edx, dword ptr [ebp+FFFFFF5C]
:00484A63 8B83F0020000 mov eax, dword ptr [ebx+000002F0]
:00484A69 E8427BFAFF call 0042C5B0
:00484A6E 8D8D58FFFFFF lea ecx, dword ptr [ebp+FFFFFF58]
* Possible StringData Ref from Code Obj ->"解说"
|
:00484A74 BA444E4800 mov edx, 00484E44 ;就是这些地方!明明看到的都是简体的字符串啊!
:00484A79 8BC3 mov eax, ebx
:00484A7B E850FAFFFF call 004844D0 ;看来是这里可疑,
:00484A80 8B9558FFFFFF mov edx, dword ptr [ebp+FFFFFF58]
:00484A86 8B8320030000 mov eax, dword ptr [ebx+00000320]
:00484A8C E81F7BFAFF call 0042C5B0
:00484A91 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54]
我们进去call 004844D0看看吧!好多地方调用
代码:
* Referenced by a CALL at Addresses:
|:00482A8C , :00482AAA , :00482ACC , :00482B13 , :00482B57
|:0048309B , :004830B9 , :004839E5 , :00483A03 , :00483A25
|:00483A47 , :00483A69 , :00483CB8 , :00483D03 , :00484A39
|:00484A58 , :00484A7B , :00484A9E , :00484AC1 , :00484AE4
|:00484B07 , :00484B2A , :00484B4D , :00484B73 , :00484B96
|:00484BC8 , :00484BF9 , :004852FD , :0048543A , :0048589C
|:00485A51 , :00485B70 , :0048639B , :0048673F , :00486766
|
:004844D0 53 push ebx
:004844D1 56 push esi
:004844D2 57 push edi
:004844D3 8BF9 mov edi, ecx
:004844D5 8BF2 mov esi, edx ;明明看到的都是简体的字符串啊!
:004844D7 8BD8 mov ebx, eax
:004844D9 8BCF mov ecx, edi
:004844DB 8BD6 mov edx, esi ;下d edx,看到"定式详解"
:004844DD 8B8318030000 mov eax, dword ptr [ebx+00000318]
:004844E3 E878D2FFFF call 00481760 ;看来是这里可疑,我们进去看看吧!
:004844E8 5F pop edi
:004844E9 5E pop esi
:004844EA 5B pop ebx
:004844EB C3 ret
我们进去 call 00481760 看看吧!
代码:
* Referenced by a CALL at Address:
|:004844E3
|
:00481760 53 push ebx
:00481761 56 push esi
:00481762 57 push edi
:00481763 8BF9 mov edi, ecx
:00481765 8BF2 mov esi, edx ;明明看到的都是简体的字符串啊!
:00481767 8BD8 mov ebx, eax
:00481769 57 push edi
:0048176A 33C9 xor ecx, ecx
:0048176C 8BD6 mov edx, esi ;下d edx,看到"定式详解"
:0048176E 8B4324 mov eax, dword ptr [ebx+24]
:00481771 E806000000 call 0048177C ;看来是这里可疑,我们进去看看吧!
:00481776 5F pop edi
:00481777 5E pop esi
:00481778 5B pop ebx
:00481779 C3 ret
我们进去 call 0048177C 看看吧!这里是真正的重点了
代码:
* Referenced by a CALL at Addresses:
|:004815FC , :00481618 , :00481771
|
:0048177C 55 push ebp
:0048177D 8BEC mov ebp, esp
:0048177F 51 push ecx
:00481780 B904000000 mov ecx, 00000004
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048178A(C)
|
:00481785 6A00 push 00000000 ;准备堆栈
:00481787 6A00 push 00000000 ;准备堆栈
:00481789 49 dec ecx
:0048178A 75F9 jne 00481785 ;循环
:0048178C 874DFC xchg dword ptr [ebp-04], ecx
:0048178F 53 push ebx
:00481790 56 push esi ;入栈,下d esi,看到简体"定式详解"
:00481791 57 push edi
:00481792 884DFF mov byte ptr [ebp-01], cl
:00481795 8BFA mov edi, edx ;下d edx,看到简体"定式详解"
:00481797 33C0 xor eax, eax
:00481799 55 push ebp
:0048179A 6855194800 push 00481955
:0048179F 64FF30 push dword ptr fs:[eax]
:004817A2 648920 mov dword ptr fs:[eax], esp
:004817A5 8BC7 mov eax, edi ;走过下d eax,看到简体"定式详解"
:004817A7 E8A426F8FF call 00403E50 ;获得"定式详解"长度的call,返回eax=8
走过下d eax此时看内存:
00484E10 00000008 ... ;长度8
00484E14 BDCAA8B6 定式 ;字符
00484E18 E2BDEACF 详解
00484E1C 00000000 ....
:004817AC 8BF0 mov esi, eax ;esi=eax=8
:004817AE 83FE02 cmp esi, 00000002 ;比较
:004817B1 7D0F jge 004817C2 ;大于就跳,这里是关键,后面再说吧!!!
:004817B3 8B4508 mov eax, dword ptr [ebp+08]
:004817B6 8BD7 mov edx, edi
:004817B8 E86724F8FF call 00403C24 ;这里也后面说
:004817BD E970010000 jmp 00481932
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004817B1(C)
|
:004817C2 8D45F8 lea eax, dword ptr [ebp-08] ;跳到这里,注意edi里是00484E14,看到简体"定式详解"
:004817C5 E80624F8FF call 00403BD0
:004817CA BB01000000 mov ebx, 00000001 ;置1
:004817CF 3BF3 cmp esi, ebx ;比较,此时esi=8,前面得到的
:004817D1 0F8C50010000 jl 00481927 ;当然不跳,接下面吧
;好这里开始就是简体转繁体的一段代码!!!
代码:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00481921(C)
|
:004817D7 3BF3 cmp esi, ebx ;比较转换到第几位
:004817D9 7522 jne 004817FD ;没结束就跳下去
:004817DB 8D45EC lea eax, dword ptr [ebp-14]
:004817DE 50 push eax
:004817DF B901000000 mov ecx, 00000001
:004817E4 8BD3 mov edx, ebx
:004817E6 8BC7 mov eax, edi
:004817E8 E86B28F8FF call 00404058
:004817ED 8B55EC mov edx, dword ptr [ebp-14]
:004817F0 8D45F8 lea eax, dword ptr [ebp-08]
:004817F3 E86026F8FF call 00403E58
:004817F8 E921010000 jmp 0048191E
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004817D9(C)
|
:004817FD 33C0 xor eax, eax ;清零开始
:004817FF 8A441FFF mov al, byte ptr [edi+ebx-01] ;edi里是00484E14,从第一位开始依次给al
:00481803 8945F4 mov dword ptr [ebp-0C], eax ;传给ebp-0C
:00481806 33C0 xor eax, eax ;清零
:00481808 8A041F mov al, byte ptr [edi+ebx] ;汉字是双字节,当然要2位一起计算
:0048180B 807DFF00 cmp byte ptr [ebp-01], 00
:0048180F 0F8499000000 je 004818AE ;跳
:00481815 8B55F4 mov edx, dword ptr [ebp-0C]
:00481818 81C25FFFFFFF add edx, FFFFFF5F
:0048181E 83EA59 sub edx, 00000059
:00481821 736C jnb 0048188F
:00481823 8BD0 mov edx, eax
:00481825 83C2C0 add edx, FFFFFFC0
:00481828 83EA3F sub edx, 0000003F
:0048182B 7208 jb 00481835
:0048182D 83C2DE add edx, FFFFFFDE
:00481830 83EA5E sub edx, 0000005E
:00481833 735A jnb 0048188F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048182B(C)
|
:00481835 83F87F cmp eax, 0000007F
:00481838 7D19 jge 00481853
:0048183A 8B55F4 mov edx, dword ptr [ebp-0C]
:0048183D 81EAA1000000 sub edx, 000000A1
:00481843 69D29D000000 imul edx, 0000009D
:00481849 83E840 sub eax, 00000040
:0048184C 03D0 add edx, eax
:0048184E 8955F0 mov dword ptr [ebp-10], edx
:00481851 EB17 jmp 0048186A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00481838(C)
|
:00481853 8B55F4 mov edx, dword ptr [ebp-0C]
:00481856 81EAA1000000 sub edx, 000000A1
:0048185C 69D29D000000 imul edx, 0000009D
:00481862 83E862 sub eax, 00000062
:00481865 03D0 add edx, eax
:00481867 8955F0 mov dword ptr [ebp-10], edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00481851(U)
|
:0048186A 8D45E8 lea eax, dword ptr [ebp-18]
:0048186D 8B55F0 mov edx, dword ptr [ebp-10]
:00481870 8D1452 lea edx, dword ptr [edx+2*edx]
:00481873 81C2A4EB4800 add edx, 0048EBA4
:00481879 E87625F8FF call 00403DF4
:0048187E 8B55E8 mov edx, dword ptr [ebp-18]
:00481881 8D45F8 lea eax, dword ptr [ebp-08]
:00481884 E8CF25F8FF call 00403E58
:00481889 43 inc ebx
:0048188A E98F000000 jmp 0048191E
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00481821(C), :00481833(C)
|
:0048188F 8D45E4 lea eax, dword ptr [ebp-1C]
:00481892 50 push eax
:00481893 B901000000 mov ecx, 00000001
:00481898 8BD3 mov edx, ebx
:0048189A 8BC7 mov eax, edi
:0048189C E8B727F8FF call 00404058
:004818A1 8B55E4 mov edx, dword ptr [ebp-1C]
:004818A4 8D45F8 lea eax, dword ptr [ebp-08]
:004818A7 E8AC25F8FF call 00403E58
:004818AC EB70 jmp 0048191E
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048180F(C)
|
:004818AE 8B55F4 mov edx, dword ptr [ebp-0C] ;第一位
:004818B1 81C25FFFFFFF add edx, FFFFFF5F ;add
:004818B7 83EA57 sub edx, 00000057 ;sub
:004818BA 7345 jnb 00481901 ;不跳
:004818BC 8BD0 mov edx, eax ;第二位
:004818BE 81C25FFFFFFF add edx, FFFFFF5F ;add
:004818C4 83EA5E sub edx, 0000005E ;sub
:004818C7 7338 jnb 00481901
:004818C9 8B55F4 mov edx, dword ptr [ebp-0C]
:004818CC 81EAA1000000 sub edx, 000000A1
:004818D2 6BD25E imul edx, 0000005E
:004818D5 2DA1000000 sub eax, 000000A1
:004818DA 03D0 add edx, eax
:004818DC 8955F0 mov dword ptr [ebp-10], edx
:004818DF 8D45E0 lea eax, dword ptr [ebp-20]
:004818E2 8B55F0 mov edx, dword ptr [ebp-10]
:004818E5 8D1452 lea edx, dword ptr [edx+2*edx]
:004818E8 81C2CC8B4800 add edx, 00488BCC
:004818EE E80125F8FF call 00403DF4
:004818F3 8B55E0 mov edx, dword ptr [ebp-20]
:004818F6 8D45F8 lea eax, dword ptr [ebp-08]
:004818F9 E85A25F8FF call 00403E58
:004818FE 43 inc ebx
:004818FF EB1D jmp 0048191E
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004818BA(C), :004818C7(C)
|
:00481901 8D45DC lea eax, dword ptr [ebp-24]
:00481904 50 push eax
:00481905 B901000000 mov ecx, 00000001
:0048190A 8BD3 mov edx, ebx
:0048190C 8BC7 mov eax, edi
:0048190E E84527F8FF call 00404058
:00481913 8B55DC mov edx, dword ptr [ebp-24]
:00481916 8D45F8 lea eax, dword ptr [ebp-08]
:00481919 E83A25F8FF call 00403E58 ;以上分析略过了,反正是简体转繁体!
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004817F8(U), :0048188A(U), :004818AC(U), :004818FF(U)
|
:0048191E 43 inc ebx ;加1
:0048191F 3BF3 cmp esi, ebx ;比较到了第几位了!
:00481921 0F8DB0FEFFFF jnl 004817D7 ;没转完,就跳去循环!
[code]
计算转换完毕来到下面
[code]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004817D1(C)
|
:00481927 8B4508 mov eax, dword ptr [ebp+08]
:0048192A 8B55F8 mov edx, dword ptr [ebp-08] ;此时就是转好的繁体"定式详解" ,下d edx
:0048192D E8F222F8FF call 00403C24 ;这个就是显示菜单的call了
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004817BD(U)
|
:00481932 33C0 xor eax, eax
:00481934 5A pop edx
:00481935 59 pop ecx
:00481936 59 pop ecx
:00481937 648910 mov dword ptr fs:[eax], edx
:0048193A 685C194800 push 0048195C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048195A(U)
|
:0048193F 8D45DC lea eax, dword ptr [ebp-24]
:00481942 BA05000000 mov edx, 00000005
:00481947 E8A822F8FF call 00403BF4
:0048194C 8D45F8 lea eax, dword ptr [ebp-08]
:0048194F E87C22F8FF call 00403BD0
:00481954 C3 ret
那我们剩下的工作,就是不要让他转换!我们跳过他吧
:004817AC 8BF0 mov esi, eax ;esi=eax=8
:004817AE 83FE02 cmp esi, 00000002 ;比较
:004817B1 7D0F jge 004817C2 ;我们强制不跳nop,90大法
:004817B3 8B4508 mov eax, dword ptr [ebp+08]
:004817B6 8BD7 mov edx, edi ;呵呵,此时是简体的了!
:004817B8 E86724F8FF call 00403C24 ;这个就是显示菜单的call了
:004817BD E970010000 jmp 00481932
修改,运行进入简体显示,好就此完工,下面我们来注册他吧!如果大家需要看他的简体转繁体的代码,可以仔细学习一下!这我可不敢乱说
了!
代码:
* Possible StringData Ref from Code Obj ->"?C"
|
:00486704 A18C2D4800 mov eax, dword ptr [00482D8C]
:00486709 E806DDFBFF call 00444414 ;分析此处可以,下bp 00444414
:0048670E 8B15C8914900 mov edx, dword ptr [004991C8]
:00486714 8902 mov dword ptr [edx], eax
:00486716 80BB5903000000 cmp byte ptr [ebx+00000359], 00
:0048671D 7427 je 00486746
:0048671F 8D45FC lea eax, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"Registered version"
|
:00486722 BAD0674800 mov edx, 004867D0
:00486727 E83CD5F7FF call 00403C68
:0048672C 80BB2E03000000 cmp byte ptr [ebx+0000032E], 00
:00486733 7436 je 0048676B
:00486735 8D4DFC lea ecx, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"注册用户"
|
:00486738 BAEC674800 mov edx, 004867EC
:0048673D 8BC3 mov eax, ebx
:0048673F E88CDDFFFF call 004844D0
:00486744 EB25 jmp 0048676B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048671D(C)
|
:00486746 8D45FC lea eax, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"Unregistered version"
|
:00486749 BA00684800 mov edx, 00486800
:0048674E E815D5F7FF call 00403C68
:00486753 80BB2E03000000 cmp byte ptr [ebx+0000032E], 00
:0048675A 740F je 0048676B
:0048675C 8D4DFC lea ecx, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"非注册用户"
|
:0048675F BA20684800 mov edx, 00486820
:00486764 8BC3 mov eax, ebx
:00486766 E865DDFFFF call 004844D0
用OllyDbg1.10 打开我们修改后的.exe,中断在入口,因为没有加壳,因此直接调试,忽略所有异常,取消所有断点,F9运行出界面。
然后下bp 00444414(或者干脆把调用这里的地方都下断),点击注册按钮!中断如下:
代码:
........
00484848 |. 8BCB mov ecx, ebx
0048484A |. B2 01 mov dl, 1
0048484C |. A1 00274800 mov eax, [482700]
00484851 |. E8 BEFBFBFF call 00444414 ;我们的断点返回到这里
00484856 |. 8B15 D8914900 mov edx, [4991D8] ; GoFormul.0049A988
0048485C |. 8902 mov [edx], eax
0048485E |. A1 D8914900 mov eax, [4991D8]
00484863 |. 8B00 mov eax, [eax]
00484865 |. 8B10 mov edx, [eax]
00484867 |. FF92 D8000000 call [edx+D8] ;显示对话框,我们输入787878,点ok,中断下面
0048486D |. 48 dec eax ;这里F2设断吧
0048486E |. 75 41 jnz short 004848B1
00484870 |. 8D55 FC lea edx, [ebp-4]
00484873 |. A1 D8914900 mov eax, [4991D8]
00484878 |. 8B00 mov eax, [eax]
0048487A |. 8B80 DC020000 mov eax, [eax+2DC]
00484880 |. E8 FB7CFAFF call 0042C580
00484885 |. 8B55 FC mov edx, [ebp-4] ;我们的787878
00484888 |. 8BC3 mov eax, ebx
0048488A |. E8 D1FEFFFF call 00484760 ;关键call
0048488F |. 84C0 test al, al ;返回0,失败
00484891 |. 74 1E je short 004848B1 ;不跳注册爆破,但是重启呢?
00484893 |. C683 59030000 01 mov byte ptr [ebx+359], 1 ;注册标志
0048489A |. 33D2 xor edx, edx
0048489C |. 8B83 E4020000 mov eax, [ebx+2E4]
004848A2 |. E8 F17BFAFF call 0042C498
004848A7 |. 8B55 FC mov edx, [ebp-4]
004848AA |. 8BC3 mov eax, ebx
004848AC |. E8 23FEFFFF call 004846D4
004848B1 |> A1 D8914900 mov eax, [4991D8]
进入call 00484760
00484760 /$ 55 push ebp
00484761 |. 8BEC mov ebp, esp
00484763 |. 83C4 F0 add esp, -10
00484766 |. 53 push ebx
00484767 |. 56 push esi
00484768 |. 33C9 xor ecx, ecx
0048476A |. 894D F0 mov [ebp-10], ecx
0048476D |. 8955 FC mov [ebp-4], edx
00484770 |. 8BF0 mov esi, eax
00484772 |. 8B45 FC mov eax, [ebp-4]
00484775 |. E8 8AF8F7FF call 00404004
0048477A |. 33C0 xor eax, eax
0048477C |. 55 push ebp
0048477D |. 68 16484800 push 00484816
00484782 |. 64:FF30 push dword ptr fs:[eax]
00484785 |. 64:8920 mov fs:[eax], esp
00484788 |. B2 01 mov dl, 1
0048478A |. A1 18DD4000 mov eax, [40DD18]
0048478F |. E8 84E7F7FF call 00402F18
00484794 |. 8945 F4 mov [ebp-C], eax
00484797 |. 33C0 xor eax, eax
00484799 |. 55 push ebp
0048479A |. 68 F1474800 push 004847F1
0048479F |. 64:FF30 push dword ptr fs:[eax]
004847A2 |. 64:8920 mov fs:[eax], esp
004847A5 |. BB 2D010000 mov ebx, 12D ;12d
004847AA |> 8D4D F0 /lea ecx, [ebp-10]
004847AD |. 8BD3 |mov edx, ebx
004847AF |. 8BC6 |mov eax, esi
004847B1 |. E8 FAFDFFFF |call 004845B0 ;此处计算得到注册码,可以计算得到6个!!
004847B6 |. 8B55 F0 |mov edx, [ebp-10] ;[ebp-10]为真注册码!
004847B9 |. 8B45 F4 |mov eax, [ebp-C]
004847BC |. 8B08 |mov ecx, [eax]
004847BE |. FF51 34 |call [ecx+34]
004847C1 |. 43 |inc ebx
004847C2 |. 81FB 33010000 |cmp ebx, 133 ;133-12d=6
004847C8 |.^ 75 E0 \jnz short 004847AA
004847CA 8B55 FC mov edx, [ebp-4] ;此处为假注册码!!
004847CD |. 8B45 F4 mov eax, [ebp-C]
004847D0 |. 8B08 mov ecx, [eax]
004847D2 |. FF51 50 call [ecx+50]
004847D5 |. 85C0 test eax, eax
004847D7 |. 0F9D45 FB setge [ebp-5]
004847DB |. 33C0 xor eax, eax
004847DD |. 5A pop edx
004847DE |. 59 pop ecx
004847DF |. 59 pop ecx
004847E0 |. 64:8910 mov fs:[eax], edx
004847E3 |. 68 F8474800 push 004847F8
004847E8 |> 8B45 F4 mov eax, [ebp-C]
004847EB |. E8 58E7F7FF call 00402F48
004847F0 \. C3 retn
你可以进入call 004845B0 看看,好复杂的算法,但是明码出现了,还管他干什么,做内存注册机吧
但是我不作内存注册机,要做补丁,怎么办呢,
看到
004847CA 8B55 FC mov edx, [ebp-4] ;此处为假注册码!!
我们知道此时[ebp-10]为真注册码!,那我们把它替换!改为:
004847CA 8B55 F0 mov edx, [ebp-10]
这样只要注册一次,就可以了!
现在爽了,这些定式够我用的了!
--------------------------------------------------------------------------------
【总结】
1:0048497D 7416 je 00484995 ;我们强制跳 改为 jmp 00484995 [EB16]
2:0048502B 740C je 00485039 ;我们强制跳!改为 jmp 00485039 [EB0C]
3:004817B1 7D0F jge 004817C2 ;我们强制不跳 改为 nop, [9090]
4:004847CA 8B55 FC mov edx, [ebp-4] ;我们把它替换!改为:
:004847CA 8B55 F0 mov edx, [ebp-10]
只改5个字节!爆破的艺术就是要用改代码最少的方法实现成功!
没什么可总结的,此程序好像就6个注册码呢!不知道当初他是为何,好几年了。找好api函数,断点,跟踪,爆破!主要是给大家一个过程,一个思路!
但是作者已经不提供此版本下载,有需要的告诉我!
唯一可以总结的就是,我们可以逆向得到他的简体转繁体的代码,倒是很实用呢:
1.通过kernel32.GetSystemDefaultLangID判断操作系统,决定显示版本字体;
2.把菜单,按钮、说明等的字符串依次用 简体转繁体的call转一下,存下;
3.再显示。
****原版下载地址!破解补丁恕不提供,请谅解!
http://free.ys168.com/?laoqian
解压密码:fcg
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!