登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 182|回复: 0

Win32汇编学习笔记05.补课

[复制链接]

42

主题

-7

回帖

48

积分

网站编辑

积分
48
发表于 2024-12-26 22:13:55 | 显示全部楼层 |阅读模式

定位关键点3种方法: 过程函数 api 字符串

但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的

窗口程序看控件信息

1.通过OD去看

img

还可以用 spy ++ 查看

img

还可以用vs2019 ,打开软件,找到对应控件直接看属性

img

一般拿句柄没用,因为按钮是响应 WM_COMMAND 消息,因此需要知道控件id

可以修改控件属性的软件: eXeScope Restorato

OD 没有查看资源的功能

OD没有通过控件ID下断点功能 ,可在在 WM_COMMAND 消息 下条件断点

COM注册机

  1. 第一件事情就是定位关键点

关键点一般还是看它弹得什么窗扣,然后通过窗口上的字符串取OD查找字符串,找到字符串后下断点,运行程序,看看有没有断下来

  1. 寻找关键分支

找到关键点后,找到函数开头,然后看一下所有条件跳转,因为肯定存在校验后的失败和成功跳转,在所有跳转下断点后,重新运行软件,看看失败后执行那些分支执行了跳转,没执行的 就说明不是

  1. 查看关键分支最近的 call ,因此这个 调用校验算法 一般是通过调用函数 实现的

可以通过删除该段代码,看看程序是否提示失败,如果没有就说明该出是调用校验算法,验证完就撤销修改

  1. 校验算法一般移位和算术运算用的很多

找到关键代码复制出来,然后去分析算法,分析算法主中函数的功能传入和传出,即参数和返回值,猜出其大概作用,然后用自己的代码去替换

xor     esi, esi
  mov     dword ptr [esp+20], esi
L002:
  mov     ebp, dword ptr [463E48]
  or      ecx, FFFFFFFF
  mov     edi, ebp
  xor     eax, eax
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, esi
  xor     edx, edx
  mov     edi, ebp
  div     ecx
  mov     ecx, dword ptr [esp+14]
  mov     eax, esi
  movsx   ebx, byte ptr [edx+ebp]
  xor     edx, edx
  div     ecx
  movsx   eax, byte ptr [edx+469968]
  lea     edx, dword ptr [eax+eax*2]
  lea     eax, dword ptr [eax+edx*4]
  mov     edx, esi
  imul    edx, esi
  imul    edx, esi
  imul    edx, ecx
  add     ebx, eax
  or      ecx, FFFFFFFF
  xor     eax, eax
  add     ebx, edx
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, ebx
  xor     edx, edx
  div     ecx
  lea     ecx, dword ptr [esp+10]
  mov     al, byte ptr [edx+ebp]
  push    eax
  call    0042F29A
  test    esi, esi
  je L050
  mov     eax, esi
  xor     edx, edx
  mov     ecx, 3
  div     ecx
  test    edx, edx
  jnz L050
  push    004640F8
  lea     ecx, dword ptr [esp+14]
  call    0042F273
L050:
  inc     esi
  cmp     esi, 9
  jb L002

image.png

说明存在一个全局的字符传 "0123456789"

image.png

这几个寄存器是直接赋值,所以没有保存什么特殊的值,分析时可以不用管

跟我们输入字符串长度一样,所以猜测可能会是字符串长度

image.png

image.png

有点像是取字符串

image.png

取用户名

image.png

观察call执行前后的变化,发现他在拼接字符

image.png

观察此处 call 发现他在拼接 '-'

image.png

把执行后的结果拿去测试,看看是否成功没,如果成功后面就不需要看了,说明上面就是生成注册码的算法

.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

include Register.inc

.data 
    g_szUserName db 128 dup(0)


    g_szNumber  db "0123456789", 0       ;常量字符串
    g_szSerNumb db "6769-", 32 dup(0)    ;注册码
    g_ch        db 2 dup(0)              ;拼接的字符
    g_szGang    db "-", 0                ;拼接的字符
    g_dwCnt     dd 0                     ;用户名长度
.code

start:

    invoke GetModuleHandle,NULL
    mov     hInstance,eax

    invoke InitCommonControls
    invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
    invoke ExitProcess,0

;########################################################################


Make proc uses esi ecx edi ebx  hWin:HWND 
    LOCAL @dwCnt:DWORD

  invoke GetDlgItemText, hWin, EDT_USERNAME, offset g_szUserName, size g_szUserName

  mov g_dwCnt, eax   ;将字符串长度给 g_dwCnt

  ;算法解析开始
  push ebp     ;因为改变了 edp,所以需要先入栈

  xor     esi, esi
L002:
  lea     ebp, g_szNumber   ;获取字符串地址
  or      ecx, 0FFFFFFFFh
  mov     edi, ebp
  xor     eax, eax
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, esi
  xor     edx, edx
  mov     edi, ebp
  div     ecx
  mov     ecx, g_dwCnt    ;这里换全局变量是因为 ebp的值发生了改变
  mov     eax, esi
  movsx   ebx, byte ptr [edx+ebp]
  xor     edx, edx
  div     ecx
  movsx   eax, byte ptr [edx + offset g_szUserName]
  lea     edx, dword ptr [eax+eax*2]
  lea     eax, dword ptr [eax+edx*4]
  mov     edx, esi
  imul    edx, esi
  imul    edx, esi
  imul    edx, ecx
  add     ebx, eax
  or      ecx, 0FFFFFFFFh
  xor     eax, eax
  add     ebx, edx
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, ebx
  xor     edx, edx
  div     ecx
  mov     al, byte ptr [edx+ebp]
  mov     g_ch,al                                       ;将 al转成字符串
  invoke crt_strcat, offset g_szSerNumb, offset g_ch    ;字符拼接
  test    esi, esi
  je L050
  mov     eax, esi
  xor     edx, edx
  mov     ecx, 3
  div     ecx
  test    edx, edx
  jnz L050
  invoke crt_strcat, offset g_szSerNumb, offset g_szGang  ;拼接字符串
L050:
  inc     esi
  cmp     esi, 9
  jb L002
  pop ebp    ;出栈

    ;显示到界面
    invoke SetDlgItemText,hWin, EDT_SERNUMBER, offset g_szSerNumb

    ret

Make endp


DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    mov     eax,uMsg
    .if eax==WM_INITDIALOG

    .elseif eax==WM_COMMAND
        mov eax, wParam
        .if ax == BTN_MAKE
            invoke Make, hWin
        .endif

    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov     eax,FALSE
        ret
    .endif
    mov     eax,TRUE
    ret

DlgProc endp

end start

注册成功删除 注册表重新注册 搜索 4Developers

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-1-19 02:34 , Processed in 0.066770 second(s), 27 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表