目录

  • 预备知识
    • 1.字符编码
      • (1)ASCII码
      • (2)Unicode编码
      • (3)Unicode编码的问题
      • (4)UTF-8
      • (5)Little endian(小端存储)和Big endian(大端存储)
    • 2.Windows API
      • (1)基础服务(Base Services)
      • (2)图形设备接口(GDI)
      • (3)图形化用户界面(GUI)
      • (4)通用对话框链接库(Common Dialog Box Library)
      • (5)通用控件链接库(Common Control Library)
      • (6)Windows外壳(Windows Shell)
      • (7)网络服务(Network Services)
  • 实验目的
  • 实验环境
  • 实验内容和步骤
    • 实验步骤
      • 1.使用OD查找参考字符串
      • 2.使用OD查找Windows API

预备知识

1.字符编码

字符串的基本组成单位是字符,而字符在计算机中的表示方法多种多样,字符编码是计算机技术的基石。常用的字符编码包括:

(1)ASCII码

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

(2)Unicode编码

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。
而Unicode编码,是一种所有符号的编码,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码。
Unicode是一个很大的集合,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,也就是说符号的表示可能需要2个字节,更大的符号,可能需要3个字节或者4个字节,甚至更多。

(3)Unicode编码的问题

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

(4)UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。可以说,UTF-8是Unicode编码的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

(5)Little endian(小端存储)和Big endian(大端存储)

以汉字“严”为例,Unicode编码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

2.Windows API

API(Application Programming Interface),即应用程序编程接口。简单的说,就是Windows为了方便程序员开发Windows应用程序,而为程序员们提供的各种各样的系统调用函数(基本服务、组件服务、用户界面服务、图形多媒体服务、消息和协作、网络、Web服务等)。

(1)基础服务(Base Services)

提供以下API:对Windows系统可用的基础资源的访问接口。比如:文件系统(file system)、外部设备(device)、进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些API位于16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统程序中;以及32位Windows下的 kernel32.dll和advapi32.dll动态链接库中。

(2)图形设备接口(GDI)

提供以下API:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe系统程序中;以及32位Windows下的gdi32.dll动态链接库中。

(3)图形化用户界面(GUI)

提供以下API:创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些API位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。

(4)通用对话框链接库(Common Dialog Box Library)

提供以下API:为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被归类为User Interface API之下。

(5)通用控件链接库(Common Control Library)

提供以下API:为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。它被归类为User Interface API之下。

(6)Windows外壳(Windows Shell)

提供以下API:作为Windows API的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在shlwapi.dll中)。

(7)网络服务(Network Services)

提供以下API:为访问操作系统提供的多种网络功能提供API接口。它包括NetBIOS、Winsock、NetDDE及RPC等。

实验目的

通过本实验熟悉通过Ollydbg查找参考字符串和API调用。

实验环境

一台Windows 7系统电脑;实验工具Ollydbg 1.10汉化版、2.01原版。

实验内容和步骤

实验步骤

1.使用OD查找参考字符串

用OD打开CLINE95.EXE测试程序。

观察OD左下角信息提示窗口中的提示信息与OD右下角状态窗口中的信息,单击Shift+F9忽略程序异常,直到提示信息为“程序入口点”,说明OD已经进入需要调试的程序CLINE95.EXE的代码了。

此时单击F9运行CLINE95.EXE程序,可以看到主界面如下:

可以看到CLINE95.EXE程序的主界面有很多英文字符串(例如Command Line95、Version 1.0、Joshua Seales等等),本书目标就是学会使用OD来查找这些字符串,并利用这些字符串来帮助理解整个程序的程序逻辑。最终掌握了整个程序的逻辑之后,就可以利用OD来更改程序的逻辑,以达到想要的目的(功能破解、注册破解、打补丁、加入恶意代码等等)。
回到OD的CPU窗口,现在使用OD来查看CLINE95.EXE这个程序中的参考字符串。在OD的CPU窗口,右键单击选择[查找]–[所有参考文本字串]。在弹出来的参考窗口中可以清楚的看到CLINE95.EXE这个程序的所有参考字符串。


通过双击参考窗口中的字符串(或者在指定的字符串处按回车键),即可以在CPU窗口中的反汇编处跟踪到相应字符串。这样的话整个程序的逻辑,就有了大致的了解。

例如选择跟踪字符串“CLine95 WinName”,可以通过右键单击CPU窗口中反汇编代码指定字符串的那一行代码,选择[数据窗口中跟随]–[立即数]。

回到CLINE95.EXE的主界面中,单击按钮REGISTER进行注册。在弹出来的注册窗口中,随便写上注册名:123,注册号:123,来看看程序会有怎样的判定!

CLINE95.EXE弹出了错误消息框!提示注册码无效!下面来试试查找一下错误消息(“Sorry, that is an invalid registration code”)的字符串,在参考窗口中右键单击[查找文本],输入“sorry”(这里只进行模糊搜索,输入sorry即可,并且忽略大小写来进行搜索,若要精确搜索,则要输入更精确的字符串)。

在参考窗口中查找到“Sorry, that is an invalid registration code”字符串后,可以双击字符串在CPU反汇编窗口中进行跟踪。在这里,看到了引用“Sorry, that is an invalid registration code”字符串的程序代码(其实这是一个典型的消息框API函数)。

2.使用OD查找Windows API

Windows API成千上万,不必通晓每一个,只要知道在逆向工程中用的比较多的。通常有文件访问、进程/线程有关、GUI图形用户界面、对话框、异常处理机制有关。
用OD重新载入CLINE95.EXE程序,快捷键Shift+F9至运行状态。在CPU窗口中右键单击[查找]-[当前模块中的名称],就可以看到当前正在调试的程序所调用的API。


如果在CPU窗口中右键单击[查找]-[所有模块中的名称],就可以看到加载进内存的所有模块所调用的API。在弹出来的[所有名称]窗口中,可以输入API函数名来查找特定API函数。
为了缩小搜索范围,在当前模块中搜索API。在CPU窗口中右键单击[查找]-[当前模块中的名称]。例如搜索MessageBoxA,就在[模块名称]的窗口中输入messageboxa(注意此时窗口标题的字符串变化),定位到MessageBoxA后,可以右键单击该API-[查找输入函数参考]来显示CLINE95.EXE中所有调用该API的代码片段地址。

Ollydbg之字符串、WindowsAPI搜索相关推荐

  1. mysql替换开头_如何在MySQL的字符串开头搜索和替换特定字符?

    为此,您可以使用INSERT().让我们首先创建一个表-mysql> create table DemoTable -> ( -> ZipCode varchar(200) -> ...

  2. 外挂学习之路(12)--- 用CE搜索字符串和搜索字符数组的区别

    用VS2008写个小工程做测试,得到如下一些结论 代码如下: TCHAR test[50] = TEXT("你好啊"); void CasciiDlg::OnBnClickedBu ...

  3. Python中的字符串(搜索和替换、对齐、统计、分离和连接)

    1.字符串的搜索和替换 s = 'hello world hello'#find找到子串,并返回最小的索引print(s.find('hello'))print(s.find('world'))#rf ...

  4. 在一个字符串中搜索某个特定的字符值

    //在一些字符串中搜索某个特定的字符值 int FindString(char **strings, char value)//strings是一个指向指针数组的指针,value是我们所查找的字符值 ...

  5. c 语言字符串查找替换,c ++ - 如何在标准字符串中搜索/查找和替换?

    c ++ - 如何在标准字符串中搜索/查找和替换? 有没有办法用std::string中的另一个字符串替换所有出现的子字符串? 例如: void SomeFunction(std::string&am ...

  6. 【算法】字符串近似搜索(转)

    来源:.Net.NewLife.需求:假设在某系统存储了许多地址,例如:"北京市海淀区中关村大街1号海龙大厦".用户输入"北京 海龙大厦"即可查询到这条结果.另 ...

  7. python 字符串的搜索匹配与替换(详细)

    文章目录 Python 内的正则使用基础 正则修饰符的使用 python 里的反向引用.捕获 需求:单次匹配字符串 `re.match()` 函数 `re.fullmatch()` 函数 `re.se ...

  8. Leetcode系列-字符串-单词搜索II

    单词搜索II理解与分析 题目大意(原题参见leetcode官网) 给定一个单词列表和二维字符网格,找到网格中所有存在于单词列表中的单词并返回.单词与网格中都只包含小写字母. 解题思路 方法一(效率低, ...

  9. python大写字母怎么表示_python – 如何在字符串中搜索大写字母并返回带有和不带大写字母的单词列表...

    我的家庭作业是编写一个程序,从用户读取一个字符串,并从输入中创建一个单词列表.创建两个列表,一个包含至少包含一个大写字母的单词和一个包含其中一个单词的单词.包含任何大写字母. 使用单个for循环打印出 ...

  10. 小甲鱼 OllyDbg 教程系列 (五) : 破解 PC Surgeon 之 查找字符串

    https://www.bilibili.com/video/av6889190/?p=11 https://www.bilibili.com/video/av6889190/?p=12 程序下载地址 ...

最新文章

  1. mscoreei.dll没有被指定在windows上运行_windows注册表详解
  2. eureka服务注册yml配置
  3. 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)...
  4. 2017广东工业大学程序设计竞赛决赛:G. 等凹数字(数位DP)
  5. 注:以前我的博客,因为丢了用户名和口令,无法使用,声明作废;现转于此。...
  6. Context 使用不当造成内存泄露
  7. c语言编程编写笑脸,用C语言编写笑脸游戏.doc
  8. c语言网格搜索,使用逻辑回归时怎么利用网格搜索来查找degree,c等超参数
  9. 博弈论数据可用性声明_手机数据恢复,低调使用~
  10. AspUpload中文手册及语法
  11. 2021-05-23 自学Java第三天 唉 怎么感觉自制力不是很强啊 感觉有些慢了 慢慢来吧
  12. PID控制器原理概述
  13. 微信支付提示微信登录失败:redirect_uri域名与后台配置不一致,错误码:10003
  14. 爱思服务器能不能更新苹果手机系统,苹果手机系统升级带来的利和弊,你知道多少?...
  15. 蓝桥杯刷题,第四界省赛B组
  16. 基于java的图书馆借阅管理系统设计(含源文件)
  17. Unity检测IOS刘海屏
  18. 干货!使用Geotools解析shap数据实例
  19. Excel如何将阿拉伯数字转为中文数字
  20. 传输层 TCP UPD 应用场景

热门文章

  1. 用Excel也能制作PS,今天就让你涨涨见识!
  2. 获取手机设备的mac地址
  3. 转摘--Dism 编辑Windows WIM 文件
  4. 域名网址被微信屏蔽的解决方案微信域名网址被屏蔽了红了如何继续使用
  5. 前后端分离整合阿里云OSS图片上传功能
  6. 国内手机号码11位的原因
  7. 在线教育凛冬将至!强敌环伺的尚德机构,能否突出重围?
  8. 远程过程调用失败而且未执行怎么办
  9. thymeleaf模板引擎即时生效的问题
  10. 线性代数 --- Gauss消元的部分主元法和完全主元法(补充)