首页
社区
课程
招聘
[原创]****管理售系统7.2--注册分析--追MM法[原创]
2006-7-7 23:52 7880

[原创]****管理售系统7.2--注册分析--追MM法[原创]

2006-7-7 23:52
7880
【文章标题】: 安利直销管理售系统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

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小剑 2006-7-8 00:23
2
0
好,支持一下先 ,DDDDDDD
雪    币: 26435
活跃值: (18467)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2006-7-8 10:31
3
0
最初由 FishSeeWater 发布
对于解密,我觉的对于初学者,最多的就是如何掌握一个思路,那样做起事来才会事半功倍。我也是一个初学者,来看雪二三年了,来的都是学习,现在有点进步了,我很愿意将自己的学习经验与大家分享,但愿能对新朋友起到抛砖引玉的作用少走弯路。


论坛一个宗旨就是大家共同进步,谢谢你与大家分享自己心得 。
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
bfqyygy 1 2006-7-8 12:47
4
0
安利软件有些意思!
雪    币: 177
活跃值: (1826)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xingbing 2006-7-9 21:36
5
0
但愿大家都能追到MM
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
czdbb 2006-11-2 13:18
6
0
试了下,脱壳后,OD却运行不了哦。。。?????????????
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
backuper 2006-11-2 15:50
7
0
  很形象  遗憾我悟性还没有到位  
     帮你顶!!  
膜拜
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-3 09:01
8
0
冗余=JUNK CODE

不过不一定是程序员的问题

可能是编译器的问题

就象C语言,如果使用局部变量来定义常量,例如一个字符串

编译后的结果是从资源段将字符移到堆栈,然后才传入首址给相关API。

直接将资源段地址传入不行吗?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
大菜鸟蛋 2006-11-3 09:37
9
0
写的蛮有意思了~~学习了
游客
登录 | 注册 方可回帖
返回