常见断点设置
本帖最后由 雅熙; 于 2014-11-18 15:26 编辑暴力逆向的一般流程
1、有壳者自然得先脱壳
2、试注册看看有何提示,让我们抓抓小尾巴
3、若有提示,用OD动态调试器或者是W32静态调试器查找错误提示
4、来到错误提示处分析代码找关键CALL、关键跳!
5、修改代码
6、复制保存!
如果没有提示,我们可以使用很多断点来完成这些操作
现今软件的保护方式有
1、序列号保护方式(注册码=f(机器码/序列号))
2、警告(NAG)窗口
3、时间限制/次数限制。。
4、菜单功能限制
5、Key File保护
6、CD-Check
7、只运行一个实例
一些软件通过把注册码保存在.ini文件、注册表、.dat文件等等方式进行注册验证
常见断点设置
字符串
bp GetDlgItemTextA(W) ****
bp GetDlgItemInt
bp GetWindowTextA(W) ****
bp GetWindowWord
bmsg XXXX wm_gettext
对话框
bp MessageBeep
bp MessageBoxA(W) ****
bp MessageBoxExA(W)
bp DialogBoxParamA(W)
bp GreateWindowExA(W)
bp ShowWindow
bp UpdateWindow
bmsg XXXX wm_command
对于VB的程序用bp MessageBoxA是无法断下来的,bp rtcMsgBox
注册表相关
bp RegCreateKeyA(W)
bp RegDeleteKeyA(W)
bp RegQueryValueA(W)
bp RegCloseKey
bp RegOpenKeyA(W) ****
时间相关
bp GetLocalTime
bp GetFileTime
bp GetSystemtime
CD-ROM或磁盘相关
bp GetFileAttributesA(W)
bp GetFileSize
bp GetDriveType
bp GetLastError
bp ReadFile
bpio -h (CD-ROM端口地址) R
软件狗
bpio -h 278R
bpio -h 378R
INI初始化文件相关
bp GetPrivateProfileStringA****
bp GetPrivateProfileInt
bp WritePrivateProfileString
bp WritePrivateProfileInt
文件访问相关
bp ReadFile
bp WriteFile
bp CreateFileA****
bp SetFilePointer
bp GetSystemDirectory
另外还有一类软件通过网络验证、重启验证来判断程序是否注册
当然前者一般应用于FZ程序上较多,一般是改网络验证为本地验证达到欺骗远程网络主机的目的达到通过验证!
后者也是很常见的,他一般把用户输入的注册码直接或者是通过加密运算后得到的数值保存到文件、注册表中,然后提示用户重启验证是否注册,当然当你重新打开程序的时候他会从文件或者是注册表中读取用户输入的注册码,再通过程序注册算法来进行比照,正确者当然就成为正版,错误的自然就88了,另外以重启验证的软件一般是把注册码保存在注册表或文件中!
下面来说说解决这类软件的一般方法!
重启验证类软件大致的验证过程。
1、运行软件输入注册信息,点注册后。一般软件会提示你重新运行软件,以便验证注册信息的正确性(如FlashGet);
也有的只在你输入正确的注册信息时才有这个提示,不然会告诉你输入的注册信息有问题(此软件就属这类)
2、要逆向这种软件,首先是判断一下她把注册信息存在哪里(因为她重启验证时要用)。大致有两种存放方式,第一种是放在注册表里;第二种是放在文件里。(我们可以在输入注册信息,点击确定前,利用监视类软件来查看一下,如FileMon和RegShot等)
3、知道她的注册信息的存放地点后,就可以选则相应的API断点,来调试了
实在找不到断点可以试下面的方法:
bmsg handle wm_gettext
bmsg handle wm_command
拦截窗口:
bpx CreateWindow 创建窗口
bpx CreateWindowEx(A/W) 创建窗口
bpx ShowWindow 显示窗口
bpx UpdateWindow 更新窗口
bpx GetWindowText(A/W) 获取窗口文本
bpx SetWindowText(A/W) 设置窗口文本 (本人所加)
拦截消息框:
bpx MessageBox(A/W) 创建消息框
bpx MessageBoxExA(W) 创建消息框
bpx MessageBoxIndirect(A/W) 创建定制消息框
拦截警告声:
bpx MessageBeep 发出系统警告声
拦截对话框:
bpx DialogBox 创建模态对话框
bpx DialogBoxParam(A/W) 创建模态对话框
bpx DialogBoxIndirect 创建模态对话框
bpx DialogBoxIndirectParam(A/W) 创建模态对话框
bpx CreateDialog 创建非模态对话框
bpx CreateDialogParam(A/W) 创建非模态对话框
bpx CreateDialogIndirect 创建非模态对话框
bpx CreateDialogIndirectParam(A/W) 创建非模态对话框
bpx GetDlgItemText(A/W) 获取对话框文本
bpx GetDlgItemInt 获取对话框整数值
拦截剪贴板:
bpx GetClipboardData 获取剪贴板数据
拦截注册表:
bpx RegOpenKey(A/W) 打开子健
bpx RegOpenKeyExA(W) 打开子健
bpx RegQueryValue(A/W) 查找子健
bpx RegQueryValueEx(A/W) 查找子健
bpx RegSetValue(A/W) 设置子健
bpx RegSetValueEx(A/W) 设置子健
功能限制拦截断点:
bpx EnableMenuItem 禁止或允许菜单项
bpx EnableWindow 禁止或允许窗口
bmsg hMenu wm_command 拦截菜单按键事件,其中hMenu为菜单句柄
bpx K32Thk1632Prolog
拦截时间:
bpx GetLocalTime 获取本地时间
bpx GetSystemTime 获取系统时间
bpx GetFileTime 获取文件时间
bpx GetTickCount 获得自系统成功启动以来所经历的毫秒数
bpx GetCurrentTime 获取当前时间(16位)
bpx SetTimer 创建定时器
bpx TimerProc 定时器超时回调函数
拦截文件:
bpx CreateFileA(W) 创建或打开文件 (32位)
bpx OpenFile 打开文件 (32位)
bpx ReadFile 读文件 (32位)
bpx WriteFile 写文件 (32位)
bpx _lcreat 创建或打开文件 (16位)
bpx _lopen 打开文件 (16位)
bpx _lread 读文件 (16位)
bpx _lwrite 写文件 (16位)
bpx _hread 读文件 (16位)
bpx _hwrite 写文件 (16位)
拦截驱动器:
bpx GetDrivetype(A/W) 获取磁盘驱动器类型
bpx GetLogicalDrives 获取逻辑驱动器符号
bpx GetLogicalDriveStringsA(W) 获取当前所有逻辑驱动器的根驱动器路径
拦截狗:
bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口
访问注册表类常用API
bp RegOpenKeyA打开一个现有的注册表项****
bp RegOpenKeyExA打开一个现有的注册表项 ****
bp RegCreateKeyA 在指定的项下创建或打开一个项
bp RegCreateKeyExA 在指定项下创建新项的更复杂的方式
bp RegDeleteKeyA 删除现有项下方一个指定的子项
bp RegDeleteValueA 删除指定项下方的一个值
bp RegQueryValueA 获取一个项的设置值
bp RegQueryValueExA 获取一个项的设置值
bp RegSetValueA 设置指定项或子项的值
bp RegSetValueExA 设置指定项的值
bp RegCloseKey 关闭系统注册表中的一个项(或键)
访问文件类常用API
bp CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台****
bp OpenFile 这个函数能执行大量不同的文件操作
bp ReadFile 从文件中读出数据
bp ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
注意:VB程序仍然可以使用普通API函数,只要函数"最终"CALL了这个函数
bpx msvbvm60!rtcMsgBox
bpx msvbvm60!__vbaStrCmp
bpx msvbvm60!__vbaStrComp
bpx msvbvm60!__vbaStrCompVar
bpx msvbvm60!__vbaStrTextCmp
bpx msvbvm60!__vbaFileOpen
bpx msvbvm60!__vbaInputFile
bpx msvbvm60!__vbaFileSeek
bpx msvbvm60!__vbaWriteFile
bpx msvbvm60!__vbaFileClose
bpx msvbvm60!rtcFileAttributes
bpx msvbvm60!rtcFileDateTime
bpx msvbvm60!rtcFileLen
bpx msvbvm60!rtcFileLength
bpx msvbvm60!__vbaVarInt
bpx msvbvm60!__vbaVarCmpGe
bpx msvbvm60!__vbaVarCmpGt
bpx msvbvm60!__vbaVarCmpLe
bpx msvbvm60!__vbaVarCmpLt
bpx msvbvm60!__vbaVarCmpNe
bpx msvbvm60!__vbaVarTextCmpEq
bpx msvbvm60!__vbaVarTextCmpGe
bpx msvbvm60!__vbaVarTextCmpGt
bpx msvbvm60!__vbaVarTextCmpLe
bpx msvbvm60!__vbaVarTextCmpLt
bpx msvbvm60!__vbaVarTextCmpNe
bpx msvbvm60!__vbaVarTextTstEq
bpx msvbvm60!__vbaVarTextTstGe
bpx msvbvm60!__vbaVarTextTstGt
bpx msvbvm60!__vbaVarTextTstLe
bpx msvbvm60!__vbaVarTextTstLt
bpx msvbvm60!__vbaVarTextTstNe
bpx msvbvm60!__vbaVarTstEq
bpx msvbvm60!__vbaVarTstGe
bpx msvbvm60!__vbaVarTstGt
bpx msvbvm60!__vbaVarTstLe
bpx msvbvm60!__vbaVarTstLt
bpx msvbvm60!__vbaVarTstNe
上面的断点对应VB6程序,如果是VB5程序则将msvbvm60改成msvbvm50即可
VB常用的一些函数:
MultiByteToWideChar 将ANSI字符串转换成UNICODE字符
WideCHatToMultiByte 将UNICODE字符转换成ANSI字符
rtcT8ValFromBstr 把字符转换成浮点数
vbaStrCmp 比较字符串(常用断点)
vbaStrComp 字符串比较(常用断点)
vbaStrCopy 复制字符串
StrConv 转换字符串
vbaStrMove 移动字符串
__vbaVarCat 连接字符串
rtcMidCharVar 在字符串中取字符或者字符串!
__vbaLenBstr 取字符串的长度
vbaVarTstNe 变量比较
vbaVarTstEq 变量比较
rtcMsgBox 显示对话框
VarBstrCmp 比较字符串
VarCyCmp 比较字符串
--------------------------------------------------------------------------------
VB3、VB4、VB5程序逆向法宝(将以下内容覆盖Softice中winice.dat文件的对应项):
AF3="^S 30:0 L FFFFFFFF 8B,CA,F3,A6,74,01,9F,92,8D,5E,08;"
AF4="^S 30:0 L FFFFFFFF 56,57,8B,7C,24,10,8B,74,24,0C,8B,4C,24,14,33,C0,F3,66,A7;"
AF5="^S 30:0 L FFFFFFFF FF,75,E0,E8,85,EF,FF,FF,DC,1D,28,10,40,00,DF,E0,9E,75,03;"
跟踪时按ALT+F3、ALT+F4、ALT+F5键(分别对应VB3、VB4、VB5程序),搜寻成功后你将得到一个地址30:????????,然后设置断点"bpx 30:????????",这样可以有效的拦截很多程序的注册码(逆向VB程序记得将VB的DLL库导入Softice)!^_^
★注意:上面所列函数末尾有带"A"的,有带"W"的,有不带后缀的;一般说来,如果函数同时可以有后缀也可以没有后缀(形如:MessageBox(A/W)), 则不带后缀的表示16位的函数(MessageBox),带后缀的(MessageBoxA、MessageBoxW)表示32位的函数;通常优先使用带后缀(A或W)的断点,带A后缀的一般用于WIN9X系统, 而带W后缀的一般用于NT系统;如果函数没有任何后缀,则表示这是个通用的跨平台的API函数。
断点设置API函数原型
-------------------------------------------------------
-------------------------
HWND CreateWindow(
LPCTSTR lpClassName, // 指向注册窗口类名的指针
LPCTSTR lpWindowName, // 指向窗口名的指针
DWORD dwStyle, // 窗口样式
int x, // 窗口水平位置
int y, // 窗口垂直位置
int nWidth, // 窗口宽度
int nHeight, // 窗口高度
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 菜单句柄
HANDLE hInstance, // 应用程序实例句柄
LPVOID lpParam // 指向创建窗口所需的数据
);
返回值:如果成功就返回新窗口的句柄;失败则返回NULL值
-------------------------------------------------------
-------------------------
HWND CreateWindowEx(
DWORD dwExStyle, // 扩展窗口样式
LPCTSTR lpClassName, // 指向注册窗口类名的指针
LPCTSTR lpWindowName, // 指向窗口名的指针
DWORD dwStyle, // 窗口样式
int x, // 窗口水平位置
int y, // 窗口垂直位置
int nWidth, // 窗口宽度
int nHeight, // 窗口高度
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 菜单句柄
HINSTANCE hInstance, // 应用程序实例句柄
LPVOID lpParam // 指向创建窗口所需的数据
);
返回值:如果成功就返回新窗口的句柄;失败则返回NULL值
-------------------------------------------------------
-------------------------
BOOL ShowWindow(
HWND hWnd, // 窗口句柄
int nCmdShow // 窗口显示状态
);
返回值:如果先前的窗口可见就返回非零值;如果先前的窗口
隐藏则返回零值
-------------------------------------------------------
-------------------------
BOOL UpdateWindow(
HWND hWnd // 窗口句柄
);
返回值:如果成功就返回非零值;失败则返回零值
-------------------------------------------------------
-------------------------
int GetWindowText(
HWND hWnd, // 窗口或文本控件句柄
LPTSTR lpString, // 缓冲区地址
int nMaxCount // 最大字符数
);
返回值:如果成功就返回文本长度;失败则返回零值
-------------------------------------------------------
-------------------------
BOOL SetWindowText(
HWND hWnd, // handle of window or control 窗口句
柄
LPCTSTR lpString // address of string 文本指针
);
返回值:如果成功就返回非0;失败则返回零值
-------------------------------------------------------
-------------------------
int MessageBox(
HWND hWnd, // 父窗口句柄
LPCTSTR lpText, // 消息框文本地址
LPCTSTR lpCaption, // 消息框标题地址
UINT uType // 消息框样式
);
返回值:如果失败则返回零值;如果成功,返回值为如下之一
:
IDABORT Abort 按钮被选择
IDCANCEL Cancel 按钮被选择
IDIGNORE Ignore 按钮被选择
IDNO No 按钮被选择
IDOK OK 按钮被选择
IDRETRY Retry 按钮被选择
IDYES Yes 按钮被选择
-------------------------------------------------------
-------------------------
int MessageBoxEx(
HWND hWnd, // 父窗口句柄
LPCTSTR lpText, // 消息框文本地址
LPCTSTR lpCaption, // 消息框标题地址
UINT uType, // 消息框样式
WORD wLanguageId // 语言标识
);
返回值:如果失败则返回零值;如果成功,返回值为如下之一
:
IDABORT Abort 按钮被选择
IDCANCEL Cancel 按钮被选择
IDIGNORE Ignore 按钮被选择
IDNO No 按钮被选择
IDOK OK 按钮被选择
IDRETRY Retry 按钮被选择
IDYES Yes 按钮被选择
-------------------------------------------------------
-------------------------
int MessageBoxIndirect(
LPMSGBOXPARAMS lpMsgBoxParams // 消息框参数结构地址
);
返回值:如果失败则返回零值;如果成功,返回值为如下之一
:
IDABORT Abort 按钮被选择
IDCANCEL Cancel 按钮被选择
IDIGNORE Ignore 按钮被选择
IDNO No 按钮被选择
IDOK OK 按钮被选择
IDRETRY Retry 按钮被选择
IDYES Yes 按钮被选择
-------------------------------------------------------
-------------------------
BOOL MessageBeep(
UINT uType // 声音类型
);
声音类型:
0xFFFFFFFF Standard beep using the computer speaker
MB_ICONASTERISK SystemAsterisk
MB_ICONEXCLAMATION SystemExclamation
MB_ICONHAND SystemHand
MB_ICONQUESTION SystemQuestion
MB_OK SystemDefault
返回值:如果成功就返回文本长度;失败则返回零值
-------------------------------------------------------
-------------------------
int DialogBox(
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpTemplate, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc // 对话框处理函数指针
);
返回值:如果成功就返回nResult参数,用于EndDialog结束对
话框;失败则返回-1
-------------------------------------------------------
-------------------------
int DialogBoxParam(
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpTemplateName, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc, // 对话框处理函数指针
LPARAM dwInitParam // 初始化值
);
返回值:如果成功就返回nResult参数,用于EndDialog结束对
话框;失败则返回-1
-------------------------------------------------------
-------------------------
int DialogBoxIndirect(
HINSTANCE hInstance, // 应用程序实例句柄
LPDLGTEMPLATE lpTemplate, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc // 对话框处理函数指针
);
返回值:如果成功就返回nResult参数,用于EndDialog结束对
话框;失败则返回-1
-------------------------------------------------------
-------------------------
int DialogBoxIndirectParam(
HINSTANCE hInstance, // 应用程序实例句柄
LPCDLGTEMPLATE lpTemplateName, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc, // 对话框处理函数指针
LPARAM dwInitParam // 初始化值
);
返回值:如果成功就返回nResult参数,用于EndDialog结束对
话框;失败则返回-1
-------------------------------------------------------
-------------------------
int CreateDialog(
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpTemplate, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc // 对话框处理函数指针
);
返回值:如果成功就返回对话框句柄;失败则返回NULL
-------------------------------------------------------
-------------------------
int CreateDialogParam(
HINSTANCE hInstance, // 应用程序实例句柄
LPCTSTR lpTemplateName, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc, // 对话框处理函数指针
LPARAM dwInitParam // 初始化值
);
返回值:如果成功就返回对话框句柄;失败则返回NULL
-------------------------------------------------------
-------------------------
int CreateDialogIndirect(
HINSTANCE hInstance, // 应用程序实例句柄
LPDLGTEMPLATE lpTemplate, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc // 对话框处理函数指针
);
返回值:如果成功就返回对话框句柄;失败则返回NULL
-------------------------------------------------------
-------------------------
int CreateDialogIndirectParam(
HINSTANCE hInstance, // 应用程序实例句柄
LPCDLGTEMPLATE lpTemplateName, // 对话框模板指针
HWND hWndParent, // 父窗口句柄
DLGPROC lpDialogFunc, // 对话框处理函数指针
LPARAM dwInitParam // 初始化值
);
返回值:如果成功就返回对话框句柄;失败则返回NULL
-------------------------------------------------------
-------------------------
UINT GetDlgItemText(
HWND hDlg, // 对话框句柄
int nIDDlgItem, // 控件标识
LPTSTR lpString, // 文本缓冲区指针
int nMaxCount // 最大字符数
);
返回值:如果成功就返回文本长度;失败则返回零值
-------------------------------------------------------
-------------------------
UINT GetDlgItemInt(
HWND hDlg, // 对话框句柄
int nIDDlgItem, // 控件标识
BOOL *lpTranslated, // 接收成功/失败指示的指针
BOOL bSigned // 指定是有符号数还是无符号数
);
返回值:如果成功,lpTranslated被设置为TRUE,返回文本对
应的整数值;如果失败,lpTranslated被设置为FALSE,返回值
为零
-------------------------------------------------------
-------------------------
HANDLE GetClipboardData(
UINT uFormat // 剪贴板格式
);
返回值:如果成功就返回剪贴板对象的句柄;失败则返回NULL
-------------------------------------------------------
-------------------------
LONG RegOpenKey(
HKEY hKey, // 要打开的主键句柄
LPCTSTR lpSubKey, // 要打开的子键名地址
PHKEY phkResult // 存放打开子键句柄的地址
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
LONG RegOpenKeyEx(
HKEY hKey, // 要打开的主键句柄
LPCTSTR lpSubKey, // 要打开的子键名地址
DWORD ulOptions, // 保留,必须为0
REGSAM samDesired, // 存取掩码
PHKEY phkResult // 存放打开子键句柄的地址
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
LONG RegQueryValue(
HKEY hKey, // 需要查找的主键的句柄
LPCTSTR lpSubKey, // 需要查找的子键名地址
LPTSTR lpValue, // 存放结果的缓冲区地址
PLONG lpcbValue // 存放返回结果字节长度的缓冲区地址
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
LONG RegQueryValueEx(
HKEY hKey, // 需要查找的主键的句柄
LPTSTR lpValueName, // 需要查找的子键名地址
LPDWORD lpReserved, // 保留,必须为NULL.
LPDWORD lpType, // 存放子键类型的缓冲区地址
LPBYTE lpData, // 存放返回结果的缓冲区地址
LPDWORD lpcbData // 存放返回结果字节长度的缓冲区地址
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
LONG RegSetValue(
HKEY hKey, // 需要设置键值的主键句柄
LPCTSTR lpSubKey, // 需要设置的子键名地址
DWORD dwType, // 键值类型
LPCTSTR lpData, // 所设置的数据地址
DWORD cbData // 所设置的数据字节长度
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
LONG RegSetValueEx(
HKEY hKey, // 需要设置键值的主键句柄
LPCTSTR lpValueName, // 需要设置的子键名地址
DWORD Reserved, // 保留,必须为0
DWORD dwType, // 键值类型
CONST BYTE *lpData, // 所设置的数据地址
DWORD cbData // 所设置的数据字节长度
);
返回值:如果成功就返回ERROR_SUCCESS;失败则返回非零错误
代码
-------------------------------------------------------
-------------------------
BOOL EnableMenuItem(
HMENU hMenu, // 菜单句柄
UINT uIDEnableItem, // 菜单项标识
UINT uEnable // 控制标志
);
uEnable的三种有用情况:
MF_DISABLED 禁止
MF_ENABLED 允许
MF_GRAYED 变灰
返回值:返回菜单项以前的状态,如果菜单项不存在就返回
0xFFFFFFFF
-------------------------------------------------------
-------------------------
BOOL EnableWindow(
HWND hWnd, // 窗口句柄
BOOL bEnable // 禁止或允许标志
);
bEnable的两种状态:
TRUE 允许
FALSE 禁止
返回值:如果先前的窗口是禁止状态,则返回非零值;如果先
前的窗口是允许状态,则返回零
-------------------------------------------------------
-------------------------
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime // 存放系统时间结构的地址
);
返回值:无
-------------------------------------------------------
-------------------------
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // 存放系统时间结构的地址
);
返回值:无
-------------------------------------------------------
-------------------------
BOOL GetFileTime(
HANDLE hFile, // 文件句柄
LPFILETIME lpCreationTime, // 存放文件创建时间的地址
LPFILETIME lpLastAccessTime, // 存放文件最后一次存取时
间的地址
LPFILETIME lpLastWriteTime // 存放文件最后一次写的地址
);
返回值:如果成功就返回非零值;失败则返回零
-------------------------------------------------------
-------------------------
DWORD GetTickCount(VOID)
返回值:如果成功就返回自WINDOWS启动以来所经历的毫秒数
-------------------------------------------------------
-------------------------
UINT SetTimer(
HWND hWnd, // 与定时器相关的窗口句柄
UINT nIDEvent, // 定时器标识
UINT uElapse, // 定时间隔,以毫秒为单位
TIMERPROC lpTimerFunc // 定时器超时函数地址
);
返回值:如果成功就返回新定时器的句柄,用于KillTimer结束
定时器;失败则返回零
-------------------------------------------------------
-------------------------
VOID CALLBACK TimerProc(
HWND hwnd, // 与定时器相关的窗口句柄
UINT uMsg, // WM_TIMER 消息
UINT idEvent, // 定时器标识
DWORD dwTime // 由GetTickCount获得的当前系统时间
);
返回值:无
-------------------------------------------------------
-------------------------
HANDLE CreateFile(
LPCTSTR lpFileName, // 要打开的文件名指针
DWORD dwDesiredAccess, // 存取(读-写)模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //
SECURITY_ATTRIBUTES 结构指针
DWORD dwCreationDistribution, // 打开方式
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // GENERIC_READ方式存取的临时文件
句柄
);
返回值:如果成功就返回文件句柄;失败则返回
INVALID_HANDLE_VALUE
-------------------------------------------------------
-------------------------
HFILE OpenFile(
LPCSTR lpFileName, // 要打开的文件名指针
LPOFSTRUCT lpReOpenBuff, // 存放文件信息的缓冲区地址
UINT uStyle // 打开方式
);
返回值:如果成功就返回文件句柄;失败则返回HFILE_ERROR
-------------------------------------------------------
-------------------------
BOOL ReadFile(
HANDLE hFile, // 要读取的文件句柄
LPVOID lpBuffer, // 存放读出数据的缓冲区地址
DWORD nNumberOfBytesToRead, // 要读的字节数
LPDWORD lpNumberOfBytesRead, // 指向读取字节数的地址
LPOVERLAPPED lpOverlapped // OVERLAPPED 结构的地址
);
返回值:如果成功就返回非零值;失败则返回零
-------------------------------------------------------
-------------------------
BOOL WriteFile(
HANDLE hFile, // 要写入的文件句柄
LPCVOID lpBuffer, // 存放写入数据的缓冲区地址
DWORD nNumberOfBytesToWrite, // 写入的字节数
LPDWORD lpNumberOfBytesWritten, // 指向写入字节数的地址
LPOVERLAPPED lpOverlapped // OVERLAPPED 结构的地址
);
返回值:如果成功就返回非零值;失败则返回零
-------------------------------------------------------
-------------------------
HFILE _lcreat(
LPCSTR lpPathName, // 要打开的文件名指针
int iAttribute // 文件属性
);
返回值:如果成功就返回文件句柄;失败则返回HFILE_ERROR
-------------------------------------------------------
-------------------------
HFILE _lopen(
LPCSTR lpPathName, // 要打开的文件名指针
int iReadWrite // 文件存取模式
);
返回值:如果成功就返回文件句柄;失败则返回HFILE_ERROR
-------------------------------------------------------
-------------------------
UINT _lread(
HFILE hFile, // 文件句柄
LPVOID lpBuffer, // 存放读出数据的缓冲区地址
UINT uBytes // 读取的字节数
);
返回值:如果成功就返回实际读取的字节数;失败则返回
HFILE_ERROR
-------------------------------------------------------
-------------------------
UINT _lwrite(
HFILE hFile, // 文件句柄
LPCSTR lpBuffer, // 存放写入数据的缓冲区地址
UINT uBytes // 写入的字节数
);
返回值:如果成功就返回实际写入的字节数;失败则返回
HFILE_ERROR
-------------------------------------------------------
-------------------------
UINT _hread(
HFILE hFile, // 文件句柄
LPVOID lpBuffer, // 存放读出数据的缓冲区地址
UINT uBytes // 读取的字节数
);
返回值:如果成功就返回实际读取的字节数;失败则返回
HFILE_ERROR
-------------------------------------------------------
-------------------------
UINT _hwrite(
HFILE hFile, // 文件句柄
LPCSTR lpBuffer, // 存放写入数据的缓冲区地址
UINT uBytes // 写入的字节数
);
返回值:如果成功就返回实际写入的字节数;失败则返回
HFILE_ERROR
-------------------------------------------------------
-------------------------
UINT GetDriveType(
LPCTSTR lpRootPathName // 根路径地址
);
返回值如下所示之一:
0 无法决定
1 根目录不存在
DRIVE_REMOVABLE 可移动驱动器
DRIVE_FIXED 固定驱动器
DRIVE_REMOTE 远程(网络)驱动器
DRIVE_CDROM CD-ROM 驱动器
DRIVE_RAMDISK RAM disk
-------------------------------------------------------
-------------------------
DWORD GetLogicalDrives(VOID)
返回值:如果失败就返回零值,成功则返回由位掩码表示的当
前可用驱动器:
bit 0 drive A
bit 1 drive B
bit 2 drive C
bit 3 drive D
。。。以此类推
-------------------------------------------------------
-------------------------
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // 缓冲区大小
LPTSTR lpBuffer // 缓冲区地址,如成功则返回结果为如下形
式: c:\\d:\\
);
返回值:如果成功就返回实际的字符数;失败则返回零
几种常用的定位关键代码的方法
一、查找字符串
二、万能断点法
三、F12暂停法
四、下相对应的API断点
标志位逆向
此类典型的汇编代码:
CALL XXXXXXXX
test al,al
je/jnzxxxxxxxx
或者
CALL XXXXXXXX
test ax,ax
je/jnzxxxxxxxx
mov ax,1
retn
xor eax,eax
inc ax
retn
ESP定律与内存断点
(大致内容:)
下载地址:
http://115.com/lb/5lbclpathzcw
经验到手 神帖暴力逆向资料也到手了
不错,收藏了、
感谢楼主整理,学习了
学习了 感谢楼主的经验
这个跟网上都差不多-_-||
楼主继续,咋中途断了啊
帮助别人 发表于 2014-11-18 14:21
楼主继续,咋中途断了啊
正在持续更新{:5_116:}
雅熙; 发表于 2014-11-18 15:26
正在持续更新
努力努力发全,谢谢,谢谢!{:5_116:}
总结的真的很好,常见的差不多都全了