帖子地址:http://www.52pojie.cn/thread-349696-1-1.html
看了第一课做的笔记
识别壳版本号
载入OD 来到OEP 直接点jmp 点几下就看到call 显示壳的版本
00585509 ? E8 1C000000 call Test_se.0058552A ; PUSH ASCII "Safengine Shielden v2.3.4.0"
ctrl+B搜索字符串
RegQueryValueExA
或者直接搜索2进制
52 65 67 51 75 65 72 79 56 61 6C 75 65 45 78 41 00
搜到的结果有2个 搜索到有call 和jmp的那个
检索一个已打开的注册表句柄中,指
定的注册表键的类型和设置值。
返回值
Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
参数表
参数 类型及说明
HKEY hKey,//一个已打开项的句柄,或者指定一个标准项名
LPCTSTR lpValueName,//要获取值的名字,注册表键的名字
LPDWORD lpReserved,//未用,设为零
LPDWORD lpType,//用于装载取回数据类型的一个变量
LPBYTE lpData,//用于装载指定值的一个缓冲区
LPDWORD lpcbData,//用于装载lpData缓冲区长度的一个变量。 //一旦返回,它会设为实际装载到缓冲区的字节数
lpValueName 指向要查询值的名字的字符串(以空字符结束)。
如果lpValueName是NULL或一个空字符串(""),这个函数找回这个键的未命名或默认值的类型和数据。 Windows 95和Windows 98: 每个键有一个默
认值(最初的不包含数据)。在Windows 95,默认值类型总是REG_SZ。在Windows 98,默认键的类型最初是REG_SZ,但可以通过RegSetValueEx指定
一个默认值为不同的类型。 Windows NT: 键不能自动拥有一个未命名或默认的值,未命名的值可以是任何类型。
lpReserved 保留,必须是NULL.
一路点jmp 记录好最后一个jmp 在这个jmp addr上下断点
004BBE34 . /E9 76010000 jmp Test_se.004BBFAF
单步走几下来到没有VM的代码
运行一次后记录SystemBiosVersion地址
0012DF40 0012E4EC ASCII "SystemBiosVersion"
SystemBiosVersion地址 0012E4EC
再运行2次
在hex 数据窗口处记录
00 00 00 00 后的地址
该地址为当前机器的机器码
SN_addr 0012E520
当前机器码 hex D7 E2 CA B5 00 08 01 00 C3 06 03 00 00 01 02 03 04 05 06 07 AD 0D 5D 27 54 45 DF FD
然后计算偏移 SystemBiosVersion地址-SN_addr=34
上面数据记录好后 重新加载软件 让软件断在jmp那里
然后下一个内存断点在机器码的地址,因为我们要找时机把他获取到本机的机器码换成原来那个授权机器码
在机器码最后一位数上下内存访问断点 因为最后一位下断点可以使机器码全部获取出来 然后进行替换
机器码地址出现自己机器码的hex数据后,自己单步走几下 找地址进行patch补丁
补充
刚才看了几个关于SE的教程 发现了SE壳所调用的api都是自己生成的地址,然后自己调用
证明直接下api断点是没用的,就是断下来 都不是se壳调用的api
例如上面的RegQueryValueExA这个API断点 他是自己开地址来进行调用的
上面的图片注意看地址,都是同一个api,但是一个是系统领空的,一个是程序领空