如何打造绿色版Python

我们要修改的地方就是这里了, 修改采用了IDA7绿色版中 微笑一刀 的Patch方法


替换代码X64为

X32替换后为

调用的指令如下

另一份放在python27目录里的python27.dll, 取目录部分改为, 是为了使用pip

32位下的修改要注意原有替换指令部分的重定位表对指令的影响还有我们增加的代码中, 对API调用的需要增加重定位表项, 并修正 IMAGE_DATA_DIRECTORY 中 BaseRelocationTable 的大小… Read More

用jadx批量反编译jar

因工作中需要反编译大量jar, 因此写了下面的Python脚本, 将Jar放到一个目录里, 即可批量反编译
脚本如下

# -*- coding: utf-8 -*-
import os
import subprocess

def de_jar(dir_1):
    # 列出文件夹下所有的目录与文件
    dirlist = os.listdir(dir_1)
    for i in range(0,len(dirlist)):
        path = os.path.join(dir_1,dirlist[i])
        if os.path.isfile(path):
            #你想对文件的操作
            subprocess.call("jadx -d out " + path, shell=True)
        elif os.path.isdir(path):
            de_jar(path)


de_jar("E:/src")
Read More

Github 提示 Permission denied (publickey)

在拉取一个Git仓库时, 因为项目包含了一个submodule结果,在拉取submodule时提示

Permission denied (publickey).

查看了网络上的不少文章, 是因为没有生成SSH 密钥的问题
用以下命令生成密钥:

ssh-keygen -t rsa -C "your_github_account"

运行命令后会让输入保存位置与问密码, 我们这里不设置密码, 直接什么也不输入按三次回车
看到
The key's randomart image is:
+---[RSA 2048]----+
| . |
| o o . |
| . + o + + |
| o . o X o |
| . S … Read More

AndroidKiller 反编译卡在【正在提取 APK 源码】的原因与解决方法

经常碰到一些APK卡在 反编译APK源码 这一步, 经过调试发现是rtl230库中Zip提取代码的问题.
有些新的APK文件的压缩包中的最后修改时间与日期值为0, 而这将导致Zip提取的类库异常
这二个值为0将导致 rtl230中 System::Sysutils::EncodeDate 抛出异常, 于是卡死在这一步.
解决方法

未补丁前:

补丁为如下一个正常的日期时间值.
现在可以正常反编译了
Read More

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

WordPress 首页文章内容长度控制

方法1:
更改 wp-content/themes/模板/index.php 找到

the_content('阅读全文');

更改为:

if (!is_single()){
the_excerpt();
}else{
the_content('阅读全文');
}

更改 wp-content/themes/模板/functions.php 在最后加入以下代码

function new_excerpt_length($length) {
return 500;
}
add_filter('excerpt_length', 'new_excerpt_length');

function new_excerpt_more($more) {
global $post;
return '<a href="'.get_permalink($post->ID). '"> [阅读全文]</a>';
}
add_filter('excerpt_more', 'new_excerpt_more');

这样更改后的首页文章没有了任何格式, 可以配合如 Advanced Excerpt 这类摘要插件
显示完整信息… Read More

IDA7 暗黑配色

[DISASM]
000000 //
aaaaaa //Default color
f3c5ff //Regular comment
7e6082 //Repeatable comment
666666 //Automatic comment
ffffff //Instruction
b9ebeb //Dummy Data Name
b9ebeb //Regular Data Name
bbecff //Demangled Name
c0c0c0 //Punctuation
00d269 //Char constant in instruction
00ff00 //String constant in instruction
3250d2 //Numeric constant in instruction
4646ff //Void operand
7faaff //Code … Read More

IDA 插件

IFL, the Interactive Functions List  改进的函数列表插件
https://github.com/hasherezade/ida_ifl
配合IDA 暗色主题可修改颜色为

_COLOR_HILIGHT_FUNC = 0x663333 #FFDDBB # BBGGRR
_COLOR_HILIGHT_REFTO = 0x336633 #BBFFBB
_COLOR_HILIGHT_REFFROM = 0x663366 #DDBBFF

def _displayBackground(self, row, col):
func_info = self.function_info_list[row]
if col == self.COL_START or col == self.COL_END:
return QtGui.QColor("darkcyan")
if col == self.COL_NAME:
if func_info.is_import:
return QtGui.QColor("darkred")
return QtGui.QColor("sienna")

Read More

Arm汇编中!和^的作用

如果加上!,表明先根据寻址规则修改寄存器,然后根据寄存器中的值访问内存;如果不加!,表示直接根据寻址规则访问内存。

看个例子

ldmia r0, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值不变。
ldmia r0!, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值变化(为r3内容的地址)。

感叹号的作用就是r0的值在ldm过程中发生的增加或者减小最后写会到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}  (操作了八个寄存器)
ldmfd sp!, {r0-r6, pc}^ (此项操作实际操作了9个寄存器,spsr->cpsr)
^:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用在异常返回的时候。… Read More

ARM 堆栈方式

满堆栈(Full Stack,“F”)是指Sp指向堆栈最后一个压入的数据(也就是sp指向堆栈最后一个数据项位置)。

空堆栈(Empty Stack,"E")是指sp指向堆栈下一个将要放入数据的空位置时(也就是说sp指向堆栈最后一个数据项的下一个位置)。

存储器堆栈可以分为两种:

一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。

这样,就有四种组合:满递增(FA)、空递增(EA)、满递减(FD)、空递减(ED)。

入栈规律:

(1)满堆栈操作先调整SP,然后存入数据。

(2)空堆栈操作先存入数据,然后调整SP。

(3)递增堆栈调整SP时,执行SP=SP+4

(4)递减堆栈调整SP时,执行SP=SP-4

出栈规律 正好与入栈相反,也就是入栈的逆操作。

(1)空堆栈操作先调整SP,然后存入数据。

(2)满堆栈操作先存入数据,然后调整SP。

(3)递减堆栈调整SP时,执行SP=SP+4

(4)递增堆栈调整SP时,执行SP=SP-4

 

例1:

PRE
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014

STMFD sp!, {r1, r4}

POST
r1 = 0X00000002
r4 = 0x00000003
sp = … Read More