#自动查找函数头并尽可能的识别为函数 def make_function(opcodes, align=1): start_ea = ida_ida.inf_get_min_ea() while (start_ea = 0): procea = idc.find_binary(start_ea, SEARCH_DOWN, opcodes) if (procea == idaapi.BADADDR): break start_ea = procea + 1 if (procea % 2) == align: flags = ida_bytes.get_flags(procea-align) if ida_bytes.is_unknown(flags): ida_auto.auto_make_proc(procea-align) msg("%s: %X\n" % (opcodes, procea-align)) func = ida_funcs.get_func(procea) if func != None:… Read More
Flash地区限定破解
安卓常见运行时函数原型表
Runtime Function: float __addsf3 (float a, float b)
Runtime Function: double __adddf3 (double a, double b)
Runtime Function: long double __addtf3 (long double a, long double b)
Runtime Function: long double __addxf3 (long double a, long double b)
These functions return the sum of a and b.
Runtime Function: float … Read More
IDA 调试条件断点的使用示例
经常在用IDA调试时, 一些断点如文件打开, 或是发送数据会频繁的断下来, 每次断下去查看是不是我们关注的数据, 以此判断来源, 这太费时间, 也常导致程序超时, 正常流程没法继续, 强大的IDA为我们提供了 脚本条件, 可以选择IDC或是Python.
如图:

在断点处右键编辑断点,

点击右边的按钮在输入框中输入脚本即可, 返回False表示不中断
返回 True 断点将激活中断下来. 以此我们还可以在条件中增加msg, 从而实现不中断而显示信息的功能. 下面给出一个示例脚本:
def dumpbytes(pdata, blen): msg("%03d: " % blen) for i in range(blen): msg("%02X " % get_byte(pdata+i)) msg("\n") phead = get_dword(cpu.r1+4) pdata = get_dword(phead) binlen = get_word(phead+4) dumpbytes(pdata, binlen) if (binlen… Read More
安卓调试常用ADB命令
有多个设备时选择其中的某设备
adb -s H066982 shell
//========================================
安装APK
adb install -r r:\1.apk
//========================================
以调试模式启动APP
adb shell am start -D -n hw.helloworld/hw.helloworld.MainActivity
//========================================
列出所有安装应用的包名
adb shell pm list packages
过滤显示
adb shell pm list packages | grep 431
找到apk的位置
adb shell pm path com.tence01.mm
pull出来
adb pull /data/app/com.tence01.mm-1.apk d:\
pull 整个目录
adb … Read More
IDA 协作插件 collabREate Server编译方法
collabREate 用到了Google的GSON模块, 我们要先下载gson-2.8.5.jar
放在 collabREate/server/java 目录下,
打开命令提示符, 进入到 collabREate/server/java 目录
运行如下命令:
mkdir bin
javac -classpath .\gson-2.8.5.jar -d .\bin collabreate\server\*.java
编译后的文件保存在 bin目录下
测试编译的是否可以正常运行
java collabreate.server.ServerManager
将编译的文件打包成jar:
jar -cef collabreate.server.ServerManager collab.jar bin
上面生成的是 服务器管理的jar
将main方法更换为 collabreate.server.CollabreateServer 生成 服务器jar
jar命令为java自带的专用打包工具;
c 代表生成新的jar包;
e 代表可执行的类,亦即main方法所在的类。书写时要加上包名,在本例中是后面的 collabreate.server.ServerManager;
f 代表生成的jar包的名称,在本例中是collab.jar。此包名可以随意命名,没有规定;
bin 最后面的这个参数表示将bin目录下的所有文件都打包放到新的jar包中
IDAPython 脚本用VS PythonTool 调试方法
首先VS要安装PythonTool
然后在Python里安装ptvsd模块: pip install ptvsd
将下面的脚本保存到IDA Plugins目录:
# filename: ptvsd_enable.py
import idaapi
import ptvsd
try:
# Enable the debugger. Raises exception if called more than once.
ptvsd.enable_attach(secret="IDA")
except:
pass
class DebugPlugin(idaapi.plugin_t):
flags = idaapi.PLUGIN_FIX
comment = "PTVSD Debug Enable"
help = "Enable debugging using PTVSD"
wanted_name = "PTVSD"
wanted_hotkey =
… Read More 如何打造绿色版Python
我们要修改的地方就是这里了, 修改采用了IDA7绿色版中 微笑一刀 的Patch方法
替换代码X64为
X32替换后为
调用的指令如下
另一份放在python27目录里的python27.dll, 取目录部分改为, 是为了使用pip
32位下的修改要注意原有替换指令部分的重定位表对指令的影响还有我们增加的代码中, 对API调用的需要增加重定位表项, 并修正 IMAGE_DATA_DIRECTORY 中 BaseRelocationTable 的大小… Read More
AndroidKiller 反编译卡在【正在提取 APK 源码】的原因与解决方法
经常碰到一些APK卡在 反编译APK源码 这一步, 经过调试发现是rtl230库中Zip提取代码的问题.
有些新的APK文件的压缩包中的最后修改时间与日期值为0, 而这将导致Zip提取的类库异常
这二个值为0将导致 rtl230中 System::Sysutils::EncodeDate 抛出异常, 于是卡死在这一步.
解决方法
未补丁前:




COM 知识点摘要
IUnknown接口是COM的核心,所有其他的COM接口都必须从IUnknown继承。
IUnknown实质上就是一个含有纯虚函数的抽象类。
class IUnknown{
public:
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) = 0;
virtual ULONG __stdcall AddRef() = 0;
virtual ULONG __stdcall Release() = 0;
};
COM客户程序要使用COM对象是通过COM库创建而来的,而实际上COM库是调用COM对象的类厂来创建的。COM类厂对象也是一个COM对象,所以它也从IUnknow继承而来,而它又支持IClassFactory接口:
class IClassFactory:public IUnknow
{
public:
virtual HRESULT CreateInstance(IUnkonwn* pUnkOuter, REFIID iid, void** ppObject)=0;
virtual HRESULT LockServer(BOOL fLock)=0;
};
CreateInstance是构造COM对象的函数,通过传入接口的IID,从ppObject输出COM接口指针,而pUnkOuter一般设为NULL,该参数在聚合时起作用。
LockServer是用来控制COM类厂的生命周期的函数,将fLock设为TRUE后,即使组件程序中所有COM对象已释放了,该类厂指针也会一直保存并且有效,当不再需要的时候设为FALSE即可。
若要使用类厂对象去创建COM对象,首先得创建类厂对象,可以使用库函数CoGetClassObject来创建COM类的类厂,若找到的COM对象是进程内组件,则使用DLL导出函数DllGetClassObject函数创建类厂,然后将对象指针传出。… Read More