dp3000 发表于 2008-2-5 11:59

【转帖】对于rmclock的算法分析

^u^
【转帖自:】http://www.crack520.cn/bencandy.php?fid-7-id-599-page-1.htm
RMClock是Right Mark出品的众多小工具当中的一个,可以给CPU降频和降温,可以自动设置,也可以手动设置。

下载软件之后,查看其中的RMClock.htm,发现软件有功能限制,其中的升级模块和PRO模块需要**才能使用。

用PEID查看主程序RMClock.exe,PEID报的是ARJ Archive,误报。看看区段,估计没有壳。省去不少麻烦。
结合IDA分析,发现是MFC编译的。

用OD载入,然后在PRO模块当中随便点其中一个功能,会弹出**对话框。
输入用户名:Ptero,email:Ptero和任意**码之后,**按钮为灰色不可用。下断点GetWindwoTextA之后,不久来到这里:

0040189C/$8B51 78      mov edx,
0040189F|.33C0         xor eax, eax
004018A1|.3942 F4      cmp , eax      ; 用户名不能为空
004018A4|.74 15          je short RMClock.004018BB
004018A6|.8B51 7C      mov edx,
004018A9|.3942 F4      cmp , eax      ; email不能为空
004018AC|.74 0D          je short RMClock.004018BB
004018AE|.8B91 80000000mov edx,
004018B4|.837A F4 19   cmp dword ptr , 19    ; 注册码长度为25位
004018B8|.75 01          jnz short RMClock.004018BB
004018BA|.40             inc eax
004018BB|>50             push eax
004018BC|.6A 01          push 1
004018BE|.E8 88FF0300    call RMClock.0044184B    ; GetDlgItem
004018C3|.8BC8         mov ecx, eax
004018C5|.E8 75010400    call RMClock.00441A3F    ; EnableWindow
004018CA\.C3             ret

原来是要***长度为25位才能继续下去。

接着来到这里:

00429940|.FF75 10      push       ; 注册码
00429943|.8B10         mov edx,
00429945|.FF75 0C      push       ; email
00429948|.8BC8         mov ecx, eax
0042994A|.FF75 08      push       ; 用户名
0042994D|.FF52 10      call near     ; 进入RMCPRO.dll
00429950|.85C0         test eax, eax
00429952|.8D4D E8      lea ecx,
00429955|.0F8D A9000000jge RMClock.00429A04

call+test+jge结构,这个就是关键call了。跟进。
不一会儿来到这里:

01092509|.E8 F7FDFFFF    call RMCPRO.01092305
0109250E|.E8 7BFEFFFF    call RMCPRO.0109238E
01092513|.85C0         test eax, eax
01092515|.75 0A          jnz short RMCPRO.01092521

又是两个call+test+jnz。关键call。

第一个call,就是把用户名,email和某个特征字串做一个128位分组的加法。

    010BD06852 4D 43 50 52 4F 20 32 2E 78 78 00 00 00 00 00RMCPRO 2.xx.....    ; 特征字串

+    010BD07850 74 65 72 6F 00 00 00 00 00 00 00 00 00 00 00Ptero...........    ; 用户名
+    010BD08800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
+    010BD09800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
+    010BD0A800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................

+    010BD0B850 74 65 72 6F 00 00 00 00 00 00 00 00 00 00 00Ptero...........    ; email
+    010BD0C800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
+    010BD0D800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
+    010BD0E800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00................
-------------------------------------------------------------------------------
=    010BD118F2 35 0E 35 30 50 20 32 2E 78 78 00 00 00 00 00?50P 2.xx.....    ; 结果

下面看看第二个call做了什么:

0109238E/$55             push ebp
0109238F|.8BEC         mov ebp, esp
01092391|.83EC 14      sub esp, 14
01092394|.53             push ebx
01092395|.56             push esi
01092396|.57             push edi
01092397|.8BF9         mov edi, ecx
01092399|.6A 10          push 10
0109239B|.8D87 C8010000lea eax,
010923A1|.6A 00          push 0
010923A3|.50             push eax
010923A4|.E8 77B90000    call RMCPRO.0109DD20
010923A9|.8D87 98010000lea eax,
010923AF|.83C4 0C      add esp, 0C
010923B2|.8945 F0      mov , eax
010923B5|.BA A0360B01    mov edx, RMCPRO.010B36A0    ; 一个数组
010923BA|>8B45 F0      /mov eax,
010923BD|.0FBE00         |movsx eax, byte ptr     ; 依次取出字符串的每一位
010923C0|.8D48 D0      |lea ecx,
010923C3|.33DB         |xor ebx, ebx
010923C5|.83F9 09      |cmp ecx, 9      ; 如果是数字,OK
010923C8|.77 07          |ja short RMCPRO.010923D1
010923CA|.894D F4      |mov , ecx
010923CD|.8BC1         |mov eax, ecx
010923CF|.EB 12          |jmp short RMCPRO.010923E3
010923D1|>8D48 BF      |lea ecx,
010923D4|.83F9 19      |cmp ecx, 19      ; 如果是小写字母,Game Over
010923D7|.0F87 B5000000|ja RMCPRO.01092492
010923DD|.83E8 37      |sub eax, 37      ; 如果不是数字,也不是小写字母,就默认为是大写字母
010923E0|.8945 F4      |mov , eax
010923E3|>8D8F C8010000|lea ecx,
010923E9|.894D FC      |mov , ecx
010923EC|.8955 F8      |mov , edx
010923EF|.C745 EC 040000>|mov , 4
010923F6|.EB 03          |jmp short RMCPRO.010923FB
010923F8|>8B45 F4      |/mov eax,     ; 这个小循环,把注册码的某一位跟数组的某个数(128位)相乘,再累加
010923FB|>8B4D FC      | mov ecx,
010923FE|.8B31         ||mov esi,
01092400|.33C9         ||xor ecx, ecx
01092402|.51             ||push ecx
01092403|.50             ||push eax
01092404|.8B45 F8      ||mov eax,
01092407|.51             ||push ecx
01092408|.FF30         ||push dword ptr
0109240A|.03F3         ||add esi, ebx
0109240C|.33DB         ||xor ebx, ebx
0109240E|.E8 3DE70000    ||call RMCPRO.010A0B50
01092413|.03F0         ||add esi, eax
01092415|.8B45 FC      ||mov eax,
01092418|.13DA         ||adc ebx, edx
0109241A|.8345 F8 04   ||add , 4
0109241E|.8345 FC 04   ||add , 4
01092422|.FF4D EC      ||dec
01092425|.8930         ||mov , esi
01092427|.^ 75 CF          |\jnz short RMCPRO.010923F8
01092429|.8B55 F8      |mov edx,
0109242C|.FF45 F0      |inc
0109242F|.81FA 30380B01|cmp edx, RMCPRO.010B3830    ; 比较数组是否已经遍历
01092435|.^ 7C 83          \jl short RMCPRO.010923BA

这个循环,乍一看,是从***中依次取出每一位,跟一个数组的某个数相乘,再相加,相当于两个25维的向量点乘。
看看那个数组:

010B36A001 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00...............
010B36B024 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00$...............
010B36C010 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00..............
010B36D040 B6 00 00 00 00 00 00 00 00 00 00 00 00 00 00@?.............
010B36E000 A1 19 00 00 00 00 00 00 00 00 00 00 00 00 00.?.............
010B36F000 A4 9A 03 00 00 00 00 00 00 00 00 00 00 00 00.?............
010B370000 10 BF 81 00 00 00 00 00 00 00 00 00 00 00 00.縼............
010B371000 40 DE 3E 12 00 00 00 00 00 00 00 00 00 00 00.@?...........
010B372000 00 41 D7 90 02 00 00 00 00 00 00 00 00 00 00..A讗..........
010B373000 00 24 45 5E 5C 00 00 00 00 00 00 00 00 00 00..$E^\..........
010B374000 00 10 B9 41 FD 0C 00 00 00 00 00 00 00 00 00..笰?.........
010B375000 00 40 06 3E 9D D3 01 00 00 00 00 00 00 00 00..@>澯........
010B376000 00 00 E1 B8 1C C2 41 00 00 00 00 00 00 00 00...岣翧........
010B377000 00 00 A4 FF 09 4C 3F 09 00 00 00 00 00 00 00...?.L?........
010B378000 00 00 10 F3 67 B1 E6 4C 01 00 00 00 00 00 00...骻辨L......
010B379000 00 00 40 2E 9E F2 70 D0 2E 00 00 00 00 00 00...@.烌p?......
010B37A000 00 00 00 81 3E 1E E2 4F 95 06 00 00 00 00 00....?釵?.....
010B37B000 00 00 00 24 CA 40 CC 3B FF EC 00 00 00 00 00....$蔃?

landkid 发表于 2008-2-5 12:05

dp3000 发表于 2008-2-5 12:06

那个用户名和邮箱输入Ptero,**码输入那两个红色字符串,嘿嘿......

Drifter 发表于 2008-2-5 13:49

高手啊, 有这个功夫自己去写个类似的就更高了

cuihl 发表于 2008-2-5 14:25

Posted by Drifter on 2008-2-5 13:49 http://www.ibmnb.com/images/common/back.gif
高手啊, 有这个功夫自己去写个类似的就更高了

**相对写软件容易多了...
就像多米诺骨牌一样,堆起来麻烦,要推倒,只需要一手指头

zhigaotang 发表于 2008-2-5 15:34

其实**不难的,我以前想研究一下,结果我学弟研究了10天就都能**了,。。。就没继续下去,,不过为人民做贡献是好的,,,就送你1个nb,哈哈哈哈

zhxutao 发表于 2008-2-5 16:05

不错,现在研究反汇编的不多了,正好用rmclock,试一下,成功。
页: [1]
查看完整版本: 【转帖】对于rmclock的算法分析