Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chen Kaiming Copyright 2007

Similar presentations


Presentation on theme: "Chen Kaiming Copyright 2007"— Presentation transcript:

1 Chen Kaiming Copyright 2007
汇编插入语句 ■汇编语言编程很困难. 求两个数的和比较容易,但对于输入输出等非常困难. ■要了解处理器结构和操作系统,很复杂 ■ 汇编插入语句可以在熟悉的环境里进行. 2019/2/22 Chen Kaiming Copyright 2007

2 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

3 Chen Kaiming Copyright 2007
方法1: 直接在内存中搜索用户输入的密码 ■由于各种复杂的原因, 密码不可能会放在很容易找到的地方, 同时程序中也有非常多的字符串都很像密码串。 ■想法: 搜索原始密码很难,搜索用户输入的密码应该简单。 2019/2/22 Chen Kaiming Copyright 2007

4 Chen Kaiming Copyright 2007
方法1: 直接在内存中搜索用户输入的密码 ■工作过程:  idag 运行 程序。 输入“ KPNC Kaspersky” 转idag 调试方式, 搜索KPNC Kaspersky 字符串。可找出多个位置,分析选择可能性最大的一个。 在相应位置处004295E0中设置断点 然后重新启动idag 运行。 断点设置在检测调用语句之后的指令上。 退出匹配的进程/修正JMP指令以及…… 2019/2/22 Chen Kaiming Copyright 2007

5 Chen Kaiming Copyright 2007
输入密码的程序 for( ; ; ) { printf("Enter password: "); fgets(&buff[0] , PASSWORD_SIZE, stdin); if (strcmp( &buff[0] , PASSWORD)) // "申斥"密码不匹配 printf("Wrong password\n"); else break; if (++count>3) return -1; } 2019/2/22 Chen Kaiming Copyright 2007

6 Chen Kaiming Copyright 2007
输入密码程序的分析 ■分析: 用户提供的密码被放在 buff 缓冲区 并与参照密码比较,如果不匹配, 那么需要从用户那里再次请求提供密码. ■第二次输入前不清除 buff. 依次类推, 到达接受Wrong password 执行分支, 使用调试器, 进行搜索, 就会找到. 2019/2/22 Chen Kaiming Copyright 2007

7 Chen Kaiming Copyright 2007
实验和验证 执行 list1_p7.exe 输入密码: chenkaiming 00425A _iob dd offset _bufin 00425A "chenkaiming\n\n" 00425A38 dd offset _bufin "chenkaiming\n\n" ( 00425A38 不合题意, 舍去) 2019/2/22 Chen Kaiming Copyright 2007

8 Chen Kaiming Copyright 2007
■搜索立即数 0x00425A30 得两处: push offset _iob push h //最大密码长度 lea eax, [ebp+var_68] // 密码缓冲区指针 C push eax D call fgets add esp, 0Ch //弹出三个参数 push "myGOODpassword\n" A lea ecx, [ebp+var_68] D push ecx E call strcmp add esp, 8 test eax, eax jz short loc_401079 A push ; "Wrong password\n" F call printf 2019/2/22 Chen Kaiming Copyright 2007

9 Chen Kaiming Copyright 2007
方法2 在密码输入函数上设置断点 void CCrackme_01Dlg::OnOk() { char buff[PASSWORD_SIZE]; CEdit m_password; m_password.GetWindowTextA(&buff[0], PASSWORD_SIZE); if (strcmp(&buff[0], PASSWORD)) printf("Wrong Password"); m_password.SetSel(0,-1,0); return; } else { printf("Password OK"); } CDialog::OnOK(); } 2019/2/22 Chen Kaiming Copyright 2007

10 Chen Kaiming Copyright 2007
方法2 在密码输入函数上设置断点 void CCrackme_01Dlg::OnOk() { char buff[PASSWORD_SIZE]; CEdit m_password; m_password.GetWindowTextA(&buff[0], PASSWORD_SIZE); if (strcmp(&buff[0], PASSWORD)) printf("Wrong Password"); m_password.SetSel(0,-1,0); return; } else { printf("Password OK"); } CDialog::OnOK(); } 2019/2/22 Chen Kaiming Copyright 2007

11 Chen Kaiming Copyright 2007
方法2 在密码输入函数上设置断点解释 ■使用 ida 运行 上面程序并输入 kpnc++后跟踪程序(反汇编器能识别系统函数) GetWindowText text:77E1A4E2 push ebp text:77E1A4E3 mov ebp, esp text:77E1A4E5 push ff text:77E1A4E7 push 77E1A570 text:77E1A4EC ………… ■注意GetWindowText 的参数压栈顺序, 显示 ebp+8 内容: 2019/2/22 Chen Kaiming Copyright 2007

12 Chen Kaiming Copyright 2007
0023:0012F9FC ………………………………………. 0023:0012FA0C ………………………………………. 0023:0012FA1C ………………………………………. GetWindowText ( HWND hwnd; /*文本窗口或者控件句柄*/ LPTSTR lpString; /*文本缓冲区地址 */ int nMaxCount; /*欲拷贝的最大字符数 */ ); 解释 ebp+8 的意义. 2019/2/22 Chen Kaiming Copyright 2007

13 Chen Kaiming Copyright 2007
子程序 mov ebp,esp 自由空间 返回地址 hWnd lpString nMaxCount 父函数堆栈 ebp 栈顶指针 ebp+4 ebp+8 字符串缓冲区 ebp+0c ebp+10 2019/2/22 Chen Kaiming Copyright 2007

14 Chen Kaiming Copyright 2007
■推出函数接受输入的函数: (ebp+8) = 0012F9FC 0023:0012F9FC kpnc++ ……………………………………………. ■在此处设置断点, 再从头执行, 就可以到你要去的程序代码段. 2019/2/22 Chen Kaiming Copyright 2007

15 Chen Kaiming Copyright 2007
方法3 针对消息设置代码段 ■利用消息获取编辑窗口文本. ■代替 GetWindowText() 的 SendMessageA(hWnd, WM_GETTEXT,(LPARAM)&buff[0]) 将使 GetWindowTextA(GetDlgItemTextA)函数处的断点失效。 ■在 WM_GETTEXT消息处设置断点 2019/2/22 Chen Kaiming Copyright 2007

16 Chen Kaiming Copyright 2007
方法3 针对消息设置代码段 ■利用消息断点   在处理字串方面可以利用消息断点WM_GETTEXT和WM_COMMAND。前者用来读取某个控件中的文本,比如拷贝编辑窗口中的序列号到程序提供的一个缓冲区里;后者则是用来通知某个控件的父窗口的,比如当输入序列号之后点击OK按钮,则该按钮的父窗口将收到一个WM_COMMAND消息,以表明该按钮被点击。 ■  BP xxxx WM_GETTEXT (拦截序列号) ■  BP xxxx WM_COMMAND (拦截OK按钮)    2019/2/22 Chen Kaiming Copyright 2007

17 Chen Kaiming Copyright 2007
消息原型 Handle Class WinPorc TID Dialog 6c291b Dc Button 6c291b81 2Dc Edit 6c291b81 2Dc Static 6c291b81 2Dc LRESULT CALLBACK WindowProc ( HWND hwnd; // 窗口句柄 UNIT uMsg; // 消息标识符 WPARAM wParam; // 第一个消息参数 LPARAM lParam // 字符串长度 ); 2019/2/22 Chen Kaiming Copyright 2007

18 Chen Kaiming Copyright 2007
消息原型 ■ HWND hWnd : 事件引起消息发生的那个窗口。 UINT message: 消息的ID,它是32位值,指明了消息类型。WPARAM wParam : 32位值,包含附加信息,决定于消息的种类。例如键盘的哪个键代码。LPARAM lParam: 32位值,同上。例如,前16位=重复数,              接着8位:扫描码(决定于厂家)                      第24位:为1时表示扩展键。                      第25到28位:保留区                      第29位为1时=alt按下,否则为0。                      第30位为1时=消息前按下,否则为0。                      第31位为1时=正在被释放,否则为0。 ■当用户按下一个键时。那是什么键,由这最后两个变量来说明。 2019/2/22 Chen Kaiming Copyright 2007

19 Chen Kaiming Copyright 2007
设置断点 在调试器中设置: bpx 6c291b81 if (ebp->8) == WM_GETTEXT 退出调试器,运行输入密码比如“Hello”回车,则出现: Break due to BPX #0008:6C291B81 if( (esp8)==0xD) 因wparam为最大字符数,所以密码存放在 lparam中。 2019/2/22 Chen Kaiming Copyright 2007

20 Chen Kaiming Copyright 2007
自由空间 返回地址 hWnd uMsg wParam lparam ebp 栈顶指针 ebp+4 ebp+8 ebp+0c 字符串缓冲区 ebp+10 2019/2/22 Chen Kaiming Copyright 2007

21 Chen Kaiming Copyright 2007
运行结果 :d: *(esp+10) 0023:0012EB c 6c 6f 00 f5…… hello…… 0023:0012EB28 1C ED …… 0023:0012EB D …… 0023:0012EB CC CC …… :p ret :bpm 23:12EB28 2019/2/22 Chen Kaiming Copyright 2007

22 Chen Kaiming Copyright 2007
实际破解范例 破解 Winrar 某一个试用版本: 令人恼火的试用40天. 学习 API 窥测器的使用方法. 2019/2/22 Chen Kaiming Copyright 2007

23 Chen Kaiming Copyright 2007
抑制干扰屏的出现 每种对话框都是用某个API函数来显示的. 俘获显示干扰屏的 API 函数, 就有可能反汇编调用该函数的保护代码. CreateDialog , DialogBox, MessageBox 等都是与对话框相关的. 应该是那一个? 2019/2/22 Chen Kaiming Copyright 2007

24 Chen Kaiming Copyright 2007
API窥测器程序 Kerberos 是一种常用的窥测器过滤器. 配置过滤器 ke_spy.txt文件. 去除 TisGetValue, DefWindowProcA, DispatchMessageA, GetFocus, GetMessageA, SendMessageA, SendMessageW, TranslateAcceleratorA, TranslateAcceleratorW, TranslateMessage等. 在函数前面加”;”. 注释掉一个函数. 提升过滤性能, 单击Options选项, 设置 Report only .exe calls 复选框, 使得程序仅报告从Winrar.exe发出的API调用, 而不收集从Dlls 中收集的调用. 单击 Browse按钮, 指定Winrar.exe文件,点击inject按钮,等待干扰屏的出现后退出Winrar, 查看Winrar.rep文件. 2019/2/22 Chen Kaiming Copyright 2007

25 Chen Kaiming Copyright 2007
考察Winrar.rep文件 从文件结尾处入手, 找到显示”REMINDER”对话框,它是创建干扰屏的函数 . 2019/2/22 Chen Kaiming Copyright 2007

26 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

27 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

28 Chen Kaiming Copyright 2007
代码分析 D440F46: cmp eax, 28h D440F49: jg short loc_440F4F 如果 eax > 28h (40, 试用期的天数) 就执行 0440F6E 处的 DialogBoxParamA 函数 显示 干扰屏. 结论: dword_004B43CB 保存程序安装以来所经历的天数. 2019/2/22 Chen Kaiming Copyright 2007

29 Chen Kaiming Copyright 2007
代码修改 修改1:用 XOR eax, eax ; NOP 替换 cmp eax, 28h 运行结果: 不管eax 为何值, eax寄存器的值总是 0. 修改工具: 启动hiew, 装入 winrar.exe 转到 cmp 的 地址: .440F46 ---表示地址,而不是偏移量 用 33 C 替换 83 F8 28 保存修改, 再运行 winrar.exe 修改2: 用mov eax, 6(B8,06,00,00,00) 代替 mov eax, dword_004B43C8(A1, C8,43,4B,00) 修改3: jmp short loc_440F73(EB,28) 代替jg short loc_440F4F(7F 04) 2019/2/22 Chen Kaiming Copyright 2007

30 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

31 Chen Kaiming Copyright 2007
强行注册分析 注册通过 一个含有数字签名的密钥文件来实现. 不一定非要密钥 才能注册, 只要成功设置注册标志即可. byte_495A60 : 提示对话框出现时给1值. 是控制对话框是否已显示的 信号开关. Dword_4B3A90: 见下图, 有很多应用但基本上都是加1,减1 Byte_4B7E00: 3个交叉引用, 2个位于 DoDragDrop附近 Byte_49F9BC: 读写操作很多. 所有写入值要么经过sub_40DB5C返回, 要么经过sub_44A278返回. 还有: mov byte_49F9BC, 0 2019/2/22 Chen Kaiming Copyright 2007

32 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

33 Chen Kaiming Copyright 2007
深入分析sub_44A278 函数 可以看到程序中有多处出现了rarkey 字符串. 应该可以猜测到该函数是 注册 函数. 将该函数命名为 DoRegister 2019/2/22 Chen Kaiming Copyright 2007

34 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

35 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

36 Chen Kaiming Copyright 2007
深入分析sub_40DB5C 函数 从DoRegister 函数的前面几行代码可以看到: 若sub_40DB5C 函数返回零值, DoRegister 继续注册. 若sub_40DB5C 函数返回非零值, 那么DoRegister立即从DoRegister 函数退出. 结论: sub_40DB5C 函数返回的是注册状态. 因此可以改名为 IsRegistered. 修改 IsRegistered 总是返回 非 零值. 在该函数末尾: XOR eax, eax, INC eax, retn 4. 启动winrar.exe 评估版消失! 但Registered to 有! 2019/2/22 Chen Kaiming Copyright 2007

37 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

38 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

39 Chen Kaiming Copyright 2007
彻底破解About 对话框 根据Registered to寻找在程序中出现的位置(50DB4Ah). 启动 kerberos API窥测器, 加载 winrar.exe, 打开”About WinRAR” 对话框, 然后关闭winrar.exe , 查看kerberos 日志文件, winrar.rep , 在文件末尾有 DialogBoxParamA(400000, :”ABOUTRARDLG”, AA, , ) 3. sub_ 是一个窗口过程, 负责显示对话框. 其中含有很多SetDlgItem TextA 调用, 怎样 深入分析 ? 2019/2/22 Chen Kaiming Copyright 2007

40 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

41 Chen Kaiming Copyright 2007
彻底破解About 对话框 4. 启动Microsoft-VS资源编辑器, 选择open file命令, 在文件类型字段指定所有文件”All files”; open as 字段 选择”Resources” 选项. 在资源树结构中,选择”Dialogs” 分支, 找到”ABOUTRARDLG”, 双击启动资源编辑器, 找到”40 days trail copy” 字符串, 若已注册,则被换成”Registered to” 字符串. 标识为 102(0x66) 2019/2/22 Chen Kaiming Copyright 2007

42 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

43 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

44 Chen Kaiming Copyright 2007
彻底破解About 对话框 1. sub_4113DC 经过被仔细分析的结论是从密钥文件里取注册的用户名. 打开winrar.exe文件, 按F6 键打开对象表, .data段后面紧跟.tls 段, 将光标移动到.data 里没有内容的空闲区域, 比如49D7B0h, 按F3键切换到编辑修改模式, 写入字符串 Registered version hacked by student. 保存后下一步 将光标移动到004447E6处, 用 mov eax, 49D7B0h 替换 call sub_4113DC 后 保存推出. 2019/2/22 Chen Kaiming Copyright 2007

45 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007

46 Chen Kaiming Copyright 2007
2019/2/22 Chen Kaiming Copyright 2007


Download ppt "Chen Kaiming Copyright 2007"

Similar presentations


Ads by Google