【文章标题】: 安利直销管理售系统7.2--注册分析--追MM法
【文章作者】: FishSeeWater
【作者邮箱】: shuijiany99@163.com
【作者QQ号】: 45399405
【软件名称】: 安利直销管理售系统7.2
【下载地址】: 自己搜索下载
【加壳方式】: UPX
【保护方式】: 注册码
【编写语言】: Delphi6-7
【使用工具】: DEDE+OllyICE
【操作平台】: Windows2003
【软件介绍】: 为安利营销人员量身定制的专用进销存软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
要做安利了,竞然收到这个软件(我的知名度很高????),看了一下有用,但需注册,心下不爽。
马上动手,OllyICE->OPEN->F9,我的世界一下清静,生活失去活力,单调色彩(蓝屏)让我不想再次体味。
心下大呼:上帝啊,为什么心急就吃不到豆腐呢?上帝说:“要得到她就先了解她的背景,并摸清她的
生活惯!早就给你天书N本(看雪精华),让你仔细研读,为何不按天书的指导行动?岂不知道那是多少
天将追MM的心血结晶!”回想天书,历历在目,心下豁然:
行动:
1、先请侦探(PEID),摸清她的父母:->UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo ,
穿的衣服:)
2、不能暴力,温柔一点:) 写一个UPX脚本(程序脱壳后会飞的:))
///////////////////////
EOB Break1
invoke Find, eip, "61e9"
mov reg01, reg00
invoke bp, reg01
run
halt
Break1:
invoke bc, reg01
stepover
stepover
//////
invoke WriteMemLong, 0x0082AE64,0xeb,1 //调试标志
invoke WriteMemLong, 0x0082BC43,0xeb,1 //调试标志
////////////////////////
2、OLLYICE->OllyMachine-> 脚本
3、Dump一份出来,请侦探帮忙看一下她父母谁->Borland Delphi 6.0 - 7.0
4、太好了,对于这样有着优秀血统家庭出来的女孩,我很喜欢。
正好我有一个好朋友DEDE,对他们家族有着很深的了解,对于该MM的习性直接问他就行了。
DEDE大哥果然仗义,一会就给我整理出一份详尽的MM资料(AmWay_Dump.Map)
5、OllyICE->API断点工具->进程函数(全选上,看你往哪飞:)) F9运行
6、哈,终于知道为什么会让我的生活失去色彩,
代码:
0082AE60 8>CMP DWORD PTR SS:[EBP-4],0
0082AE64 E>JE SHORT <AMWay.loc_82AE71> ; JMP OK
0082AE66 6>PUSH 0
0082AE68 8>MOV EAX,DWORD PTR SS:[EBP-8]
0082AE6B 5>PUSH EAX
0082AE6C E>CALL <AMWay.TerminateProcess> ; JMP 到 kernel32.TerminateProcess
0082AE71 > 5>PUSH ESI ; loc_82AE71
0082AE72 E>CALL <AMWay.CloseHandle_0> ; JMP 到 kernel32.CloseHandle
0082AE77 3>XOR EAX,EAX
0082AE79 5>POP EDX
7、F9运行 要注册号,出现MM的怀疑的面孔。
8、怀着忐忑的心情,输入用户:fsw,注册码:qqqqqqqq,心中默念:“接受我的注册码吧,我会
让你幸福的”,MM没表态,直接接受我,心下疑惑怎么这么好追呢?再次运行,以出现MM怀疑
的面孔,啊,是这样啊,MM很友好,给我与她接触、了解的机会。(我心下大喊,放心吧,我一
定会让你满意的)
9、现在是亲自与MM接触的时候了,
(1)OllyICE->OllyMachine-> 脚本
(2)OllyICE->LoadMap->AmWay_Dump.Map
(3)OllyICE->Ultra String Reference
10、看到了
Ultra String Reference, 条目 3899 Address=006967AA Disassembly=MOV EDX,OFFSET <AMWay.aReguser_0>
Text String=reguser
Ultra String Reference, 条目 3898 Address=00696788 Disassembly=MOV EDX,OFFSET <AMWay.aRegcode>
Text String=regcode
双击regCode来到上下看看,哦,原来是把我的见面礼放到注册表里了,好继续!
11、先上注册表看看,
[HKEY_LOCAL_MACHINE\SOFTWARE\amway]
"ExeFileName"="C:\\amway7.2\\amway\\AMWay.exe"
"regUser"="fsw"
"AuToRun"="0"
"regCode"=""
夷,我的见面礼呢?%~~~&^%算了,还是问MM怎么回事。
(1)OllyICE->OllyMachine-> 脚本
(2)F9 输入用户:fsw,注册码:qqqqqqqq
(3)bp RegSetValueExA [esp-8]=="regcode" (问:为什么是这个啊?答:笨,一个个试呗,注册表函数
一共就那么几个)
(4)点“注册”MM被问住了,Alt+F9后,去注册表看看我的“见面礼”,哈,MM收下了,F9
(5)MM又停下了,上下代码一看,哦,是记下了我的名字“fsw”,这MM真细心,我喜欢这样的girl F9
(6)MM怎么又停下了?算了,好像又要再看一遍我的“见面实礼”(因为上下看看代码,RegSetValueExA的参数是
(“regcode”) 现在不能F9了,看来MM对我也有点意思了,否则又怎么会再看一遍我的“见面礼” 呢。仔细看看,
发现MM在这里把我的见面礼又送出来了,不要了!(清空了"regCode"=""),好,看看MM为什么最终不要我的“见面礼”。
(7)Ctrl+F9 ,每一次都要小心看看MM的反应,一直到 :(在下面的代码中)
0082CE66 |E>JMP SHORT <AMWay.loc_82CE6F> ;MM是从这里出来的(******************)
向上看看,呵呵,现在的MM竟然还保留着传统女孩的观念,
0082CE55 /7>JE SHORT <AMWay.loc_82CE68> ;经典语句,爆破手(只想得到人)的工作在
此完成后就可结束(JE->JMP)我太喜欢了,我喜欢传统的女孩,不张扬,有着古典美,(现在的女孩呀~~~~不想说了)。
因为有DEDE大哥提供的MM资料,MM看起来是那么的明了,往上一点,找个地方下断,就选 0x0082CE0F 这里吧。
(因为有经典的比较语句,所以一般注册的核心就在附近)。
代码:
0082CDD4 > E>CALL <AMWay.@Sysutils@Trim$qqrx17System@>; ->SysUtils.Trim(AnsiString):AnsiString;overload;
0082CDD9 8>MOV ECX,DWORD PTR SS:[EBP-1C]
0082CDDC > 8>MOV EDX,DWORD PTR DS:[EBX+3D4] ; *TFMailForm.OFFS_03D4
0082CDE2 > 8>MOV EAX,DWORD PTR DS:[EBX+300] ; *TFMailForm.OFFS_0300
0082CDE8 > E>CALL <AMWay.sub_5F5D34> ; ->:TColumnsEhPropertyInterceptor._PROC_005F5D34()
0082CDED 8>TEST AL,AL
0082CDEF 0>JNZ <AMWay.loc_82CEF2>
0082CDF5 > C>MOV DWORD PTR DS:[EBX+62C],1 ; *TFMailForm.OFFS_062C
0082CDFF 8>LEA EDX,DWORD PTR SS:[EBP-30]
0082CE02 8>MOV EAX,EBX
0082CE04 E>CALL <AMWay.sub_829C90>
0082CE09 8>MOV EAX,DWORD PTR SS:[EBP-30]
0082CE0C 8>LEA EDX,DWORD PTR SS:[EBP-2C]
0082CE0F > E>CALL <AMWay.@Sysutils@Trim$qqrx17System@>; ->SysUtils.Trim(AnsiString):AnsiString;overload;
0082CE14 8>MOV EDX,DWORD PTR SS:[EBP-2C]
0082CE17 8>LEA ECX,DWORD PTR SS:[EBP-28]
0082CE1A 8>MOV EAX,EBX
0082CE1C E>CALL <AMWay.loc_82A35C> ; (***)过这个CALL后,内存中出现一个
0082CE21 8>MOV EDX,DWORD PTR SS:[EBP-28] ;与“机器码”格式很像的数据,记下
0082CE24 8>LEA ECX,DWORD PTR SS:[EBP-24] ;“注册码”,并记下这个地址。一会进来看看。
0082CE27 8>MOV EAX,EBX
0082CE29 E>CALL <AMWay.sub_82A110> ;(***)过这个CALL后,双出现一个,记下,
0082CE2E 8>MOV EAX,DWORD PTR SS:[EBP-24] ;F9运行后输入注册框,发现上一个“注册
0082CE31 5>PUSH EAX ;码”,这一个成功了
0082CE32 8>LEA ECX,DWORD PTR SS:[EBP-38]
0082CE35 B>MOV EDX,OFFSET <AMWay.aRegcode_6> ; regcode
0082CE3A 8>MOV EAX,EBX
0082CE3C E>CALL <AMWay.sub_829AF4>
0082CE41 8>MOV EAX,DWORD PTR SS:[EBP-38]
0082CE44 8>LEA EDX,DWORD PTR SS:[EBP-34]
0082CE47 > E>CALL <AMWay.@Sysutils@Trim$qqrx17System@>; ->SysUtils.Trim(AnsiString):AnsiString;overload;
0082CE4C 8>MOV EDX,DWORD PTR SS:[EBP-34]
0082CE4F 5>POP EAX
0082CE50 > E>CALL <AMWay.@System@@LStrCmp$qqrv> ; ->System.@LStrCmp;
0082CE55 /7>JE SHORT <AMWay.loc_82CE68> ;经典语句,爆破手(只想得到人)的工作在
0082CE57 |A>MOV EAX,DWORD PTR DS:[<off_83C31C>] ;此完成后就可结束(JE->JMP)想得到心的
0082CE5C |8>MOV EAX,DWORD PTR DS:[EAX] ;朋友,就要反复努力,再走几遍,
0082CE5E |8>MOV EDX,DWORD PTR DS:[EAX] ;我们继续...:)
0082CE60 |F>CALL DWORD PTR DS:[EDX+EC] ;进里是清注册表中的假码的。
0082CE66 |E>JMP SHORT <AMWay.loc_82CE6F> ;MM是从这里出来的(******************)
0082CE68 > \C>MOV BYTE PTR DS:[EBX+609],1 ; 注册标志。
0082CE6F > C>MOV DWORD PTR DS:[EBX+62C],1 ; loc_82CE6F
0082CE79 8>LEA EDX,DWORD PTR SS:[EBP-48]
0082CE7C 8>MOV EAX,EBX
0082CE7E E>CALL <AMWay.sub_829C90>
0082CE83 8>MOV EAX,DWORD PTR SS:[EBP-48]
0082CE86 8>LEA EDX,DWORD PTR SS:[EBP-44]
0082CE89 > E>CALL <AMWay.@Sysutils@Trim$qqrx17System@>; ->SysUtils.Trim(AnsiString):AnsiString;overload;
0082CE8E 8>MOV EDX,DWORD PTR SS:[EBP-44]
0082CE91 8>LEA ECX,DWORD PTR SS:[EBP-40]
0082CE94 8>MOV EAX,EBX
0082CE96 E>CALL <AMWay.loc_82A35C>
////////////////////////////////////////////////////////////////
//CALL <AMWay.loc_82A35C> 这个CALL出现一个与“机器码”格式很像的数据
0082A3AE > 8>LEA EAX,DWORD PTR SS:[EBP-28] ; loc_82A3AE
0082A3B1 B>MOV EDX,OFFSET <AMWay.dword_82A568> ; 2
0082A3B6 E>CALL <AMWay.@System@@LStrLAsg$qqrpvpxv>
0082A3BB > 8>LEA EDX,DWORD PTR SS:[EBP-30] ; loc_82A3BB
0082A3BE 8>MOV EAX,DWORD PTR SS:[EBP-8]
0082A3C1 E>CALL <AMWay.@Sysutils@LowerCase$qqrx17Sy>
0082A3C6 8>MOV EDX,DWORD PTR SS:[EBP-30]
0082A3C9 8>LEA EAX,DWORD PTR SS:[EBP-8]
0082A3CC 8>MOV ECX,DWORD PTR SS:[EBP-28]
0082A3CF E>CALL <AMWay.@System@@LStrCat3$qqrv>
0082A3D4 8>LEA EAX,DWORD PTR SS:[EBP-10]
0082A3D7 5>PUSH EAX
0082A3D8 8>MOV EAX,DWORD PTR SS:[EBP-4]
0082A3DB 8>MOV EDX,DWORD PTR DS:[EAX+680]
0082A3E1 8>MOV ECX,DWORD PTR DS:[<_cStrMyName>] ; <AMWay.aMynameiswang_0>
0082A3E7 8>MOV EAX,DWORD PTR SS:[EBP-4] ;上面指向了一个名字变量,有点特别,现
0082A3EA E>CALL <AMWay.CreateLongStrNum> ;在提高警惕:)过了这个CALL后,内存中出
0082A3EF 8>MOV EAX,DWORD PTR SS:[EBP-10] ;(***)现了一段好长的数据,记住这个CALL,
0082A3F2 E>CALL <AMWay.@MyStrlen> ;过会进来看看取长数据的长度。
0082A3F7 8>MOV DWORD PTR SS:[EBP-24],EAX
0082A3FA 8>LEA EAX,DWORD PTR SS:[EBP-14]
0082A3FD E>CALL <AMWay.@System@@LStrClr$qqrpv>
0082A402 8>MOV EAX,DWORD PTR SS:[EBP-8] ;取机器码长度。
0082A405 E>CALL <AMWay.@MyStrlen>
0082A40A 8>MOV DWORD PTR SS:[EBP-20],EAX
0082A40D 8>MOV EAX,DWORD PTR SS:[EBP-20]
0082A410 8>TEST EAX,EAX
0082A412 0>JLE <AMWay.loc_82A50F>
0082A418 8>MOV DWORD PTR SS:[EBP-2C],EAX
0082A41B B>MOV EBX,1
0082A420 > 3>/XOR ESI,ESI ; loc_82A420 注意啦,要开始变了
0082A422 3>|XOR EAX,EAX
0082A424 8>|MOV DWORD PTR SS:[EBP-1C],EAX
0082A427 8>|CMP EBX,1
0082A42A 7>|JNZ SHORT <AMWay.loc_82A431>
0082A42C 8>|MOV ESI,DWORD PTR SS:[EBP-20]
0082A42F E>|JMP SHORT <AMWay.loc_82A432>
0082A431 > 4>|DEC ESI ; loc_82A431
0082A432 > 3>|CMP EBX,DWORD PTR SS:[EBP-20] ; loc_82A432
0082A435 7>|JNZ SHORT <AMWay.loc_82A440>
0082A437 C>|MOV DWORD PTR SS:[EBP-1C],1
0082A43E E>|JMP SHORT <AMWay.loc_82A443>
0082A440 > F>|INC DWORD PTR SS:[EBP-1C] ; loc_82A440
0082A443 > 8>|MOV EAX,DWORD PTR SS:[EBP-8] ; loc_82A443
0082A446 8>|MOV DL,BYTE PTR DS:[EAX+EBX-1] ;循环取机器码左边第某位
0082A44A 9>|NOP
0082A44B 9>|NOP
0082A44C 9>|NOP
0082A44D E>|CALL <AMWay.sub_82A314> ;(***)机器码左边第某位变形
0082A452 8>|MOV EDI,EAX ;暂存
0082A454 8>|MOV EAX,DWORD PTR SS:[EBP-8]
0082A457 8>|MOV DL,BYTE PTR DS:[EAX+ESI-1] ;取机器码右边第某位
0082A45B 9>|NOP
0082A45C 9>|NOP
0082A45D 9>|NOP
0082A45E E>|CALL <AMWay.sub_82A314> ;(***)器码右边第某位变形
0082A463 8>|MOV DWORD PTR SS:[EBP-18],EAX
0082A466 8>|MOV EAX,DWORD PTR SS:[EBP-8]
0082A469 8>|MOV EDX,DWORD PTR SS:[EBP-1C]
0082A46C 8>|MOV DL,BYTE PTR DS:[EAX+EDX-1] ;取机器码左边第某位变形
0082A470 9>|NOP
0082A471 9>|NOP
0082A472 9>|NOP
0082A473 E>|CALL <AMWay.sub_82A314> ;(***)机器码左边第某位变形
0082A478 8>|MOV ECX,EAX
0082A47A 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A47D 0>|ADD EAX,EDI
0082A47F 0>|ADD EAX,ECX
0082A481 8>|MOV EDX,EBX
0082A483 8>|SUB EDX,2
0082A486 0>|IMUL EDX,EBX
0082A489 0>|ADD EAX,EDX
0082A48B B>|MOV ESI,3
0082A490 9>|CDQ
0082A491 F>|IDIV ESI
0082A493 8>|MOV ESI,EAX
0082A495 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A498 0>|ADD EAX,EDI
0082A49A 0>|ADD EAX,ECX
0082A49C 9>|CDQ
0082A49D F>|IDIV DWORD PTR SS:[EBP-20]
0082A4A0 0>|ADD ESI,EDX
0082A4A2 3>|CMP ESI,DWORD PTR SS:[EBP-24]
0082A4A5 7>|JLE SHORT <AMWay.loc_82A4BA>
0082A4A7 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A4AA 0>|ADD EAX,EDI
0082A4AC 0>|ADD EAX,ECX
0082A4AE 0>|ADD EAX,EBX
0082A4B0 B>|MOV ESI,0FF
0082A4B5 9>|CDQ
0082A4B6 F>|IDIV ESI
0082A4B8 8>|MOV ESI,EAX
0082A4BA > 8>|TEST ESI,ESI ; loc_82A4BA
0082A4BC 7>|JG SHORT <AMWay.loc_82A4D2>
0082A4BE 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A4C1 0>|ADD EAX,EDI
0082A4C3 0>|ADD EAX,ECX
0082A4C5 0>|ADD EAX,EBX
0082A4C7 B>|MOV ESI,9
0082A4CC 9>|CDQ
0082A4CD F>|IDIV ESI
0082A4CF 8>|MOV ESI,EAX
0082A4D1 4>|INC ESI
0082A4D2 > 3>|CMP ESI,DWORD PTR SS:[EBP-24] ; loc_82A4D2
0082A4D5 7>|JLE SHORT <AMWay.loc_82A4EB>
0082A4D7 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A4DA 0>|ADD EAX,EDI
0082A4DC 0>|ADD EAX,ECX
0082A4DE B>|MOV ECX,0FF
0082A4E3 9>|CDQ
0082A4E4 F>|IDIV ECX
0082A4E6 8>|MOV ESI,EAX
0082A4E8 8>|ADD ESI,2
0082A4EB > 8>|LEA EAX,DWORD PTR SS:[EBP-34] ; 计算结果格式化并保存。
0082A4EE 8>|MOV EDX,DWORD PTR SS:[EBP-10]
0082A4F1 8>|MOV DL,BYTE PTR DS:[EDX+ESI-1]
0082A4F5 E>|CALL <AMWay.@System@@LStrFromChar$qqrr1>
0082A4FA 8>|MOV EDX,DWORD PTR SS:[EBP-34]
0082A4FD 8>|LEA EAX,DWORD PTR SS:[EBP-14]
0082A500 E>|CALL <AMWay.@System@@LStrCat$qqrv>
0082A505 4>|INC EBX
0082A506 F>|DEC DWORD PTR SS:[EBP-2C]
0082A509 ^ 0>\JNZ <AMWay.loc_82A420>
0082A50F > 8>MOV EAX,DWORD PTR SS:[EBP-C] ; loc_82A50F
0082A512 8>MOV EDX,DWORD PTR SS:[EBP-14] ;到这里将会看到“机器码”与“长数据块”
0082A515 E>CALL <AMWay.@System@@LStrAsg$qqrpvpxv> ;进行运算后的结果(这里先称她为中间码)
........
0082A55C 8>MOV ESP,EBP
0082A55E 5>POP EBP
0082A55F C>RETN
///////////////////////////////////////////////////////////////
//CALL <AMWay.CreateLongStrNum>这个CALL与软件作者的名字共同生成了一个好长的数据块
0082974E |. 33C>XOR EAX,EAX
00829750 |. 894>MOV DWORD PTR SS:[EBP-C],EAX
00829753 |. 8B4>MOV EAX,DWORD PTR SS:[EBP-8]
00829756 |. E8 >CALL <AMWay.@MyStrlen>
0082975B |. 8BF>MOV ESI,EAX
0082975D |. 85F>TEST ESI,ESI
0082975F |. 7E >JLE SHORT <AMWay.loc_829775>
00829761 |. BB >MOV EBX,1
00829766 >|> 8B4>/MOV EAX,DWORD PTR SS:[EBP-8] ; 循环将"mynameiswangyingnan"累加
00829769 |. 0FB>|MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
0082976E |. 014>|ADD DWORD PTR SS:[EBP-C],EAX
00829771 |. 43 |INC EBX
00829772 |. 4E |DEC ESI
00829773 |.^ 75 >\JNZ SHORT <AMWay.loc_829766>
00829775 >|> 8B4>MOV EAX,DWORD PTR SS:[EBP+8] ; loc_829775
00829778 |. 8B5>MOV EDX,DWORD PTR SS:[EBP-4]
0082977B |. E8 >CALL <AMWay.@System@@LStrAsg$qqrpvpxv>
00829780 |. 807>CMP BYTE PTR SS:[EBP-15],0
//..........
008297A4 |. /0F8>JLE <AMWay.loc_82983C>
008297AA |. |BB >MOV EBX,1
008297AF >|> |8B4>/MOV EAX,DWORD PTR SS:[EBP-8] ; "mynameiswangyingnan"
008297B2 |. |E8 >|CALL <AMWay.@MyStrlen> ;取长度
008297B7 |. |85C>|TEST EAX,EAX
008297B9 |. |75 >|JNZ SHORT <AMWay.loc_8297C0>
008297BB |. |895>|MOV DWORD PTR SS:[EBP-14],EBX
008297BE |. |EB >|JMP SHORT <AMWay.loc_8297CB>
008297C0 >|> |8B4>|MOV EAX,DWORD PTR SS:[EBP-8] ; "mynameiswangyingnan"
008297C3 |. |0FB>|MOVZX EAX,BYTE PTR DS:[EAX+EDI-1] ; 取字符
008297C8 |. |894>|MOV DWORD PTR SS:[EBP-14],EAX
008297CB >|> |F6C>|TEST BL,1 ; loc_8297CB
008297CE |. |74 >|JE SHORT <AMWay.loc_8297FC>
008297D0 |. |8B5>|MOV EDX,DWORD PTR SS:[EBP-10]
008297D3 |. |F7D>|NEG EDX
008297D5 |. |8B4>|MOV EAX,DWORD PTR SS:[EBP-14] ; 1 取字符
008297FF |. |035>|ADD EDX,DWORD PTR SS:[EBP-C] ; 1 累加
008297DB |. |0FA>|IMUL EDX,EAX
008297DE |. |8B4>|MOV EAX,DWORD PTR SS:[EBP+8]
008297E1 |. |8B0>|MOV EAX,DWORD PTR DS:[EAX]
008297E3 |. |8A4>|MOV AL,BYTE PTR DS:[EAX+EBX-1] ;这里的数据不知道从哪来的,在不同的电脑
008297E7 |. |E8 >|CALL <AMWay.sub_8296B8> ;上安装试验了一下,数据都是一样的,直接
008297EC |. |50 |PUSH EAX ;复制出来用算了:)
008297ED |. |8B4>|MOV EAX,DWORD PTR SS:[EBP+8]
008297F0 |. |E8 >|CALL <AMWay.sub_405518>
008297F5 |. |5A |POP EDX
008297F6 |. |885>|MOV BYTE PTR DS:[EAX+EBX-1],DL
008297FA |. |EB >|JMP SHORT <AMWay.loc_829822>
008297FC >|> |8B5>|MOV EDX,DWORD PTR SS:[EBP-14] ; 2 取字符
008297FF |. |035>|ADD EDX,DWORD PTR SS:[EBP-C] ; 2 累加
00829802 |. |0FA>|IMUL EDX,DWORD PTR SS:[EBP-10]
00829806 |. |8B4>|MOV EAX,DWORD PTR SS:[EBP+8]
00829809 |. |8B0>|MOV EAX,DWORD PTR DS:[EAX]
0082980B |. |8A4>|MOV AL,BYTE PTR DS:[EAX+EBX-1]
0082980F |. |E8 >|CALL <AMWay.sub_8296B8>
00829814 |. |50 |PUSH EAX
00829815 |. |8B4>|MOV EAX,DWORD PTR SS:[EBP+8]
00829818 |. |E8 >|CALL <AMWay.sub_405518> ; 取结果地址
0082981D |. |5A |POP EDX
0082981E |. |885>|MOV BYTE PTR DS:[EAX+EBX-1],DL ; 保存结果
00829822 >|> |47 |INC EDI ; loc_829822
00829823 |. |8B4>|MOV EAX,DWORD PTR SS:[EBP-8]
00829826 |. |E8 >|CALL <AMWay.@MyStrlen>
0082982B |. |3BF>|CMP EDI,EAX
0082982D |. |7E >|JLE SHORT <AMWay.loc_829834>
0082982F |. |BF >|MOV EDI,1
00829834 >|> |43 |INC EBX ; loc_829834
00829835 |. |4E |DEC ESI
00829836 |.^|0F8>\JNZ <AMWay.loc_8297AF>
0082983C >|> \33C>XOR EAX,EAX ; loc_82983C
.........
////////////////////////////////////////////////////////
CALL <AMWay.sub_82A110> 这个CALL出现了“成功的注册码”
//这个CALL过程与上面计算中间码的过程非常相似,就不说细节了,唯一注意的是在取字符进行变形时,
//调用的子过程和计算“中间码”所调用的子过程有且仅有的一点小差别01Eh与01Ah,不明白软件作者
//是怎么设计的。
0082A17C 8>LEA EAX,DWORD PTR SS:[EBP-8]
0082A17F 8>MOV ECX,DWORD PTR SS:[EBP-28]
0082A182 E>CALL <AMWay.@System@@LStrCat3$qqrv>
0082A187 8>LEA EAX,DWORD PTR SS:[EBP-10]
0082A18A 5>PUSH EAX
0082A18B 8>MOV EAX,DWORD PTR SS:[EBP-4]
0082A18E 8>MOV EDX,DWORD PTR DS:[EAX+680]
0082A194 8>MOV ECX,DWORD PTR DS:[<_cStrMyName>] ; <AMWay.aMynameiswang_0>
0082A19A 8>MOV EAX,DWORD PTR SS:[EBP-4] ;取软件作者的名字
0082A19D E>CALL <AMWay.CreateLongStrNum> ;过了这个CALL后,内存中出现了一段好长的数据,
0082A1A2 8>MOV EAX,DWORD PTR SS:[EBP-10]
0082A1A5 E>CALL <AMWay.@MyStrlen> ;取长数据长度
0082A1AA 8>MOV DWORD PTR SS:[EBP-24],EAX
0082A1AD 8>LEA EAX,DWORD PTR SS:[EBP-14]
0082A1B0 E>CALL <AMWay.@System@@LStrClr$qqrpv>
0082A1B5 8>MOV EAX,DWORD PTR SS:[EBP-8] ;取中间码长度
0082A1B8 E>CALL <AMWay.@MyStrlen>
0082A1BD 8>MOV DWORD PTR SS:[EBP-20],EAX
0082A1C0 8>MOV EAX,DWORD PTR SS:[EBP-20]
0082A1C3 8>TEST EAX,EAX
0082A1C5 0>JLE <AMWay.loc_82A2C0>
0082A1CB 8>MOV DWORD PTR SS:[EBP-2C],EAX
0082A1CE B>MOV EBX,1
0082A1D3 > 3>/XOR ESI,ESI ; loc_82A1D3
0082A1D5 3>|XOR EAX,EAX
0082A1D7 8>|MOV DWORD PTR SS:[EBP-1C],EAX
0082A1DA 8>|CMP EBX,1
0082A1DD 7>|JNZ SHORT <AMWay.loc_82A1E4>
0082A1DF 8>|MOV ESI,DWORD PTR SS:[EBP-20]
0082A1E2 E>|JMP SHORT <AMWay.loc_82A1E5>
0082A1E4 > 4>|DEC ESI ; loc_82A1E4
0082A1E5 > 3>|CMP EBX,DWORD PTR SS:[EBP-20] ; loc_82A1E5
0082A1E8 7>|JNZ SHORT <AMWay.loc_82A1F3>
0082A1EA > C>|MOV DWORD PTR SS:[EBP-1C],1
0082A1F1 E>|JMP SHORT <AMWay.loc_82A1F6>
0082A1F3 > F>|INC DWORD PTR SS:[EBP-1C] ; loc_82A1F3
0082A1F6 > 8>|MOV EAX,DWORD PTR SS:[EBP-8] ; loc_82A1F6
0082A1F9 8>|MOV DL,BYTE PTR DS:[EAX+EBX-1]
0082A1FD 8>|MOV EAX,DWORD PTR SS:[EBP-4]
0082A200 E>|CALL <AMWay.sub_82A0C8> ;(***)中间码变形
0082A205 8>|MOV EDI,EAX
0082A207 8>|MOV EAX,DWORD PTR SS:[EBP-8]
0082A20A 8>|MOV DL,BYTE PTR DS:[EAX+ESI-1]
0082A20E 8>|MOV EAX,DWORD PTR SS:[EBP-4]
0082A211 E>|CALL <AMWay.sub_82A0C8>
0082A216 8>|MOV DWORD PTR SS:[EBP-18],EAX
0082A219 8>|MOV EAX,DWORD PTR SS:[EBP-8]
0082A21C 8>|MOV EDX,DWORD PTR SS:[EBP-1C]
0082A21F 8>|MOV DL,BYTE PTR DS:[EAX+EDX-1]
0082A223 8>|MOV EAX,DWORD PTR SS:[EBP-4]
0082A226 E>|CALL <AMWay.sub_82A0C8>
0082A22B 8>|MOV ECX,EAX
0082A22D 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A230 0>|ADD EAX,EDI
0082A232 0>|ADD EAX,ECX
0082A234 8>|MOV EDX,EBX
0082A236 8>|SUB EDX,2
0082A239 0>|IMUL EDX,EBX
0082A23C 0>|ADD EAX,EDX
0082A23E B>|MOV ESI,3
0082A243 9>|CDQ
0082A244 F>|IDIV ESI
0082A246 8>|MOV ESI,EAX
0082A248 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A24B 0>|ADD EAX,EDI
0082A24D 0>|ADD EAX,ECX
0082A24F 9>|CDQ
0082A250 F>|IDIV DWORD PTR SS:[EBP-20]
0082A253 0>|ADD ESI,EDX
0082A255 3>|CMP ESI,DWORD PTR SS:[EBP-24]
0082A258 7>|JLE SHORT <AMWay.loc_82A26D>
0082A25A 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A25D 0>|ADD EAX,EDI
0082A25F 0>|ADD EAX,ECX
0082A261 0>|ADD EAX,EBX
0082A263 B>|MOV ESI,0FF
0082A268 9>|CDQ
0082A269 F>|IDIV ESI
0082A26B 8>|MOV ESI,EAX
0082A26D > 8>|TEST ESI,ESI ; loc_82A26D
0082A26F 7>|JG SHORT <AMWay.loc_82A285>
0082A271 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A274 0>|ADD EAX,EDI
0082A276 0>|ADD EAX,ECX
0082A278 0>|ADD EAX,EBX
0082A27A B>|MOV ESI,3
0082A27F 9>|CDQ
0082A280 F>|IDIV ESI
0082A282 8>|MOV ESI,EAX
0082A284 4>|INC ESI
0082A285 > 3>|CMP ESI,DWORD PTR SS:[EBP-24] ; loc_82A285
0082A288 7>|JLE SHORT <AMWay.loc_82A29C>
0082A28A 8>|MOV EAX,DWORD PTR SS:[EBP-18]
0082A28D 0>|ADD EAX,EDI
0082A28F 0>|ADD EAX,ECX
0082A291 B>|MOV ECX,0FF
0082A296 9>|CDQ
0082A297 F>|IDIV ECX
0082A299 8>|MOV ESI,EAX
0082A29B 4>|INC ESI
0082A29C > 8>|LEA EAX,DWORD PTR SS:[EBP-34] ; loc_82A29C
0082A29F 8>|MOV EDX,DWORD PTR SS:[EBP-10]
0082A2A2 8>|MOV DL,BYTE PTR DS:[EDX+ESI-1]
0082A2A6 E>|CALL <AMWay.@System@@LStrFromChar$qqrr1>
0082A2AB 8>|MOV EDX,DWORD PTR SS:[EBP-34]
0082A2AE 8>|LEA EAX,DWORD PTR SS:[EBP-14]
0082A2B1 E>|CALL <AMWay.@System@@LStrCat$qqrv>
0082A2B6 4>|INC EBX
0082A2B7 F>|DEC DWORD PTR SS:[EBP-2C]
0082A2BA ^ 0>\JNZ <AMWay.loc_82A1D3>
0082A2C0 > 8>MOV EAX,DWORD PTR SS:[EBP-C] ; loc_82A2C0
0082A2C3 8>MOV EDX,DWORD PTR SS:[EBP-14] ;到这里,跟踪完成,注册码计算完毕。一个
0082A2C6 E>CALL <AMWay.@System@@LStrAsg$qqrpvpxv> ;属于您的注册码已经产生,如只使用软件
0082A2CB 3>XOR EAX,EAX ;(心已得到),那就可以撤退了,如想知道
0082A2CD 5>POP EDX ;注册码生成过程(心上人的心思),那么请
0082A2CE 5>POP ECX ;再回去与心上人亲密接触:)(注册机的写做)
0082A2CF 5>POP ECX
0082A2D0 6>MOV DWORD PTR FS:[EAX],EDX
............
0082A30F 5>POP EBP
0082A310 C>RETN
////////////////////////////////////////////////
综合分析:
1、程序产生机器码
2、将"mynameiswangyingnan"每个字符ASCII相加
3、2生成的值,与内存中的某个数据运算,生成一个很长的字符块,长度为0ABh
4、将机器码与3的值进行运算,生成一个中间码。
5、将"mynameiswangyingnan"每个字符ASCII相加
6、5生成的值,与内存中的某个数据运算,生成一个很长的字符块,长度为0ABh
7、将中间码与5的值进行运算最终生成注册码。
8、打开MasmPlus1.1开始写注册机:)(MasmPlus1.1乃Aogo为大家写的一个费的汇编IDE)
--------------------------------------------------------------------------------
【经验总结】
程序中好多看不懂的,用MASM写注册机,直接从OllyICE中复制出来修改一下就可以用,感觉用汇编写
注册机能省很多事。
最后说点多余的:通过分析,感觉程序的作者在流程、算法方面处理的不是很好,就这个注册部分代码就
有好多冗余,上面的2,3完全可以和5,6合为一步,为什么要每一步都要写一个子函数呢?(我分析的不对?)
对于解密,我觉的对于初学者,最多的就是如何掌握一个思路,那样做起事来才会事半功倍。我也是一
个初学者,来看雪二三年了,来的都是学习,现在有点进步了,我很愿意将自己的学习经验与大家分享,
但愿能对新朋友起到抛砖引玉的作用少走弯路。
注册机源码见附件,代码写得很烂,请大家包涵:),工程文件为MasmPlus工程,请用MasmPlus直接打开。
帮助Aogo做宣传,回来让他请客:)
不到之处请大家指教。谢谢!!!!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年07月07日 23:01:11