Otoboku 发表于 2021-1-11 22:30

160个CM之 002

以后要有什么核心代码,不可告人的秘密,我一定用vb6来写.{:1_909:}

# 起手

- PEID扫描是vb程序,没有壳

- VB.Decompiler打开看看先给出很多信息,主要代码在click事件中



# 追注册码

爆破就跳过吧.

对于,VB.Decompiler这个软件的反汇编真是又爱又恨,伪代码降低阅读的难度,当然错误也不少,比如这种代码是不可能对的.所以还是打开对照着aid慢慢看.

```
loc_004024C1: var_18 = Serial.Text
loc_004024DE: call var_C0(Me, Me)
loc_004024F4: var_1C = Serial.Text
loc_00402530: var_20 = "AKA-" & var_1C
loc_0040254A: esi = (var_18 = var_20) + 1
loc_0040258B: If (var_18 = var_20) + 1 = 0 Then GoTo loc_004025E5
loc_004025AB: var_34 = "You Get It" & "vbCrLf" & "KeyGen It Now"
```

- 从代码风格上来看,作者肯定没有进行变量声明,导致代码中大量的VARIANT类型数据,内存处理函数一大堆,极大地增加了阅读难度.

```
.text:004023D2
.text:004023D2 loc_4023D2:
.text:004023D2 push    esi
.text:004023D3 call    dword ptr
.text:004023D9 lea   edx,
.text:004023DC push    eax
.text:004023DD push    edx
.text:004023DE call    ds:__vbaObjSet
.text:004023E4 mov   ebx, eax
.text:004023E6 lea   ecx,
.text:004023E9 push    ecx
.text:004023EA push    ebx
.text:004023EB mov   eax,
.text:004023ED call    dword ptr ; 读文本框字符到ebp-1ch中
.text:004023F3 cmp   eax, edi
.text:004023F5 jge   short loc_402409


.text:00402409
.text:00402409 loc_402409:
.text:00402409 mov   edx,
.text:0040240F mov   eax,
.text:00402412 push    eax
.text:00402413 mov   ebx,
.text:00402415 call    ds:__vbaLenBstr
.text:0040241B mov   edi, eax
.text:0040241D mov   ecx,
.text:00402420 imul    edi, 17CFBh   ; 取出Name的长度 x 97531
.text:00402426 push    ecx
.text:00402427 jo      loc_4026BE


.text:0040242D call    ds:rtcAnsiValueBstr
.text:00402433 movsx   edx, ax
.text:00402436 add   edi, edx      ; 和Name的第一个字符Ascii相加
.text:00402438 jo      loc_4026BE

.text:0040243E push    edi
.text:0040243F call    ds:__vbaStrI4   ; 变成字符串
.text:00402445 mov   edx, eax
.text:00402447 lea   ecx,
.text:0040244A call    ds:__vbaStrMove
.text:00402450 mov   edi, ; 隐藏文本框对象指针
.text:00402456 push    eax
.text:00402457 push    edi
.text:00402458 call    dword ptr ; 保存在一个影藏的文本框中
.text:0040245E test    eax, eax
.text:00402460 jge   short loc_402474


.text:004024DD
.text:004024DD loc_4024DD:
.text:004024DD push    esi
.text:004024DE call    dword ptr
.text:004024E4 push    eax
.text:004024E5 lea   eax,
.text:004024E8 push    eax
.text:004024E9 call    ebx ; __vbaObjSet
.text:004024EB mov   esi, eax
.text:004024ED lea   edx,
.text:004024F0 push    edx
.text:004024F1 push    esi
.text:004024F2 mov   ecx,
.text:004024F4 call    dword ptr ; 吧算好的注册码拿出来
.text:004024FA test    eax, eax
.text:004024FC jge   short loc_402510


.text:00402510
.text:00402510 loc_402510:
.text:00402510 mov   eax,
.text:00402513 mov   ecx,
.text:00402516 mov   edi, ds:__vbaStrCat
.text:0040251C push    eax
.text:0040251D push    offset aAka   ; "AKA-"
.text:00402522 push    ecx             ; 和AKA组合
.text:00402523 call    edi ; __vbaStrCat
.text:00402525 mov   ebx, ds:__vbaStrMove
.text:0040252B mov   edx, eax
.text:0040252D lea   ecx,
.text:00402530 call    ebx ; __vbaStrMove
.text:00402532 push    eax
.text:00402533 call    ds:__vbaStrCmp; 对比,注册码
.text:00402539 mov   esi, eax
.text:0040253B lea   edx,
```

## 注册机

很简单,追算法可一点不简单.

```
Function Regcode(userName As String) As String
   Regcode = "AKA-" & (Len(userName) * 97531 + Asc(userName))
End Function
```



# 总结

看来VB程序还真是安全呢,一个简单的程序就能把人累到半死,特别是中间部分(我怀疑是作者故意的),放入文本框,一顿乱搞后在从文本框把字符串再拿出来......变成汇编就是下边这种样子:追码的人可以说是瞬间蒙圈,贴出来大家欣赏下

```
.text:00402474
.text:00402474 loc_402474:
.text:00402474 lea   eax,
.text:00402477 lea   ecx,
.text:0040247A push    eax
.text:0040247B lea   edx,
.text:0040247E push    ecx
.text:0040247F push    edx
.text:00402480 push    3
.text:00402482 call    ds:__vbaFreeStrList
.text:00402488 add   esp, 10h
.text:0040248B lea   eax,
.text:0040248E lea   ecx,
.text:00402491 lea   edx,
.text:00402494 push    eax
.text:00402495 push    ecx
.text:00402496 push    edx
.text:00402497 push    3
.text:00402499 call    ds:__vbaFreeObjList
.text:0040249F mov   eax,
.text:004024A1 add   esp, 10h
.text:004024A4 push    esi
.text:004024A5 call    dword ptr
.text:004024AB mov   ebx, ds:__vbaObjSet
.text:004024B1 push    eax
.text:004024B2 lea   eax,
.text:004024B5 push    eax
.text:004024B6 call    ebx ; __vbaObjSet
.text:004024B8 mov   edi, eax
.text:004024BA lea   edx,
.text:004024BD push    edx
.text:004024BE push    edi
.text:004024BF mov   ecx,
.text:004024C1 call    dword ptr
.text:004024C7 test    eax, eax
.text:004024C9 jge   short loc_4024DD
```



# 疑问

有人知道怎么强制调整ida的栈帧大小么?比如把下边这个栈帧调整成300.

原因很简单,不是所有的程序块都是完整的sub,有的可能是一个loc,ida根本不会自动建立栈帧,也就没法命名局部变量了.

```
-00000274 ; D/A/*   : change type (data/ascii/array)
-00000274 ; N       : rename
-00000274 ; U       : undefine
-00000274 ; Use data definition commands to create local variables and function arguments.
-00000274 ; Two special fields " r" and " s" represent return address and saved registers.
-00000274 ; Frame size: 274; Saved regs: 4; Purge: 8
-00000274 ;
-00000274
-00000274               db ? ; undefined
-00000273               db ? ; undefined
-00000272               db ? ; undefined
-00000271               db ? ; undefined
-00000270               db ? ; undefined
-0000026F               db ? ; undefined
-0000026E               db ? ; undefined
-0000026D               db ? ; undefined
-0000026C               db ? ; undefined
-0000026B               db ? ; undefined
-0000026A               db ? ; undefined
```

bdrdc 发表于 2021-1-11 23:04

这个不错,好好研究研究.......

xuanmo 发表于 2021-1-12 10:15

有用噢,,,

『Lin°』 发表于 2021-1-13 01:02

一定用vb6来写
页: [1]
查看完整版本: 160个CM之 002