emailverify.exe注册及DIY
 

标题:emailverify.exe注册及DIY
链接:http://www.unpack.cn/viewthread.php?tid=20465
贴者:kongfoo
日期:2007-12-20 16:11

国产电子邮件校验软件,模拟发信检查邮件地址是否有效。是很旧的软件了,文件的创建日期是2001年12月的。Delphi写的,没壳。扔DeDe。要注册。
在DeDe里翻一下代码,找到TForm1.N10Click:

004A00D4   55                     push    ebp
004A00D5   8BEC                   mov     ebp, esp
004A00D7   83C4D4                 add     esp, -$2C
004A00DA   53                     push    ebx
004A00DB   56                     push    esi
004A00DC   33C9                   xor     ecx, ecx
004A00DE   894DD4                 mov     [ebp-$2C], ecx
004A00E1   894DFC                 mov     [ebp-$04], ecx
004A00E4   8BD8                   mov     ebx, eax
004A00E6   33C0                   xor     eax, eax
004A00E8   55                     push    ebp
004A00E9   6867024A00             push    $004A0267

***** TRY
|
004A00EE   64FF30                 push    dword ptr fs:[eax]
004A00F1   648920                 mov     fs:[eax], esp
004A00F4   8D45FC                 lea     eax, [ebp-$04]

* Possible String Reference to: '00000000'
|
004A00F7   BA7C024A00             mov     edx, $004A027C

* Reference to: system.@LStrLAsg;
|
004A00FC   E8573BF6FF             call    00403C58
004A0101   8D4DFC                 lea     ecx, [ebp-$04]

* Possible String Reference to: '请输入您的软件注册号'
|
004A0104   BA90024A00             mov     edx, $004A0290

* Possible String Reference to: '登记注册'
|
004A0109   B8B0024A00             mov     eax, $004A02B0

* Reference to: dialogs.InputQuery(AnsiString;AnsiString;AnsiString;AnsiString):Boolean;
|
004A010E   E899EAFAFF             call    0044EBAC   ==出输入注册码对话框
004A0113   3C01                   cmp     al, $01
004A0115   0F852E010000           jnz     004A0249
004A011B   8D55D4                 lea     edx, [ebp-$2C]
004A011E   8B45FC                 mov     eax, [ebp-$04]

* Reference to: sysutils.Trim(AnsiString):AnsiString;
|
004A0121   E82685F6FF             call    0040864C
004A0126   8B45D4                 mov     eax, [ebp-$2C]

* Reference to: sysutils.StrToInt64(AnsiString):Int64;
|
004A0129   E83E87F6FF             call    0040886C
004A012E   8945F0                 mov     [ebp-$10], eax
004A0131   8955F4                 mov     [ebp-$0C], edx
004A0134   6A00                   push    $00
004A0136   689A020000             push    $0000029A        ==除以666($29A)
004A013B   8B45F0                 mov     eax, [ebp-$10]
004A013E   8B55F4                 mov     edx, [ebp-$0C]

* Reference to: system.@_lldiv;
|
004A0141   E85C62F6FF             call    004063A2
004A0146   8945F0                 mov     [ebp-$10], eax
004A0149   8955F4                 mov     [ebp-$0C], edx
004A014C   8B45F0                 mov     eax, [ebp-$10]
004A014F   8B55F4                 mov     edx, [ebp-$0C]
004A0152   2D19D90000             sub     eax, $0000D919  ==减55577
004A0157   83DA00                 sbb     edx, +$00
004A015A   8945F0                 mov     [ebp-$10], eax
004A015D   8955F4                 mov     [ebp-$0C], edx
004A0160   8D45D8                 lea     eax, [ebp-$28]

|
004A0163   E808BDFFFF             call    0049BE70        ==取cpuid数据
004A0168   8B45D8                 mov     eax, [ebp-$28]
004A016B   99                     cdq
004A016C   8945E8                 mov     [ebp-$18], eax
004A016F   8955EC                 mov     [ebp-$14], edx
004A0172   8B45F0                 mov     eax, [ebp-$10]
004A0175   8B55F4                 mov     edx, [ebp-$0C]
004A0178   3B55EC                 cmp     edx, [ebp-$14]
004A017B   0F85B3000000           jnz     004A0234        ==比较
004A0181   3B45E8                 cmp     eax, [ebp-$18]
004A0184   0F85AA000000           jnz     004A0234
004A018A   6A00                   push    $00
004A018C   668B0DBC024A00         mov     cx, word ptr [$004A02BC]
004A0193   B202                   mov     dl, $02

* Possible String Reference to: '软件登记注册成功!'

注册码为:cpuid+55577*666,将49be70整个函数搬出来就可以写个注册机:

0049BE70   53                     push    ebx
0049BE71   57                     push    edi
0049BE72   89C7                   mov     edi, eax
0049BE74   B801000000             mov     eax, $00000001
0049BE79   0FA2                   cpuid
0049BE7B   AB                     stosd
0049BE7C   89D8                   mov     eax, ebx
0049BE7E   AB                     stosd
0049BE7F   89C8                   mov     eax, ecx
0049BE81   AB                     stosd
0049BE82   89D0                   mov     eax, edx
0049BE84   AB                     stosd
0049BE85   5F                     pop     edi
0049BE86   5B                     pop     ebx
0049BE87   C3                     ret

代码:
var
  Form1: TForm1;
  returnValue:array[0..3]of Dword;

implementation

{$R *.dfm}

procedure getCode;
asm
  push    ebx
  push    edi
  mov     edi, eax
  mov     eax, $00000001
  cpuid
  stosd
  mov     eax, ebx
  stosd
  mov     eax, ecx
  stosd
  mov     eax, edx
  stosd
  pop     edi
  pop     ebx
  ret
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  asm
    lea eax,returnValue
    call getCode
  end;
  Edit1.Text:=IntToStr((returnValue[0]+55577)*666);
end;

注册OK。
导出有效、无效、未知电子邮件地址时还是提示只有付费用户才能使用,
有暗桩?DeDe里看看:

004A044C   6A00                   push    $00
004A044E   668B0D64044A00         mov     cx, word ptr [$004A0464]
004A0455   B202                   mov     dl, $02

* Possible String Reference to: '付费注册用户才能保存电邮'
|
004A0457   B870044A00             mov     eax, $004A0470

|
004A045C   E82FE6FAFF             call    0044EA90
004A0461   C3                     ret

晕,软件本身不是完整版。
再看看另外几个导出电子邮件地址的函数:
004A0497   8BD8                   mov     ebx, eax
004A0499   33C0                   xor     eax, eax
004A049B   55                     push    ebp
004A049C   68AB054A00             push    $004A05AB

***** TRY
|
004A04A1   64FF30                 push    dword ptr fs:[eax]
004A04A4   648920                 mov     fs:[eax], esp

* Reference to control ComboBox2 : N.A.
|
004A04A7   8B8314050000           mov     eax, [ebx+$0514]
004A04AD   83780C09               cmp     dword ptr [eax+$0C], +$09
004A04B1   741A                   jz      004A04CD
004A04B3   6A00                   push    $00
004A04B5   668B0DB8054A00         mov     cx, word ptr [$004A05B8]
004A04BC   B202                   mov     dl, $02

* Possible String Reference to: '付费注册用户才能保存电邮'
...

所在函数为N26Click,是有功能的,用于导出无法解析域名的电邮地址,N33Click,N34Click,N35Click也一样。
注册机注册后这些有功能的函数都能正确使用,不提示'付费注册用户才能保存电邮'。
而导出有效、无效电邮地址本身没有实现功能的代码,只是出个对话框,开发者没有发布完整版。so,要DIY一下。
导出的工作流程,在校验结果StringGrid中第3列是校验状态,根据状态字串的比较而进行导出。
所以我们可以利用原有功能加入新功能,改造其中一个有功能的导出电邮地址函数就可以实现。
只需把字串比较部分改改即可。

N33Click的代码:
004ACCDC   55                     push    ebp
004ACCDD   8BEC                   mov     ebp, esp
004ACCDF   6A00                   push    $00
004ACCE1   6A00                   push    $00
004ACCE3   6A00                   push    $00
004ACCE5   53                     push    ebx
004ACCE6   56                     push    esi
004ACCE7   8BD8                   mov     ebx, eax
004ACCE9   33C0                   xor     eax, eax
004ACCEB   55                     push    ebp
004ACCEC   68FBCD4A00             push    $004ACDFB

***** TRY
|
004ACCF1   64FF30                 push    dword ptr fs:[eax]
004ACCF4   648920                 mov     fs:[eax], esp

* Reference to control ComboBox2 : N.A.
|
004ACCF7   8B8314050000           mov     eax, [ebx+$0514]
004ACCFD   83780C09               cmp     dword ptr [eax+$0C], +$09
004ACD01   741A                   jz      004ACD1D
004ACD03   6A00                   push    $00
004ACD05   668B0D08CE4A00         mov     cx, word ptr [$004ACE08]
004ACD0C   B202                   mov     dl, $02

* Possible String Reference to: '付费注册用户才能保存电邮'
|
004ACD0E   B814CE4A00             mov     eax, $004ACE14

|
004ACD13   E8781DFAFF             call    0044EA90
004ACD18   E9BB000000             jmp     004ACDD8
004ACD1D   A1F01B4B00             mov     eax, dword ptr [$004B1BF0]

* Reference to: controls.TControl.Refresh(TControl);
|
004ACD22   E869F2F7FF             call    0042BF90

* Reference to control SaveDialog1 : N.A.
|
004ACD27   8B834C030000           mov     eax, [ebx+$034C]
004ACD2D   8B10                   mov     edx, [eax]
004ACD2F   FF523C                 call    dword ptr [edx+$3C]
004ACD32   84C0                   test    al, al
004ACD34   0F849E000000           jz      004ACDD8
004ACD3A   BE01000000             mov     esi, $00000001
004ACD3F   8D55FC                 lea     edx, [ebp-$04]

* Reference to control SaveDialog1 : N.A.
|
004ACD42   8B834C030000           mov     eax, [ebx+$034C]

* Reference to: dialogs.TOpenDialog.GetFileName(TOpenDialog):TFileName;
|
004ACD48   E8D313FAFF             call    0044E120
004ACD4D   8B55FC                 mov     edx, [ebp-$04]
004ACD50   B8481F4B00             mov     eax, $004B1F48

* Reference to: system.@Assign(Text;Text;ShortString);
|
004ACD55   E8308DF5FF             call    00405A8A
004ACD5A   B8481F4B00             mov     eax, $004B1F48

|
004ACD5F   E86690F5FF             call    00405DCA

|
004ACD64   E8835AF5FF             call    004027EC
004ACD69   3B3518214B00           cmp     esi, [$004B2118]
004ACD6F   7F58                   jnle    004ACDC9
004ACD71   8D45F8                 lea     eax, [ebp-$08]
004ACD74   50                     push    eax
004ACD75   8BCE                   mov     ecx, esi
004ACD77   BA02000000             mov     edx, $00000002

* Reference to control StringGrid1 : N.A.
|
004ACD7C   8B83B4030000           mov     eax, [ebx+$03B4]

* Reference to: grids.TStringGrid.GetCells(TStringGrid;Integer;Integer):AnsiString;
|
004ACD82   E87D92FBFF             call    00466004
004ACD87   8B45F8                 mov     eax, [ebp-$08]

* Possible String Reference to: '无法解析域名'
|
004ACD8A   BA38CE4A00             mov     edx, $004ACE38       ==在这里动手

* Reference to: system.@LStrCmp;
|
004ACD8F   E8BC71F5FF             call    00403F50
004ACD94   752A                   jnz     004ACDC0
004ACD96   8D45F4                 lea     eax, [ebp-$0C]
004ACD99   50                     push    eax
004ACD9A   8BCE                   mov     ecx, esi
004ACD9C   33D2                   xor     edx, edx

* Reference to control StringGrid1 : N.A.
|
004ACD9E   8B83B4030000           mov     eax, [ebx+$03B4]

* Reference to: grids.TStringGrid.GetCells(TStringGrid;Integer;Integer):AnsiString;
|
004ACDA4   E85B92FBFF             call    00466004
004ACDA9   8B55F4                 mov     edx, [ebp-$0C]
004ACDAC   B8481F4B00             mov     eax, $004B1F48

* Reference to: system.@Write0Bool;
|           or: system.@Write0Long;
|           or: system.@Write0LString;
|
004ACDB1   E82274F5FF             call    004041D8

|
004ACDB6   E82092F5FF             call    00405FDB

|
004ACDBB   E82C5AF5FF             call    004027EC
004ACDC0   46                     inc     esi
004ACDC1   3B3518214B00           cmp     esi, [$004B2118]
004ACDC7   7EA8                   jle     004ACD71
004ACDC9   B8481F4B00             mov     eax, $004B1F48

* Reference to: system.@Close;
|
004ACDCE   E8BD8DF5FF             call    00405B90

|
004ACDD3   E8145AF5FF             call    004027EC
004ACDD8   33C0                   xor     eax, eax
004ACDDA   5A                     pop     edx
004ACDDB   59                     pop     ecx
004ACDDC   59                     pop     ecx
004ACDDD   648910                 mov     fs:[eax], edx

****** FINALLY
|
004ACDE0   6802CE4A00             push    $004ACE02
004ACDE5   8D45F4                 lea     eax, [ebp-$0C]
004ACDE8   BA02000000             mov     edx, $00000002

* Reference to: system.@LStrArrayClr;
|
004ACDED   E8F26DF5FF             call    00403BE4
004ACDF2   8D45FC                 lea     eax, [ebp-$04]

* Reference to: system.@LStrClr(String;String);
|
004ACDF5   E8C66DF5FF             call    00403BC0
004ACDFA   C3                     ret


* Reference to: system.@HandleFinally;
|
004ACDFB   E9D467F5FF             jmp     004035D4
004ACE00   EBE3                   jmp     004ACDE5

****** END
|
004ACE02   5E                     pop     esi
004ACE03   5B                     pop     ebx
004ACE04   8BE5                   mov     esp, ebp
004ACE06   5D                     pop     ebp
004ACE07   C3                     ret

无功能的函数:N16Click(4a0364),N25Click(4a044c),OD里测试一下分别是哪个功能:
N16Click为导出有效地址,N25CLick为导出无效地址。
原本想找块空地把上面N33Click的代码整个搬进去,但发现文件的物理空间不够,
只好用改代码的方法了。btw,PEEditor改大CODE节物理size再用LordPE rebuild pe并不会
真的扩大CODE节的物理空间。

4ACD8A处跳到patch代码中另作处理。

patch(1)
首先在数据节找个地方做标志,在点击菜单调用函数前设置,和原函数进行区分。这里用4ae0b0。

004AD93D      803D B0E04A00 01    cmp     byte ptr [4AE0B0], 1  ==导出有效列表?
004AD944      74 10               je      short 004AD956
004AD946      803D B0E04A00 02    cmp     byte ptr [4AE0B0], 2  ==导出无效列表?
004AD94D      74 0E               je      short 004AD95D
004AD94F      BA 38CE4A00         mov     edx, 004ACE38   ==原函数所用字串
004AD954      EB 0C               jmp     short 004AD962
004AD956      BA 6BD94A00         mov     edx, 004AD96B   =='邮件地址正确'(有效)
004AD95B      EB 05               jmp     short 004AD962
004AD95D      BA 7DD94A00         mov     edx, 004AD97D   =='邮件地址错误'(无效)
004AD962    ^ E9 28F4FFFF         jmp     004ACD8F
004AD967      0C 00               or      al, 0             ==由于接下来调用LStrCmp函数进行比较,参数要求为string,所以要构造string型的字串
004AD969      0000                add     byte ptr [eax], al==即字串前1Dword声明字串长度。否则LStrCmp比较结果不正确。
004AD96B      D3CA                ror     edx, cl
004AD96D      BC FEB5D8D6         mov     esp, D6D8B5FE
004AD972      B7 D5               mov     bh, 0D5
004AD974      FD                  std
004AD975      C8 B70000           enter   0B7, 0
004AD979      0C 00               or      al, 0
004AD97B      0000                add     byte ptr [eax], al
004AD97D      D3CA                ror     edx, cl
004AD97F      BC FEB5D8D6         mov     esp, D6D8B5FE
004AD984      B7 B4               mov     bh, 0B4
004AD986      ED                  in      eax, dx
004AD987      CE                  into
004AD988      F3:                 prefix rep:

80 3D B0 E0 4A 00 01 74 10 80 3D B0 E0 4A 00 02 74 0E BA 38 CE 4A 00 EB 0C BA 6B D9 4A 00 EB 05
BA 7D D9 4A 00 E9 28 F4 FF FF 0C 00 00 00 D3 CA BC FE B5 D8 D6 B7 D5 FD C8 B7 00 00 0C 00 00 00
D3 CA BC FE B5 D8 D6 B7 B4 ED CE F3
偏移:4ad93d-400000-c00(地址所在节VA-RA)=acd3d

patch(2)

004ACD8A    BA 38CE4A00              MOV EDX,emailver.004ACE38
改为:
004ACD8A   /E9 AE0B0000              JMP 004AD93D
偏移:4acd8a-400000-c00=ac18a

patch(3)

N16Click代码patch:
004A0364    C605 B0E04A00 01         MOV BYTE PTR DS:[4AE0B0],1
004A036B    E8 6CC90000              CALL emailver.004ACCDC
004A0370    C605 B0E04A00 00         MOV BYTE PTR DS:[4AE0B0],0
004A0377    90                       NOP
004A0378    90                       NOP
004A0379    C3                       RETN

C6 05 B0 E0 4A 00 01 E8 6C C9 00 00 C6 05 B0 E0 4A 00 00 90 90 C3
偏移:9f764

patch(4)

N25Click代码patch:
004A044C    C605 B0E04A00 02         MOV BYTE PTR DS:[4AE0B0],2
004A0453    E8 84C80000              CALL emailver.004ACCDC
004A0458    C605 B0E04A00 00         MOV BYTE PTR DS:[4AE0B0],0
004A045F    90                       NOP
004A0460    90                       NOP
004A0461    C3                       RETN

C6 05 B0 E0 4A 00 02 E8 84 C8 00 00 C6 05 B0 E0 4A 00 00 90 90 C3
偏移:9f84c

十六进制工具编辑一下,运行测试OK,完工。软件很旧,估计发上来让有兴趣的兄弟玩玩也无防?

下载链接:http://www.unpack.cn/attachment.php?aid=13939

上一篇   下一篇