一.追注册码步骤解析

  • 打开OllyDbg反汇编软件,对实验程序TraceMe.exe进行反汇编。
  • 点击View-Executable modules查看可执行模块,在新窗口中右击,选择Show names in all modules查看名称信息。
  • 输入Ctrl+F,搜索关键字:DispatchMessageW,该部分对应WM_LBUTTONDOWN消息断点,在该行右键选择Conditional breakpoint条件断点,输入条件为: [[esp+4]+4] == 0x201,这是因为Windows的msg参数WM_LBUTTONDOWN = 0x201。
  • 点击调试运行(F9),此时TraceMe 动态分析技术注册对话框打开,点击用户名输入文本框,此时断点使程序暂停,再点击F9,在用户名输入框中输入姓名testname以及任意错误的序列号xuliehao,最后点击Check按钮完毕。
  • 点击按钮M(Open Memory map window(Alt+M)),打开内存窗口,在代码段入口处地址0x00401000处右键,Set break-on-access(F2)下断点,F9运行,程序停在地址0x004010D0处。
  • 打开另一静态反编译软件IDAPro6.6,利用其打开TraceMe.exe,点击空格键切换到图形视图,点击G跳转到指定地址,输入代码段入口地址:4010d0,查看其对应指令为sub esp, 0F4h,与OllyDbg中的反编译结果一致。
  • 回到OllyDbg中,在地址0x004010D0处右键,Breakpoint - Toggle,下单步断点进行调试。观察右下角参数值信息如下:

    F9单步执行,直至参数信息变为如下:

    wParam的值变为MENU/BN_CLICKED,表示按钮已经被点击。

  • 转至IDAPro6.6对执行代码块进行访问追踪,点击Set note coler对代码块涂色,跟踪红线False分支到达如下代码块:

    点击空格切换代码视图,观察到该代码块的地址为0x0040119C,将其复制下来。

  • 在OllyDbg中右键Go to - Expression(Ctrl+G),转到地址0x0040119C,下断点,运行F9。
  • 在IDAPro6.6中,观察刚才的代码块,有一句函数调用:call edi ; GetDlgItemTextA。还有一条语句push eax ;lpString,往上查看,有一句lea eax, [esp+100h+String]和push eax,可断定此即为输入的用户名的字符串;有一条语句push ecx ;lpSring,往上查看,有一句lea ecx, [esp+100h+String1]和push ecs,可断定此即为输入的序列号。
  • 在OllyDbg中,运行Step over(F8),直至运行到语句LEA ECX, [LOCAL.24]处。右键点击语句LEA EAX, [LOCAL.44],Follow in Dump - Memory address,跟踪EAX存储器的地址内容,在ASCII信息中可观察到之前输入的用户名testname。继续F8执行至CALL EDI语句,然后右键LEA ECX, [LOCAL.24]语句,Follow in Dump - Memory address,跟踪ECX存储器的地址内容,在ASCII信息中可观察到之前输入的序列号内容xuliehao。
  • 返回IDAPro6.6中,继续在刚才的代码块中往下跟踪红线False分支。来到关键函数调用处 call sub_401340。双击该语句,转移到新的图形视图,查看其函数调用,其中包含call ds: wsprintfA 和 call ds: lstrcmpA,点击后者,查看其内存地址为0x0040138F,复制。
  • 返回到OllyDbg,跳转到地址0X0040138F,F2下断点,F9运行,此时查看参数信息,如下:

    表示用户名testname对应的正确序列号为9952。
  • 退出OllyDbg,运行程序TraceMe.exe,输入用户名testname,序列号9952,显示结果正确.

二.注册机编写

  • 在IDAPro6.6中,追踪DialogFunc函数,找到关键注册码计算模块函数调用部分如下:

    关键调用语句为 call sub_401340,双击代码跟踪,并空格切换代码视图,得到程序的注册码计算部分如下(OD截图):
  • 尝试对该汇编代码部分进行注释:
00401340  /$  55            push ebp
00401341  |.  8B6C24 0C     mov ebp,dword ptr ss:[esp+0xC]          ;ebp = 用户名
00401345  |.  56            push esi                                 ;  TraceMe.0040504F
00401346  |.  57            push edi
00401347  |.  8B7C24 18     mov edi,dword ptr ss:[esp+0x18]         ;edi = 用户名的长度
0040134B  |.  B9 03000000   mov ecx,0x3 ;ecx = 从用户名的第四个字符开始计算
00401350  |.  33F6          xor esi,esi     ;esi = 0 = 计算出的注册码                             ;  TraceMe.0040504F
00401352  |.  33C0          xor eax,eax     ;eax = 0,用于计数,读取数据表的第eax个字节
00401354  |.  3BF9          cmp edi,ecx     ;if(edi > ecx)
00401356  |.  7E 21         jle short   ;{ TraceMe.00401379
00401358  |.  53            push ebx
00401359  |>  83F8 07       /cmp eax,0x7    ; if(eax > 7)
0040135C  |.  7E 02         |jle short TraceMe.00401360
0040135E  |.  33C0          |xor eax,eax    ;{eax = 0;}
00401360  |>  33D2          |xor edx,edx    ;edx = 0;
00401362  |.  33DB          |xor ebx,ebx    ;ebx = 0
00401364  |.  8A1429        |mov dl,byte ptr ds:[ecx+ebp]   ; dl = ebp + ecx = 从用户名的第四个字符开始计算
00401367  |.  8A98 30504000 |mov bl,byte ptr ds:[eax+0x405030]  ;bl = 数据表第eax个字符,数据表的内存地址为0x00405030处,查找其数值为0C 0A 13 09 0C 0B 0A 08(根据判断语句0x00401359可知,只有8个数据)
0040136D  |.  0FAFD3        |imul edx,ebx   ;edx = edx * ebx
00401370  |.  03F2          |add esi,edx    ;esi = esi + edx
00401372  |.  41            |inc ecx    ;ecx++
00401373  |.  40            |inc eax    ;eax++;
00401374  |.  3BCF          |cmp ecx,edi    ;if(ecx<edi)   如果未取完用户名字符则继续
00401376  |.^ 7C E1         \jl short   ;{goto 0x00401359} TraceMe.00401359
00401378  |.  5B            pop ebx   ;计算结束                               ;  0012FAE8
00401379  |>  56            push esi                                 ; /<%ld> = 40504F (4214863.)
0040137A  |.  68 78504000   push TraceMe.00405078                    ; |%ld
0040137F  |.  55            push ebp                                 ; |s = 0012FAAC
00401380  |.  FF15 9C404000 call dword ptr ds:[<&USER32.wsprintfA>]  ; \wsprintfA
00401386  |.  8B4424 1C     mov eax,dword ptr ss:[esp+0x1C]
0040138A  |.  83C4 0C       add esp,0xC
0040138D  |.  55            push ebp                                 ; /String2 = "?"
0040138E  |.  50            push eax                                 ; |String1 = 000003F5 ???
0040138F  |.  FF15 04404000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA
00401395  |.  F7D8          neg eax
00401397  |.  1BC0          sbb eax,eax
00401399  |.  5F            pop edi                                  ;  0012FAE8
0040139A  |.  5E            pop esi                                  ;  0012FAE8
0040139B  |.  40            inc eax
0040139C  |.  5D            pop ebp                                  ;  0012FAE8
0040139D  \.  C3            retn
  • 利用VS的内嵌汇编编写注册机,代码如下:

#include <iostream>
#include <string>using namespace std;char strTable[8] = { 0x0C, 0x0A, 0x13, 0x09, 0x0C, 0x0B, 0x0A, 0x08 };
char usrName[20] = "";       // = ebp = 用户名
int  len;                // = edi = 用户名的长度
int  code = 0;              // = esi = 保存计算出的注册号int main(int argc, char* argv[])
{cout << "***************************欢迎进入注册机****************************" << endl;cout << "请输入用户名(大于4个字符) : ";cin >> usrName;len = strlen(usrName);while (len<5){cout << "用户名必须大于4个字符 !" << endl<< "请重新输入用户名 : ";cin >> usrName;len = strlen(usrName);cout << endl;}__asm{push    ebpmov     ebp, offset usrName     // ebp = 用户名,须将原dword ptr [esp+C]改写push    esipush    edimov     edi, len             // edi = 用户名的长度mov     ecx, 3                   // ecx = 从用户名的第四个字符开始计算xor esi, esi                 // esi = 计算出的注册号xor     eax, eax                 // eax 用于计数,读取数据表中的第eax个字节cmp     edi, ecx                 // if (edi > ecx)jle     _00401379                // {          // 原short 00401379改为相应的标号push    ebx_00401359 : cmp     eax, 7                   //    if (eax > 7)jle     _00401360xor     eax, eax                 //         { eax = 0; }_00401360 : xor     edx, edx                 //    edx = 0;xor     ebx, ebx                 //    ebx = 0;mov     dl, byte ptr[ecx + ebp]   //    dl  = ebp + ecx mov     bl, byte ptr[eax + strTable] // bl  = 数据表第eax个字符imul    edx, ebx                 //    edx = edx * ebx;add     esi, edx                 //    esi = esi + edx = 计算出的注册号inc     ecx                      //    ecx++;inc     eax                      //    eax++;cmp     ecx, edi                 //    if( ecx < edi)    // 如果未取完用户名的字符则继续jl      _00401359                //        { goto 00401359; }mov     code, esi               // 保存注册号到 iCodepop     ebx                      // }                  _00401379 : pop     edipop     esipop     ebp}cout << "序列号为 : " << code << endl;return 0;
}
  • 注册机运行结果如下:

TraceMe.exe注册码破解及注册机编写相关推荐

  1. SRS_Audio_Sandbox注册码破解版+注册机+中文

    刚装了win7,发现音乐有杂音,上网搜了很多资料,无非是一些让你重装声卡驱动之类的,我就试了试,发现怎么新装都不管事,晕了...后来有篇帖子建议装上SRS,说是可以加强音效,我就抱着侥幸的心里装了,结 ...

  2. 庖丁解牛破解与注册机编写

    注册原理: 1. 机器码生成原理: 根据函数得到dwSerial,然后与一个常数0x51627384异或,结果的十六进制表示就是机器码. LPTSTR pVolumeNameBuffer = new ...

  3. 小白第一次注册机编写,c/bat/易某言(不好意思说2333)

    小白第一次注册机编写,c/bat/易某言(不好意思说出口2333) 零.视频教程 一.免责声明 二.软件相关信息 三.查壳 四.分析软件注册流程 五.IDA载入 六.OD载入 (一).找关键跳转 1. ...

  4. Syncnavigator破解版注册机

    下载网站:www.SyncNavigator.CN   客服QQ1793040 ---------------------------------------------------------- 关 ...

  5. MyEclipse Enterprise Workbench 9.0 破解及注册机 注册码

    MyEclipse 9.0的激活机制终于破解了,破解步骤比老版本要复杂一些,但是是绝对可以破解的,这个破解对主程序无任何修改,只替换公钥,如果有牛人会快速从公钥反推私钥,那就什么都不用改了,步骤如下: ...

  6. 用ollddbg 寻找注册码,keymake写注册机教程

    点击浏览该文件 用ollddbg 寻找注册码的教程 作者:夜袭来 QQ:20517896 email:loop_jspone@yahoo.com.cn 练习程序 ke_Crackme2.exe (由风 ...

  7. UltraEdit v18.0 破解版注册机

    转自:http://001.net76.net/ultraedit-v18-0.html ultraEdit是强大的文本编辑器,可以编辑文本,16进制,ASCII 码,比系统自带的记事本强大,而且好用 ...

  8. EmEditor注册码及EmEditor注册机下载

    EmEditor(官方网站:http://www.emeditor.com/)是一款日本出品的简单好用的文本编辑器,有官方中文版,对中文支持良好.EmEditor支持多种配置,自定义颜色.字体.工具栏 ...

  9. 菜鸟 学注册机编写之 “查表”

    测试环境 系统: xp sp3 调试器 :od 1.10 高手不要见笑,仅供小菜玩乐,有不对或不足的地方还请多多指教,不胜感激! 1.首先运行程序随便输入用户与注册码如下图所示: 2.载入OD通过下M ...

最新文章

  1. 计组--习题--总线
  2. Easy Problem 7 求反数字字符串
  3. 网络编程学习笔记(getsockopt和setsockopt函数)
  4. TF之TFOD-API:基于tensorflow框架利用TFOD-API脚本文件将YoloV3训练好的.ckpt模型文件转换为推理时采用的.pb文件
  5. cmw500综合测试仪使用_综合布线中手持式测试仪
  6. [Android Pro] Android 6.0 Root
  7. 解决VS2017运行时控制台一闪即逝问题的方法
  8. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
  9. 什么代码才是线程安全的
  10. 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
  11. 发明导诊机器人团队_牛!这个平均年龄21岁的团队竟然发明偏瘫康复机器人
  12. 李彦宏说吃着火锅唱着歌,奔驰你却要我命!
  13. HDU 1074 Doing Homework【状态压缩DP】
  14. asp.net 无法访问已关闭的资源集
  15. CodeMatic动软自动生成Nhibernate
  16. doesn‘t work properly without JavaScript enabled. Please enable it to continue 的原因之一
  17. 计算机量子化学计算实验报告物化实验,量子化学计算方试验.doc
  18. 计算机的基本知识理论,计算机基本理论基础知识总汇
  19. python自动进直播_Python实现自动录制虎牙直播
  20. 服务器没有显示器能接笔记本吗,笔记本能连显示器吗_笔记本能不能接显示器...

热门文章

  1. 多线程 or 多进程?
  2. dell笔记本如何关闭计算机更新,联想戴尔笔记本Win10如何彻底永久关闭更新?
  3. 射影几何----利用中心和渐进方向求渐近线的方程
  4. 判断ip地址是否在同一网段
  5. R语言 提取数据中的任意子集
  6. Database:MySQL
  7. python 表示2的n次方
  8. 《Unity Shader入门精要》笔记:基础篇(2)
  9. MySQL数据库文件
  10. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?